#css #webkit #css-animations #mobile-safari
Вопрос:
Мне трудно создавать анимацию масштабирования, которая не является изменчивой в Safari (мобильный). Под изменчивостью я имею в виду, что вы можете ясно видеть, что это не плавная анимация 60 кадров в секунду. Я должен сказать, что этот элемент абсолютно позиционирован, поэтому он не должен влиять на макет, не так ли?
Первое, что я попробовал, — это анимировать элемент, создав CSS-анимацию с 2 ключевыми кадрами, начиная с transform: scale(0);
transform: scale(1);
. Для эффекта, которого я хочу достичь, я также использовал transform-origin: top right;
. Я также попытался оптимизировать его, установив will-change: transform;
, но он был неустойчивым.
Я списал его и переработал, чтобы он использовался transition: transform
. Таким образом , по умолчанию элемент имеет transform: scale(0);
, когда к нему присоединяется определенный класс, он получает transform: scale(1);
, какой переход анимируется, но он все еще прерывистый.
После некоторых исследований я выяснил, что вы хотите избежать анимации свойств, которые требуют, чтобы браузеры пересчитывали макет. Я нашел этот сайт, на котором говорится, что WebKit (который, насколько мне известно, использует Safari) в значительной степени пересчитывает макет для каждого изменения свойств. Это правда, и если да, то как вы делаете плавную анимацию 60 кадров в секунду на мобильном Safari (на других платформах, использующих Safari, это не так заметно, потому что у них гораздо больше ресурсов для пересчета всего, и это выглядит немного более плавно, чем на мобильных устройствах)?
Комментарии:
1. Хорошая статья об оптимизации css-анимации и многом другом. здесь . Больше вы ничего не можете с этим поделать. Имейте в виду, что другие действия, выполняемые в одно и то же время (другие анимации или сценарии js), которые работают одновременно, снизят общую производительность и могут вызвать указанную проблему.
2.
transform: scale(x)
уже является одним из самых дешевых для анимации, поэтому ваша проблема может быть вызвана другими анимациями, которые находятся на вашей странице.
Ответ №1:
Есть 2 вещи, которые вы можете попробовать:
- избегайте использования шкалы(0). В некоторых браузерах это создает проблемы. масштаб(0,01) почти такой же, и будет лучше для браузера.
- Попробуйте сделать так, чтобы анимация обрабатывалась графическим процессором, а не процессором. это можно сделать с помощью следующего кода
от: {преобразование: масштаб(0,01) перевод(1 пиксель);}
кому: {преобразование: масштаб(1) перевод(1 пикселей);}
Комментарии:
1. По какой-то причине это казалось более плавным и лучшим. Еще одна вещь, которую я выяснил, заключается в том, что пользовательские послабления также могут иметь значение. Это может показаться менее изменчивым с различными смягчениями.
Ответ №2:
В связи с этим разделом статьи Animate Changes in CSS Properties
вы можете анимировать с помощью ключевых кадров , но вам нужно использовать такой процент, как этот:
Больше примеров в статье w3s.
PD: если вы добавите пример, я постараюсь вам помочь.
function animateStart(){
document.getElementById('ball').classList.add('bounce');
}
function animationPause(){
document.getElementById('ball').style.webkitAnimationPlayState='paused';
}
function animationContinue(){
document.getElementById('ball').style.webkitAnimationPlayState='running';
}
@-webkit-keyframes bounce {
0% {top: 100px; left: 1px; -webkit-animate-timing-function: ease-in;}
25% {top: 150px; left: 76px; -webkit-animate-timing-function: ease-out;}
50% {top: 100px; left: 151px -webkit-animate-timing-function: ease-in;}
75% {top: 150px; left: 226px -webkit-animate-timing-function: ease-out;}
100% {top:100px; left: 301px;}
}
.bounce {
-webkit-animation-name: bounce;
-webkit-animation-duration: 2s;
-webkit-animation-timing-function: linear;
-webkit-animation-iteration-count: infinite;
-webkit-animation-direction: alternate;
}
.ball-style {
position:absolute; top: 100px; left: 10px;
height:100px; width:100px; border-radius:50px;
background:-webkit-radial-gradient(30% 30%, white, red 10%, black);;
}
.wall {
position:absolute; left: 400px; top: 100px;
height: 150px;
background: black;
}
<input type="button" value="Animate alternative"
onclick="document.getElementById('ball').classList.add('bounce');">
<input type="button" value="Animate" onclick="animateStart()">
<input type="button" value="Pause" onclick="animationPause()">
<input type="button" value="Continue" onclick="animationContinue()">
<div id="ball" class="ball-style"></div>
<div class="wall">amp;nbsp;</div>
Ответ №3:
Я не знаю, поможет ли это, но используете ли вы javascript для добавления класса и запуска анимации с изменением класса? Например, jQuery может вызвать длительный анализ глубины в dom при манипулировании элементами, это, вероятно, повлияет на производительность, необходимую для достижения желаемого fps.