Błąd z transform: scale and overflow: hidden in Chrome

Pracując z właściwością CSS3 transform: scale znalazłem interesujący problem. Chciałem zrobić mały efekt powiększenia dla zdjęć. Ale kiedy użyłem dla parent div overflow: hidden i border-radius, child div rozszerzył poza parent div.

Update:

Problem nie został rozwiązany. Jeśli dodam transition, to nadal nie działa. Próbowałem rozwiązać ten problem, ale bez powodzenia.

Oto demo

Author: andyb, 2013-05-22

11 answers

To znany błąd w przeglądarkach opartych na Webkit-zobacz #62363. Możesz dodać border:1px solid transparent; do swojej klasy .wrap, Aby obejść problem.

Dla zaktualizowanego wymogu, dodanie przejścia do elementu z border-radius, jest to kolejny znany błąd Chomre / Webkit#157218. Przykro mi, ale nadal nie jest znane ogólne obejście problemu, chociaż jeden komentarz na temat tego błędu mówi, że używanie znacznika chrome://flags i używanie znacznika --ignore-gpu-blacklist naprawia go w Chrome 29(który właśnie trafił na Kanał Chrome dev dzisiaj).

 19
Author: andyb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-24 20:26:37

Przezroczysta obramowanie nie zadziałało dla mnie, ale aby zmienić indeks z .wrap div I obraz pracował (w moim przypadku obraz jest w rzeczywistości wideo)

Oto css:

.videoContainer{
    overflow: hidden;
    z-index: 10;
}

video{
    margin-left: -55%;
    transform: scale(-1,1);
    -webkit-transform: scale(-1,1);
    -moz-transform: scale(-1,1);
    z-index: 0;
}

Uwaga: zobacz poniżej komentarz Jake ' a bluesa dotyczący konieczności posiadania pozycjonowanego elementu umożliwiającego poprawne działanie z-index.

 27
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 16:36:39

transform: translateZ(0); na elemencie zawijania zrobił dla mnie sztuczkę.

Zobacz wydajność CSS względem translateZ (0) aby uzyskać więcej informacji na temat tej techniki.

 23
Author: lefoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:07

Oba sposoby rozwiązania tego emitenta działały dobrze:

  1. Dodaj następującą linię do opakowania nadrzędnego (z-index: 0 nie jest konieczne dla samego obrazu): position: relative; z-index: 10

  2. Lub dodaj transform: translateZ(0); do opakowania nadrzędnego (z odpowiednimi prefiksami dla lepszej obsługi przeglądarki)

 15
Author: Mike Shema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-28 20:48:49

Dzieje się tak, ponieważ złożone warstwy nie są przycinane przez ich warstwy nadrzędne. Czasami więc trzeba doprowadzić rodzica z overflow:hidden na jego własną warstwę kompozytową, aby mógł prawidłowo zastosować overflow:hidden.

Więc musisz dodać właściwość CSS transform: translateZ(0) do elementu nadrzędnego przekształconego elementu.

/* add to parent so it is composited on its own layer before rendering */
.parent-of-transformed-element {
     -webkit-transform:translateZ(0);
     transform:translateZ(0);
}

Wtedy overflow:hidden będzie działać, ponieważ przekształcony element będzie komponowany na własnej warstwie renderującej, tak jak jego przekształcone dziecko.

Testowane na najnowszych Safari i Chrome na urządzeniach z systemem iOS i innych niż iOS]}

 9
Author: Jonathan Marzullo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-16 14:25:30

Oto rozwiązanie .

HTML:

<div class="wrap">
    <div class="image"></div>
</div>

CSS:

.wrap{
    width: 400px;
    height: 260px;
    overflow: hidden;
    border-radius: 15px;
    border:1px solid transparent;
}
div.image{
    background: url(http://blog.dothegreenthing.com/wp-content/uploads/2012/10/take-a-smile.jpg) no-repeat;
    width: 400px;
    height: 260px;


}
div.image:hover{
    -webkit-transform: scale(1.2, 1.2);
    transform: scale(1.2, 1.2);
    cursor: pointer;
    border:1px solid transparent;
}

Chrome potrzebuje przezroczystego border otaczającego pudełko. Mam nadzieję, że to pomoże.

 2
Author: Nitesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 08:41:32

O dziwo właśnie napotkałem ten problem po aktualizacji do Chrome 65 i dla mnie dodanie will-change: transform; do stylów IFRAME załatwiło sprawę.

 2
Author: Yousef Salimpour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 10:18:18

Miałem podobny problem z najnowszą wersją Chrome 65. Mam film iFrame przeskalowany na większe za pomocą transform: scale() w div, a w najnowszej wersji Chrome nie był już zamaskowany po bokach i wyskakiwał z kontenera nadrzędnego, nawet z overflow: hidden;

Podczas translateZ jakby pomógł, to dopiero gdy użyłem translateX na rodzica zamiast to maskuje szerokość poprawnie:

 transform:translateX(0);
 1
Author: dyad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-27 20:47:11

Błąd nadal istnieje w przeglądarkach webkit (Safari i Chrome pod iOS), gdy maska jest skalowana. I wtedy wszystkie obejścia powyżej nie działają. Ale użycie niestandardowej właściwości css -webkit-mask-box-image pomaga również w skalowaniu masek.

 0
Author: paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-07 21:05:26

Szukałam tego od dawna i jedyne, co mi się udało, to to rotate(0.1deg) translateZ(0) . Więc jeśli skalujesz element

.something:hover img{

    -webkit-transform: scale(1.1) rotate(0.1deg) translateZ(0);
    -moz-transform: scale(1.1) rotate(0.1deg) translateZ(0);
    -o-transform: scale(1.1) rotate(0.1deg) translateZ(0);
    transform: scale(1.1) rotate(0.1deg) translateZ(0);

}

Bez obracania poprawka nie działa po mojej stronie.

Jeśli dodasz transform do dowolnego rodzica img ( jak obrócenie kontenera, w którym znajduje się obraz), musisz dodać tę samą poprawkę do elementu, na przykład

.something_parent{
    transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
    -webkit-transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
    -mos-transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
    -o-transform: translate(-9%,9%) rotate(0.1deg) translateZ(0);
}
 0
Author: Benn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-08 21:07:45

Cóż... próba znalezienia obejścia okazało się, że

-webkit-appearance: button; 

Naprawiono to zachowanie, ale ma pewne niepożądane skutki uboczne, jeśli element w rzeczywistości nie jest przyciskiem, jak obramowania zachowujące się dziwnie, ale zastąpienie <a> przez <button> w moim przypadku zachowało skalowaną zawartość w swoich granicach.

 -1
Author: sergio0983,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-12 19:28:45