Wideo YouTube osadzone przez iframe Ignorujesz indeks Z?

130

Próbuję zaimplementować poziome wielopoziomowe rozwijane menu nawigacyjne. Bezpośrednio poniżej (w pionie) menu mam wideo YouTube osadzone za pośrednictwem iframe. Jeśli najedziesz kursorem na jeden z głównych elementów nawigacyjnych w przeglądarce Firefox, menu rozwijane zostanie prawidłowo wyświetlone u góry wideo.

Jednak w Chrome i IE9 tylko wycinek listy jest widoczny w małym obszarze, który mam między menu a ramką iframe. Reszta wydaje się znajdować za ramką iframe.

Wydaje się, że problem jest związany z filmem w YouTube, a nie z ramką iframe. Aby przetestować, skierowałem iframe na inną stronę internetową zamiast wideo, a menu rozwijane działało dobrze, nawet w IE.

  • Pytanie 1: WTF?
  • Pytanie 2: Dlaczego, nawet jeśli wyraźnie umieszczę z-index:-999 !important; w elemencie iframe, ten problem nadal występuje?

Czy istnieje jakiś wewnętrzny kod CSS, który zawiera kod YouTube do umieszczenia na stronie, który w jakiś sposób nadpisuje rzeczy?

user249493
źródło
Czy możesz zamieścić link - bez kodu trudno udzielić pomocnej odpowiedzi.
toomanyairmiles
możliwy duplikat z-index i iFrame!
stephanfriedrich
dla każdego, zastanawiając się, jak to działa w 2015 roku <embed wmode="transparent" ...>sekcja jest wszystko, czego potrzeba (przynajmniej w Firefoksie) i nie trzeba się martwić o ustawienie wmode w url„s param” s lub iframes
RozzA
pamiętaj, że z jakiegoś powodu istnieją dwa różne typy linków do youtube: youtube.com/v/video_id i youtube.com/embed/video_id . V-link ignoruje indeks z w IE, ale osadzanie działa dobrze.
Anton Lyhin

Odpowiedzi:

243

Spróbuj dodać wmode, wydaje się, że ma dwa parametry.

&wmode=Opaque

&wmode=transparent

Nie mogę znaleźć technicznego powodu, dla którego to działa, ani wielu innych wyjaśnień, ale spójrz na to zapytanie .

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

albo to

//Fix z-index youtube video embedding
$(document).ready(function (){
    $('iframe').each(function(){
        var url = $(this).attr("src");
        $(this).attr("src",url+"?wmode=transparent");
    });
});
toomanyairmiles
źródło
6
(Jestem OP) Dziękuję wszystkim! Natknąłem się na podobne rozwiązanie na manisheriar.com/blog/flash_objects_and_z_index Klucz wydaje się używać zarówno name = "wmode" value = "transparent" na <param>, jak i wmode = "transparent" na <embed>. Jak podejrzewałem, nie jest to problem z ramką iframe. Wydaje się, że problem polega na tym, że Flash chce (wymaga?) Najwyższego indeksu z, chyba że wymusisz, aby był przezroczysty.
user249493
5
Jeśli używasz iframe JS API, playerVar wmoderównież działa, chociaż nie jest to udokumentowane.
Richard M
1
Zintegrowałem to i mój fancybox nadal nie działa w ie7 / 8 i nadal mam wideo na wierzchu. encompasscu.com.au/homeiswheretheheartis co mogę zrobić
Dan
6
Opcja? Wmode = transparent działała dla mnie jak urok. Szkoda tylko, że nie potrafię szybciej znaleźć właściwego pytania. 24 godziny po tym, jak zacząłem szukać, znalazłem tę odpowiedź. Dziękujemy za udzielenie odpowiedzi i przesłanie powyższego zapytania!
djmarquette
1
@Dan, zobacz moją edycję ... możesz już mieć ciąg zapytania w swoim kodzie YouTube do umieszczenia na stronie. (np.? rel = 0, aby nie wyświetlać odpowiednich filmów). W takim przypadku użyj & wmode = transparent (lub opaque - słyszałem, że opaque zużywa mniej zasobów systemowych, więc używam go głównie, chyba że mam powód, aby uczynić go przezroczystym).
Sean Kendle
28

Odpowiedź Joshca była na właściwej ścieżce, ale stwierdziłem, że całkowicie usuwa ?rel=0kwerendę i zastępuje ją ?wmode=transparentelementem - co powoduje wyświetlenie listy sugerowanych filmów wideo YouTube na końcu odtwarzania, mimo że pierwotnie tego nie robiłeś chcę, żeby to się stało.

Zmieniłem kod tak, aby srcatrybut osadzonego wideo był skanowany jako pierwszy, aby sprawdzić, czy jest już ?w nim znak zapytania (ponieważ oznacza to obecność wcześniej istniejącego ciągu zapytania, który może być czymś w rodzaju, ?rel=0ale teoretycznie mógłby być wszystkim, co YouTube zdecyduje się dołączyć w przyszłości). Jeśli istnieje już ciąg zapytania, chcemy go zachować, a nie zniszczyć, ponieważ reprezentuje ustawienie wybrane przez tego, kto wklejał ten film na YouTube, i prawdopodobnie wybrał to z jakiegoś powodu!

Tak więc, jeśli ?zostanie znaleziony, wmode=transparentzostanie dołączony przy użyciu formatu: &mode=transparentaby po prostu oznaczyć go na końcu wcześniej istniejącego ciągu zapytania.

Jeśli nie ?zostanie znalezione, kod będzie działał dokładnie tak samo, jak pierwotnie (w poście toomanyairmiles ), dołączając ?wmode=transparentjako nowy ciąg zapytania do adresu URL.

Teraz, niezależnie od tego, co może znajdować się na końcu adresu URL YouTube jako ciąg zapytania lub nie, zostanie on zachowany, a wymagane wmodeparametry zostaną wprowadzone lub dodane bez uszkodzenia tego, co było wcześniej.

Oto kod, który należy umieścić w document.readyfunkcji:

$('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"
    });
  }
});
BigJacko
źródło
To zadziałało dla mnie, podczas gdy zaakceptowana odpowiedź nie (nawet po poprawieniu kodu). Dzięki za bezpośrednią poprawkę.
Tom
? uruchamia ciąg zapytania parametrycznego, & jest ogranicznikiem. Podstawowe rzeczy. Zobacz stackoverflow.com/questions/2667551/ ...
cdonner,
2
To rozwiązało mój problem 10 sekund przed poddaniem się!
Malibur
1
Idealny! Szukałem tego od wieków!
Jeroen W
2
To opaquenie jest Opaque(zwróć uwagę na sprawę)
Szymon Toda
6

Po prostu dodaj jeden z tych dwóch do adresu URL 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>
Kod Miasto
źródło
5

Mam ten sam problem z osadzaniem iframe YouTube tylko w przeglądarce Internet Explorer.

Indeks Z był całkowicie ignorowany lub wideo flash właśnie pojawiało się z najwyższym możliwym indeksem.

Tego właśnie użyłem, nieznacznie dostosowując powyższy skrypt jquery.

Mój kod do umieszczenia na stronie, prosto z YouTube ...

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


JQuery slighty dostosowany z powyższej odpowiedzi ...

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


Zasadniczo, jeśli nie wybierzesz opcji Pokaż sugerowane filmy po zakończeniu odtwarzania w ustawieniach osadzania, masz ?rel=0na końcu "src"adresu URL. Więc dodałem bit zastępczy, jeśli ?rel=0istnieje. W przeciwnym razie ?wmode=transparentnie zadziała.


Joshc
źródło
2

Możemy po prostu dodać ?wmode=transparentna końcu adresu URL YouTube. To powie YouTube, aby dołączył wideo z zestawem wmode. Tak więc nowy kod do umieszczenia na stronie będzie wyglądał następująco: -

<iframe width="420" height="315" src="http://www.youtube.com/embed/C4I84Gy-cPI?wmode=transparent" frameborder="0" allowfullscreen>
user3410247
źródło
1
Było to już sugerowane w wielu odpowiedziach tutaj, nie ma potrzeby powtarzania tego z kolejną odpowiedzią. Jeśli masz coś nowego do dodania, zrób to, w przeciwnym razie nie powtarzaj tego, co inni już opublikowali.
Shadow Wizard is Ear For You
2

Tylko ten działał dla mnie:

<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>

Ładuję go do pliku footer.php Wordpress. Kod znaleziony w komentarzu tutaj (dzięki Gerson)

dragoeco
źródło
1

wmode = nieprzezroczysty lub przezroczysty na początku mojego ciągu zapytania nie rozwiązał niczego. Ten problem występuje tylko w przeglądarce Chrome, a nawet nie na wszystkich komputerach. Tylko jeden procesor. Występuje również w osadzonych vimeo i prawdopodobnie innych.

Moje rozwiązanie polega na dołączeniu do zdarzenia „pokazanego” i „ukrytego” modali ładowania początkowego, których używam, dodać klasę, która ustawia ramkę iframe na piksele 1x1 i usunąć klasę po zamknięciu modalu. Wydaje się, że to działa i jest łatwe do wdrożenia.

Danny
źródło
1

Odpowiedzi powyżej tak naprawdę dla mnie nie działały, miałem zdarzenie kliknięcia na opakowaniu i tj. 7,8,9,10 zignorowało indeks Z, więc moja poprawka nadawała otoku kolor tła i nagle zadziałało . Chociaż miał być przezroczysty, zdefiniowałem opakowanie za pomocą koloru tła biały, a następnie krycia 0,01, i teraz działa. Mam też powyższe funkcje, więc może to być kombinacja.

Nie wiem, dlaczego to działa, po prostu cieszę się, że tak.

eduardo
źródło
1

Kod Javascript w BigJacko zadziałał dla mnie, ale w moim przypadku musiałem najpierw dodać kod JQuery „noconflict”. Oto poprawiona wersja, która działała w mojej witrynie:

<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>
glina
źródło
1

Wszystko, czego potrzebujesz w iframe, to:

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

aw adresie URL:

http://www.youtube.com/embed/123?wmode=transparent
Sam Thompson
źródło