- Избавляемся от мерцания при CSS-трансформации в Safari
- Translate3D
- Will-Change
- Почему при использовании input range + transform scale дёргается изображение?
- Alexander Borshak
- Избавляемся от мерцания при CSS-трансформации в Safari
- Translate3D
- Will-Change
- Баг при использовании "transform: scale();"
- Ответы (4 шт):
Избавляемся от мерцания при CSS-трансформации в Safari
Не в первый раз замечаю, что при использовании CSS-трансформаций, некоторые элементы на странице в Safari таинственным образом меняют свои свойства. В других браузерах подобное наблюдается значительно реже.
Особенно заметны такие артефакты когда трансформация стоит на псевдоклассе :hover, т.е срабатывают при наведении мыши на элемент. В моём случае увеличение кнопки .btn при наведении на неё мыши, перманентно вызывало изменение типа сглаживания текста в соседних блоках.
Проблема связана с нехваткой ресурсов для рендеринга, и довольно легко лечится.
Translate3D
Самый простой способ решения задачи — это активизация аппаратного ускорения, которое для двухмерной анимации в CSS по умолчанию отключено. Для этого просто создаём пустую 3D-анимацию.
-webkit-transform: translate3d(0,0,0);
Will-Change
В CSS существует относительно новое и пока малоизвестное свойство will-change, которое заранее передаёт браузеру информацию о возможном предстоящем изменении того или иного элемента. Например, если элемент планируется трансформировать, об этом можно предупредить браузер, чтобы он приберёг силы, как говорится. В случае с вышеупомянутой кнопкой, выглядит это так:
Если планируется изменение нескольких параметров, их можно задать последовательно через запятую. Например, для трансформации с изменением прозрачности:
will-change: transform, opacity;
Таким образом, браузер сможет заранее подготовиться к тяжёлой обработке и оптимизировать использование ресурсов. Что позволит избежать появления на странице различных побочных эффектов.
⚡️ Подписывайся на мой канал @DanilinBiz и ты узнаешь, почему фриланс это свобода, а работа в штате рабство.
Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.
Почему при использовании input range + transform scale дёргается изображение?
Написал скрипт, который при нажатии на лупу с плюсом, увеличивает изображение. При нажатии на лупу с минусом, уменьшает изображение. Происходит это так:
$(function() < $('#zoom-plus').click(function () < var $mywidth = $('.images').width(); var $ratio = 1.1; var $newwidth = ($mywidth * $ratio) + 'px'; $('.images').css("width", $newwidth) >); $('#zoom-minus').click(function () < var $mywidth = $('.images').width(); var $ratio = 0.9; var $newwidth = ($mywidth * $ratio) + 'px'; $('.images').css("width", $newwidth) >); >);
Это работает, но если изображение становится больше окна браузера или самого родительского элемента, оно, естественно, позиционируется слева, и его часть уходит за правый край. Необходимо, чтобы изображение всегда центрировалось посередине.
UPD Задачу решил, высчитывая нынешнюю ширину блока и прибавляя отрицательный марджин, который равен половине от разницы в ширине нового размера изображения и родительского элемента.
$(function() < $('#zoom-plus').click(function () < var $mywidth = $('.images').width(); var $ratio = 40; var $newwidth = ($mywidth + $ratio) + 'px'; var $parent = $('.lite-box').width(); var $margin = '-' + (($mywidth + $ratio - $parent) / 2) + 'px'; if ($mywidth < $parent) < $('.images').css("width", $newwidth) >else if ($mywidth == $parent) < $('.images').css("width", $newwidth); $('.images').css("margin-left", $margin) >else if ($mywidth > $parent) < $('.images').css("width", $newwidth); $('.images').css("margin-left", $margin) >else < alert('33') >; >); $('#zoom-minus').click(function () < var $mywidth = $('.images').width(); var $ratio = 40; var $newwidth = ($mywidth - $ratio) + 'px'; var $parent = $('.lite-box').width(); var $margin = '-' + (($mywidth - $ratio - $parent) / 2) + 'px'; if ($mywidth >$parent) < $('.images').css("width", $newwidth); $('.images').css("margin-left", $margin) >else if ($mywidth else <> >); >);
Удобнее получается использовать transform: scale, но есть проблема: при добавлении transition, изображение начинает дёргаться, если медленно перемещать ползунок. Посмотрите сами:
Простой 3 комментария
Alexander Borshak
Делая кое-какую работу по сайту http://inventive.ru/ заметил неприятную вещь — слайдер с эффектом Кена Бёрнса, что на главной, который я когда-то делал, в Firefox почему-то начал увеличивать картинки рывками. Зрелище было не из приятных. А вот в Хроме, к примеру, по прежнему все было ОК, то есть плавная анимация, как и положено.
Чтобы было понятно о чем я говорю, я оставил данный эффект у себя на тестовой площадке - http://layouts.borshak.com/inventive/ Причем наблюдается он не только в Firefox (v.35), но и в Internet Explorer (v.11). Хотя раньше, разумеется, все было нормально — я тестировал эффект с нескольких компьютеров, плюс перед внедрением на рабочий сайт эффект тестировали коллеги.
После непродолжительного изучения CSS через FireBug полез искать в интернет — может кто-то уже решал данную проблему. Первое, на что наткнулся - установка свойства
backface-visibility:hidden;
на анимируемый блок. Не помогло.Однако потом наткнулся на заметку веб-разработчика Джиеля Беркерса. У него возникла точно такая же проблема, и решил он её следующим образом — добавил к трансформации в FireFox небольшой поворот блока, всего в 0,02 градуса (угол столь мал, что визуально никакого поворота незаметно). Я попробовал повторить, и — о, чудо! — всё заработало как надо.
Поскольку у меня проблема наблюдалась и в IE, добавил этот "финт ушами" и для него.
В итоге, мои правила трансформации выглядят сейчас так:
-webkit-transform: scale(1.08);
transform: scale(1.08);
-moz-transform: scale(1.08) rotate(0.01deg);
-ms-transform: scale(1.08) rotate(0.01deg);— 1-е правило задано специально для Safari под Mac — без него он напрочь отказывался что-либо анимировать.
— 2-е правило — для всех современных браузеров.
— 3-е и 4-е — оперативное решение проблемы для Firefox и IE.Избавляемся от мерцания при CSS-трансформации в Safari
Не в первый раз замечаю, что при использовании CSS-трансформаций, некоторые элементы на странице в Safari таинственным образом меняют свои свойства. В других браузерах подобное наблюдается значительно реже.
Особенно заметны такие артефакты когда трансформация стоит на псевдоклассе :hover, т.е срабатывают при наведении мыши на элемент. В моём случае увеличение кнопки .btn при наведении на неё мыши, перманентно вызывало изменение типа сглаживания текста в соседних блоках.
Проблема связана с нехваткой ресурсов для рендеринга, и довольно легко лечится.
Translate3D
Самый простой способ решения задачи — это активизация аппаратного ускорения, которое для двухмерной анимации в CSS по умолчанию отключено. Для этого просто создаём пустую 3D-анимацию.
-webkit-transform: translate3d(0,0,0);
Will-Change
В CSS существует относительно новое и пока малоизвестное свойство will-change, которое заранее передаёт браузеру информацию о возможном предстоящем изменении того или иного элемента. Например, если элемент планируется трансформировать, об этом можно предупредить браузер, чтобы он приберёг силы, как говорится. В случае с вышеупомянутой кнопкой, выглядит это так:
Если планируется изменение нескольких параметров, их можно задать последовательно через запятую. Например, для трансформации с изменением прозрачности:
will-change: transform, opacity;
Таким образом, браузер сможет заранее подготовиться к тяжёлой обработке и оптимизировать использование ресурсов. Что позволит избежать появления на странице различных побочных эффектов.
⚡️ Подписывайся на мой канал @DanilinBiz и ты узнаешь, почему фриланс это свобода, а работа в штате рабство.
Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.
Баг при использовании "transform: scale();"
При наведении на блок он должен увеличиваться и текст внутри него, соответственно, что собственно и происходит. Хром отображает все корректно, а вот мазила - нет. В мазиле наблюдается такой баг, что текст начинает немного дергаться, когда изменяет свой размер. Понятно, что это все происходит из-за пикселизации и из-за нецелого коэффициента увеличения.
Буду благодарен тем, кто подскажет, как убрать этот дергающийся эффект и заставить мазилу отображать все корректно.
Ответы (4 шт):
Попробуйте задать вместе со скейлом транслейтЗед transform: scale(1.5) translateZ(0);
UPD: проблема должна решиться, потому что translateZ запускает в браузере аппаратное ускорение анимации, что благоприятно влияет на ее отображение
В текущей мозиле фиксится через svg filter, но проблема в том, что она в растр текст переводит и она бьется при ресайзе. Но можно такой хак применить например:
div < display: flex; justify-content: center; align-items: center; background-color: red; margin: 5em auto; width: 15rem; height: 12rem; transition: transform .2s; will-change: transform; >div > p< color: #fff; font-size: 48px; transform: scale(.5); filter: url('data:image/svg+xml;utf8,#gaussian_blur'); > div:hoverНу и подогнать положение текста под контейнер с учетом скэйла
подними will-change: transform; выше строчки transition: transform .2s;
что бы он читал will-change должен прочитать раньше и еще
div:hover добавь transition: transform .2s;
Попробуйте, запретить отображать скрытые части скейлящегося объекта:
-webkit-backface-visibility: hidden; /* Chrome, Safari, Opera */ backface-visibility: hidden;
Большинство дерганий при скейлинге это лечит.