Мобильный iPad Safari, похоже, игнорирует позицию z-индексации для видеоэлементов html5

У меня есть элемент видео на странице, который отлично работает как в мобильном сафари, так и на рабочем столе. У меня есть полупрозрачное выпадающее меню, которое работает нормально. Проблема в том, что когда меню находится над элементом видео, в сафари на рабочем столе я могу видеть видео под меню (по желанию), а в мобильной версии элемент видео остается на переднем плане (некрасиво), независимо от того, что я говорю css. Есть ли обходной путь?

Изображение проблемы


person Marek Maurizio    schedule 10.09.2010    source источник


Ответы (12)


Проблема возникает только в том случае, если элемент видео был создан динамически. Если элемент был просто на странице во время загрузки, z-index работает нормально.

Вы можете исправить z-индекс для динамически создаваемых видео, указав элемент видео -webkit-transform-style: preserve-3d.

Да, это так же плохо, как haslayout в IE!

person JaffaTheCake    schedule 04.02.2011
comment
Я не заставляю это работать; не могли бы вы опубликовать пример? - person N Rohler; 16.02.2011
comment
+1 ты прав! это происходит только с динамически созданными элементами. Огромное спасибо:) - person gion_13; 29.07.2011
comment
Вы также должны иметь элементы управления свойствами HTML, которые отсутствуют. См. эту проблему. - person BishopZ; 19.03.2013
comment
Мое видео не создается динамически и по-прежнему игнорирует его z-индекс. Добавление свойства CSS transform-style также не помогает. - person brendanmckeown; 05.06.2014
comment
Могу подтвердить, что это также происходит со статическим тегом видео, без элементов управления. Как только я включу звук своих пользовательских элементов управления и всего остального, они исчезнут из видео. -webkit-transform-style помогает! - person kiw; 10.02.2021

К сожалению нет.

Исходя из моего опыта и понимания того, как сейчас работает iOS, это невозможно.

Мобильный Safari на iPad прорезает дыру для окна Quicktime, которое воспроизводит видео, используя встроенное аппаратное ускорение для увеличения времени автономной работы. (На iPhone и iPod Touch просто откройте его в отдельном окне, чтобы добиться того же эффекта.)

Это окно плохо сочетается с другим HTML-кодом на странице. На самом деле, я не нашел способа заставить мобильный Safari отображать что-либо поверх тега. Я предполагаю, что это связано с тем, что аппаратное ускорение позволяет только масштабировать и позиционировать видео, и что оно может обрабатывать только одно видео за раз.

person Zachary Ozer    schedule 10.09.2010
comment
Теперь это грустно. Придется останавливать и скрывать видео при открытии меню. Это уродливый обходной путь, будем надеяться, что кто-то придумает решение. Спасибо, в любом случае. - person Marek Maurizio; 11.09.2010
comment
Это может быть сделано. как сказал Jaffa The Cake, это происходит только с динамически вставляемыми видеоэлементами. - person gion_13; 29.07.2011

Я использую Flowplayer и простое раскрывающееся меню CSS, и у меня была такая же проблема.

У меня есть выпадающее меню, которое при нажатии охватывает часть области видео. Подменю отображается поверх видео, как и ожидалось, но события касания не отправляются.

Я исправил это, объединив несколько предложений от других, отвечающих на этот вопрос: я установил видимость:скрытый при открытии меню и видимость:видимый при закрытии подменю И установите для видео свойство CSS -webkit-transform-style:preserve-3d.

Вот соответствующий код. Я не использовал CSS для строки меню, но он делает то, что вы могли ожидать, — в результате получается меню, которое охватывает части видео.

меню и видео HTML

<div id='nav'>
  <ul>
    ... <!-- bunch of ul/li stuff here for the menu and submenus -->
  </ul>
</div>
<div id='videoplayer'><!-- for flowplayer --></div>

CSS

video {
  -webkit-transform-style: preserve-3d;
}

JavaScript

$(document).ready(function(){
  $("#nav li").hover(
    function() {
      $(this).find('ul:first').css({visibility: "visible",display: "none"}).fadeIn(300);
      $("video").css({visibility:"hidden"});
    },
    function(){ 
      $(this).find('ul:first').css({visibility: "hidden"});
      $("video").css({visibility:"visible"});
    }
  );
);
person Troy    schedule 11.02.2012
comment
ТРОЙ ТЫ СПАСАТЕЛЬ! Ответ Троя - это ответ, если у вас возникла эта проблема: stackoverflow.com/questions/9951463/ - person Jason; 31.03.2012
comment
Спасибо за ваш ответ. Я использую MediaElement js и сталкиваюсь с той же проблемой. После переключения видимости видео между «видимым» и «скрытым» с помощью js моя проблема неупорядоченного отображения исчезла (для моего случая) :) - person Anh Nguyen; 18.11.2013

Мне удалось разместить меню div над тегом видео html5 в мобильном сафари на ipad. Честно говоря, у меня не было никаких проблем, и это просто работало. Это может быть потому, что я использовал анимацию CSS3 и, следовательно, графический процессор? Вы можете попробовать использовать хак, чтобы добавить элемент в GPU. Если вы поместите -webkit-transform: translateZ(0); на элемент, он должен заставить его использовать графический процессор...

person ad rees    schedule 20.09.2010
comment
Кроме того, вы также можете использовать -webkit-transform-style: preserve-3d - person Martin; 18.01.2013

Я также столкнулся с этим. Единственное, что я мог заставить работать на меня, это добавить

display:none

к тегу видео при отображении над ним div, на который нужно было щелкнуть.

person Mike D    schedule 15.12.2011

-webkit-transform-style:preserve-3d и -webkit-transform:translateZ(0) мне не подошли.

Использование Flowplayer с плагином ipad и плагином панели управления позволило мне удалить панель управления, созданную ipad, и заменить ее чем-то, что можно индексировать по z под моими модальными окнами.

person Michael    schedule 25.08.2011

Вы можете исправить z-index в динамически создаваемых видео, указав элемент видео -webkit-transform-style: preserve-3d.

Это сработало для меня с динамически созданным видеоэлементом. Я также установил z-index наложенного div на z-index: 888;, что, возможно, также помогло.

person kdetella    schedule 23.01.2013
comment
Вы также должны иметь элементы управления свойствами HTML, которые отсутствуют. См. эту проблему. - person BishopZ; 19.03.2013

Когда у вас есть элемент, который вы хотите разместить перед <video> в Safari, вам нужно установить в этот элемент transform: translateZ(1px) или более пикселей, так как Safari устанавливает для вашего элемента <video> значение 0 для оси Z (transform: translateZ(0)).

Это единственное, что мне помогло. Нет z-index, нет transform-style:preserve-3d.

person Soldeplata Saketos    schedule 18.12.2020
comment
Спасибо, ваш ответ действительно спасает мой день. Я использую мобильный Safari на iOS14. В моем случае у меня есть slick с видео в качестве фона, и на него наложено несколько элементов div. Он идеально накладывается, когда он неподвижен, но видео будет накладывать эти div, когда я прокручиваю пятно. Я добавляю -webkit-transform: translateZ(1px) к этим div'ам, и теперь все идеально. - person sdym; 28.12.2020
comment
Я также «потерял» 8 часов, пытаясь найти исправление ???? - person Soldeplata Saketos; 28.12.2020

У меня была эта проблема, которая возникала на мобильных устройствах с меню вне холста. Когда меню было над видео, вы не могли нажать ни на один из пунктов меню.

Я исправил это, переместив видео в другое место, когда меню было включено, позиционируя его абсолютно на -100000 пикселей, когда меню не отображалось, оно вернуло его обратно в относительное положение.

Я обнаружил, что использование display none не работает, так как, когда вы снова устанавливаете блокировку, видео не будет работать.

Я также попытался установить высоту на 0 — это не сработало, поскольку видео, казалось, все еще занимало место, хотя вы его не видели.

Последний метод кажется немного экстремальным, но это не очень заметно при его использовании.

person matpol    schedule 21.11.2013

Это код, который будет работать как на iPad, так и на iPhone. Я попытался удалить элементы управления, а затем добавить их снова, но это сработало только на iPad, а не на iPhone. После удаления непрозрачности, а затем добавления ее снова, это сработало и на iPhone.

$("#overlay_open").click(function(){
  $("video").prop("controls", false);
  $("video").css("opacity", 0);
});

$("#overlay_close").click(function(){
  $("video").prop("controls", true);
  $("video").css("opacity", 1);
});
person Alex    schedule 24.04.2014

Просто сегодня столкнулся с этой проблемой, и мне пришлось собрать решение из нескольких ответов, поскольку ни один из них полностью не справился с проблемой...

У меня есть видеоэлементы в свернутом списке стилей «табличного представления», которые фиксируют события касания на iPhone при попытке коснуться других элементов списка. На iPhone видео воспроизводилось при нажатии на другие свернутые элементы, которые занимали то же место на экране.

Для исправления этого потребовалось все следующее:

1) Используя это:

video{
    -webkit-transform-style: preserve-3d;
  }

... похоже, не имело никакого эффекта, но я все равно оставил его. Теперь все работает, так что я не хочу больше с этим связываться :)

2) Переключение только visibility: hidden не сработало, а display:none не сработало, как ожидалось.

3) В дополнение к «видимости» атрибут видеотега HTML5 controls также должен динамически добавляться/удаляться. Либо:

$("video").css({visibility:"hidden"}).removeAttr("controls"); or $("video").css({visibility:"visible"}).attr("controls", "controls");

4) Необходимо установить видимость/элементы управления при загрузке документа в зависимости от начального размера браузера/экрана.

5) Хотя основной проблемой было странное поведение iPhone, мне также приходилось учитывать изменения размера окна, превышающего мою наименьшую контрольную точку медиа-запроса в 600 пикселей, иначе видео появлялось/исчезало при неправильных размерах экрана.

$(window).resize(function(){
    if ($(window).width() > 600){
        $("video").css({visibility:"visible"}).attr("controls", "controls");
    }
});

Довольно сложно обойти глупую ошибку мобильного Safari... Я очень надеюсь, что это сработает на iPad, когда я проверю его позже...

person mc01    schedule 16.08.2014

Для тех, кто столкнулся с проблемами с этим, еще одно исправление, которое в конечном итоге сработало для меня, заключалось в изменении параметров в коде встраивания, чтобы запретить элементы управления, предлагаемые видео, а также параметры заголовка видео и проигрывателя. Я добавил простой запрос Modernizr.MQ, чтобы изменить src для планшета и мобильного телефона, и включил следующее в iframe. исходный код для мобильных устройств:

?rel=0&controls=0&showinfo=0

Я так и не понял, почему это работает, но я предполагаю, что элементы управления имеют некоторый стиль пользовательского агента, который дает им высокий z-индекс и заставляет элемент располагаться поверх всего.

person Reese Thompson    schedule 28.08.2015