IPad css3 анимация мерцает после использования клавиатуры
Я разрабатываю приложение для iPad с помощью HTML5/CSS3. Я не использую фреймворк и просто использую все, что на нем поддерживается. Я создал некоторые анимации css3 для эмуляции типичного iOS, сдвигающегося влево или скольжения вправо при навигации между экранами. Вот пример слайд-левого анимации, который использует аппаратное ускорение iPad CSS3: (ipad работает 4.2).
/*************************************************
Slide Left
*************************************************/
.screen.slideleft{
-webkit-animation-duration: 0.5s;
-webkit-animation-timing-function: ease-in-out;
}
.screen.slideleft.outgoing{
z-index: 50 !important;
-webkit-animation-name: slideleft-outgoing;
}
.screen.slideleft.incoming{
z-index: 100 !important;
-webkit-animation-name: slideleft-incoming;
}
@-webkit-keyframes slideleft-outgoing{
from { -webkit-transform: translate3d(0%,0,0); }
to { -webkit-transform: translate3d(-100%,0,0); }
}
@-webkit-keyframes slideleft-incoming{
from { -webkit-transform: translate3d(100%,0,0); }
to { -webkit-transform: translate3d(0%,0,0); }
}
У меня также есть этот CSS, который я попытался использовать для исправления мерцания:
.incoming,
.outgoing{
display: block !important;
-webkit-backface-visibility: hidden;
}
Это отлично работает, пока клавиатура iPad не используется. После чего все анимации сильно мерцают.
Я искал примеры iPad HTML5-приложения, которое использует клавиатуру и не имеет мерцаний впоследствии, но не слишком много. Демонстрации jqTouch демонстрируют такое же поведение на iPad (хотя я знаю, что они были предназначены для iPhone).
Я поднял несколько сообщений/вопросов по подобным вопросам, но никогда не нашел хорошего ответа. Я прошел через http://css3animator.com/2010/12/fight-the-flicker-making-your-css3-animation-bomb-proof/ и статьи, связанные с ними, но не добились успеха.
Любые другие предложения?
Обновление 1/13 @9am
Я добавил этот css, и это очень помогло:
.incoming *,
.outgoing *{
-webkit-backface-visibility: hidden;
-webkit-transform: translate3d(0,0,0); /* This helps with the flicker a lot. */
}
Элементы переднего плана, похоже, больше не мерцают, но фон все еще работает. Все еще ищете какую-то помощь или полезные ресурсы в тактике памяти Mobile Safari.
Обновление 1/16 @11pm
Увеличение индекса z, как было предложено анонимным. Кажется, не имеет значения.
Обновление 1/17 @8:30 утра
Я опубликовал демо-версию проблемы здесь.
Переходы между экранами отлично работают... пока вы не коснетесь одного из полей формы. После того, как клавиатура сдвинется и вернется, все переходы мерцают. Перейдите к URL-адресу внутри симулятора iOS или на самом iPad, чтобы узнать, о чем я говорю.
Ответы
Ответ 1
В конечном счете, действительно не было исправления этой проблемы. Похоже, что элементы формы в WebKit на iPad вызывают проблемы с мерцанием.
Мое обходное решение заключалось в том, что в onblur каждого элемента формы я обновил страницу с помощью хеш-тегов, чтобы убедиться, что она обновлена до того же самого состояния. Он все еще вызывал "мерцание", пока он был освежающим, но он не позволял экрану мерцать во всей остальной части приложения.
Ответ 2
Это старый вопрос, но я решил поделиться своим опытом.
У меня были проблемы с возмутительным мерцанием (на анимации css3) на iPad (а также iPhone, но в этом случае только в портретном виде). Я смог полностью решить все проблески, задав:
-webkit-perspective: 0;
О анимированных элементах. Я не уверен, почему это работает, но оно (протестировано на iOS 4.2+, iPad (1 и 2) и iPhone 4).
Обновление: мне стало известно о проблеме с Chrome при установке значения этого атрибута на 1. Он отлично работает, когда он равен 0, поэтому я обновил вышеописанное.
Ответ 3
Глядя на ваш источник, translate3d (0,0,0) не применяется до начала перехода?
Try
.screen{
-webkit-transform: translate3d(0,0,0);
}
или
.screen *, .screen{
-webkit-transform: translate3d(0,0,0);
}
Мерцание - это, вероятно, аппаратное ускорение (в настоящее время оно работает только на 3d переведенных элементах).
Ответ 4
У меня была такая же проблема, но я смог уменьшить мерцание до почти незаметного, применив исправление, описанное здесь и здесь:
http://code.google.com/p/jqtouch/issues/detail?id=301
https://github.com/senchalabs/jQTouch/issues/issue/130
В основном устанавливается z-индекс страницы, на которой вы перемещаетесь до -1, и после перехода на 1
Ответ 5
Я знаю, что это старый вопрос динозавра, но есть решение для этой проблемы, и оно довольно легкое и очень простое.
document.getElementById('clicked_input').addEventListener('focus', function(e){
e.stopPropagation();
},false);
Когда я тоже занимался этой проблемой, мне показалось, что я все испробовал - в конечном итоге единственное, что помогло, - создать модальное окно (положение: абсолютное) вне контейнера приложения app, а также установить контейнер приложения app на дисплей: ложь; когда клавиатура подходила. В то время как это работало, это было уродливо, я тестировал все, чтобы увидеть, что вызвало это событие, и казалось, что когда "фокусное событие" пузырилось, каждое 3D-трансформирование перепуталось (в мерцании и производительности).
Предотвращение события барботажа полностью разрешило эту проблему - совершенно ошеломительно, что такая ненавистная ошибка имела такое простое решение?
Ответ 6
Вам не понравится, если я скажу это, но JavaScript может быть ответом, который вы ищете. Я боюсь, что когда вы принесете клавиатуру, процесс рендеринга HTML теряет приоритет. При постоянном обновлении script, как и в цикле setInterval
, у iPad не будет выбора, кроме как сделать так, как планировалось. Явный код не требует хаков.
Ответ 7
Я согласен с Беном, вы должны, вероятно, также установить преобразования на самих классах:
/*************************************************
Slide Left
*************************************************/
.screen.slideleft{
-webkit-animation-duration: 0.5s;
-webkit-animation-timing-function: ease-in-out;
-webkit-transform: translate3d(0,0,0);
}
.screen.slideleft.outgoing{
z-index: 50 !important;
-webkit-animation-name: slideleft-outgoing;
-webkit-transform: translate3d(-100%,0,0);
}
.screen.slideleft.incoming{
z-index: 100 !important;
-webkit-animation-name: slideleft-incoming;
-webkit-transform: translate3d(0,0,0);
}
@-webkit-keyframes slideleft-outgoing{
from { -webkit-transform: translate3d(0,0,0); }
to { -webkit-transform: translate3d(-100%,0,0); }
}
@-webkit-keyframes slideleft-incoming{
from { -webkit-transform: translate3d(100%,0,0); }
to { -webkit-transform: translate3d(0,0,0); }
}
Если это не сработает, мне было бы интересно проверить, разрешает ли только перевод X с translateX(-100%)
проблему. (Не обязательно исправление, потому что у вас нет аппаратного ускорения без 3D-преобразований, но поможет сузить проблему.)
Ответ 8
Недавно я столкнулся с той же проблемой и попробовал всевозможные сложные исправления. В конце концов я обнаружил, что проблема связана с стилем по умолчанию на входе. Я исправил свою проблему, добавив css input{outline:none}
. Это просто вопрос о состоянии фокусировки, поэтому input:focus{outline:none;}
должен работать.