Vídeo de YouTube Incrustado a través de iframe Ignorando z-index?


Estoy tratando de implementar un menú de navegación horizontal multinivel. Inmediatamente debajo (verticalmente) del menú, tengo un video de YouTube incrustado a través de iframe. Si cierro el cursor sobre uno de los elementos de navegación de nivel principal en Firefox, el menú desplegable aparece correctamente en la parte superior de el video.

En Chrome e IE9, sin embargo, solo una astilla del menú desplegable es visible en la pequeña región de espacio que tengo entre el menú y el iframe. El resto parece estar detrás de el iframe.

El problema parece estar relacionado con el video de YouTube, no el iframe. Para probar, apunté el iframe a otro sitio web en lugar del video, y el menú desplegable funcionó bien, incluso en IE.

  • Pregunta 1: ¿WTF?
  • Pregunta 2: Por qué, incluso si explicitamente pongo un z-index:-999 !important; en el iframe ¿sigue ocurriendo este problema?

¿Hay algún CSS interno que el código de inserción de YouTube incluya que de alguna manera anule las cosas?

Author: aksu, 2012-01-31

10 answers

Intente agregar wmode, parece tener dos parámetros.

&wmode=Opaque

&wmode=transparent

No puedo encontrar una razón técnica por la que funciona, o mucha más explicación, pero echa un vistazo a esta consulta.

<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/lzQgAR_J1PI?wmode=transparent" frameborder="0" wmode="Opaque">

O esto

//Fix z-index youtube video embedding
$(document).ready(function (){
    $('iframe').each(function(){
        var url = $(this).attr("src");
        $(this).attr("src",url+"?wmode=transparent");
    });
});
 242
Author: toomanyairmiles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-09 13:21:29

La respuesta de Joshc estaba en el camino correcto, pero descubrí que elimina totalmente el ?rel=0 querystring y lo reemplaza con el elemento ?wmode=transparent, lo que tiene el efecto de mostrar la lista de Videos sugeridos de YouTube al final de la reproducción, a pesar de que originalmente no quería que esto sucediera.

Cambié el código para que el atributo src del video incrustado se escanee primero, para ver si ya hay un signo de interrogación ? en él (porque esto denota la presencia de una cadena de consulta preexistente, que podría ser algo así como ?rel=0 pero en teoría podría ser cualquier cosa que YouTube elija agregar en el futuro). Si ya hay una cadena de consulta, queremos preservarla, no destruirla, porque representa un ajuste elegido por quien pegó en este video de YouTube, ¡y presumiblemente lo eligieron por una razón!

Entonces, si se encuentra ?, el wmode=transparent se agregará usando el formato: &mode=transparent para etiquetarlo al final del pre-existente cadena de consulta.

Si no se encuentra ?, entonces el código funcionará exactamente de la misma manera que lo hizo originalmente (en la publicación de toomanyairmiles), añadiendo solo ?wmode=transparent como una nueva cadena de consulta a la URL.

Ahora, independientemente de lo que puede o no estar al final de la URL de YouTube como una cadena de consulta ya, se conserva, y los parámetros requeridos wmode se inyectan o agregan sin dañar lo que estaba allí antes.

Aquí está el código para caer en su document.ready función:

$('iframe').each(function() {
  var url = $(this).attr("src");
  if (url.indexOf("?") > 0) {
    $(this).attr({
      "src" : url + "&wmode=transparent",
      "wmode" : "opaque"
    });
  }
  else {
    $(this).attr({
      "src" : url + "?wmode=transparent",
      "wmode" : "opaque"
    });
  }
});
 28
Author: BigJacko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-30 10:45:16

Simplemente agregue uno de estos dos a la url de src:

&wmode=Opaque

&wmode=transparent

<iframe id="videoIframe" width="500" height="281" src="http://www.youtube.com/embed/xxxxxx?rel=0&wmode=transparent" frameborder="0" allowfullscreen></iframe>
 6
Author: Code.Town,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 00:11:13

Tengo el mismo problema en YouTube iframe incrustado solo en Internet explorer, aunque.

Z-index estaba siendo ignorado totalmente, o el video de flash solo estaba apareciendo en el índice más alto posible.

Esto fue lo que usé, adaptando ligeramente el script jquery anterior.

Mi código de inserción, directamente de YouTube...

<iframe width="560" height="315" src="http://www.youtube.com/embed/QldZiR9eQ_0?rel=0" frameborder="0" allowfullscreen></iframe>


El jQuery slighty adaptado de la respuesta anterior...

$('iframe').each( function() {
    var url = $(this).attr("src")
    $(this).attr({
        "src" : url.replace('?rel=0', '')+"?wmode=transparent",
        "wmode" : "Opaque"
    })
});


Básicamente si no lo haces seleccione Mostrar vídeos sugeridos cuando el vídeo termine en su configuración de incrustación, tiene un ?rel=0 al final de su url "src". Así que he añadido el bit de reemplazo en caso de que exista ?rel=0. De lo contrario ?wmode=transparent no funcionará.


 5
Author: Joshc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-30 01:13:46

Simplemente podemos agregar ?wmode=transparent al final de la URL de YouTube. Esto le dirá a YouTube que incluya el video con el conjunto wmode. Así que el nuevo código de inserción se verá así: -

<iframe width="420" height="315" src="http://www.youtube.com/embed/C4I84Gy-cPI?wmode=transparent" frameborder="0" allowfullscreen>
 2
Author: user3410247,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-12 11:07:52

Solo este funcionó para mí:

<script type="text/javascript">
var frames = document.getElementsByTagName("iframe");
    for (var i = 0; i < frames.length; i++) {
        src = frames[i].src;
        if (src.indexOf('embed') != -1) {
        if (src.indexOf('?') != -1) {
            frames[i].src += "&wmode=transparent";
        } else {
            frames[i].src += "?wmode=transparent";
        }
    }
}
</script>

Lo cargo en el pie de página.archivo php Wordpress. Código encontrado en comentario aquí (gracias Gerson)

 2
Author: dragoeco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-25 11:18:45

Wmode=opaco o transparente al principio de mi cadena de consulta no solucionó nada. Este problema para mí solo se produce en Chrome, y no en todos los equipos. Sólo una cpu. Se produce en incrustaciones de vimeo, así, y posiblemente otros.

Mi solución para adjuntar a los eventos 'shown' y 'hidden' de los modales de bootstrap que estoy usando, agregar una clase que establece el iframe a 1x1 píxeles, y eliminar la clase cuando el modal se cierra. Parece que funciona y es fácil de implementar.

 1
Author: Danny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-24 19:33:43

Las respuestas abow no funcionaron realmente para mí, tuve un evento de clic en la envoltura e ie 7,8,9,10 ignoró el índice z, por lo que mi corrección le dio a la envoltura un color de fondo y de repente funcionó. Aunque se suponía que era transparente, así que definí la envoltura con el color de fondo blanco, y luego opacidad 0.01, y ahora funciona. También tengo las funciones anteriores, por lo que podría ser una combinación.

No sé por qué funciona, estoy feliz de que lo haga.

 1
Author: eduardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-01 12:19:25

El código Javascript de BigJacko funcionó para mí, pero en mi caso primero tuve que agregar algo de código jQuery "noconflict". Aquí está la versión revisada que funcionó en mi sitio:

<script type="text/javascript">
var $j = jQuery.noConflict(); 
jQuery(document).ready(function($j){
  $j('iframe').each(function() {
    var url = $j(this).attr("src");
      if ($j(this).attr("src").indexOf("?") > 0) {
        $j(this).attr({
          "src" : url + "&wmode=transparent",
          "wmode" : "Opaque"
        });
      }
      else {
        $j(this).attr({
          "src" : url + "?wmode=transparent",
           "wmode" : "Opaque"
        });
      }
   });
});
</script>
 1
Author: cclay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-09 19:21:44

Todo lo que necesitas en el iframe es:

...wmode="opaque"></iframe>

Y en la URL:

http://www.youtube.com/embed/123?wmode=transparent
 1
Author: Sam Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 10:29:19