Video YouTube được nhúng qua iframe Bỏ qua chỉ mục z?


130

Tôi đang cố gắng thực hiện một menu điều hướng thả xuống đa cấp ngang. Ngay bên dưới (theo chiều dọc) menu, tôi đã có một video YouTube được nhúng qua iframe. Nếu tôi di chuột qua một trong các mục điều hướng cấp chính trong Firefox, menu thả xuống sẽ xuất hiện đúng trên đầu video.

Tuy nhiên, trong Chrome và IE9, chỉ có một phần nhỏ của danh sách thả xuống được hiển thị trong vùng không gian nhỏ mà tôi có giữa menu và iframe. Phần còn lại của nó dường như nằm phía sau iframe.

Vấn đề dường như có liên quan đến video YouTube, không phải iframe. Để kiểm tra, tôi đã nhắm iframe vào một trang web khác chứ không phải video và menu thả xuống hoạt động tốt, ngay cả trong IE.

  • Câu 1: WTF?
  • Câu hỏi 2: Tại sao, ngay cả khi tôi khám phá đặt một z-index:-999 !important; iframe thì vấn đề này vẫn xảy ra?

Có một số CSS nội bộ mà mã nhúng YouTube bao gồm phần nào đó đang ghi đè lên mọi thứ?


Bạn có thể đăng một liên kết - thật khó để đưa ra một phản hồi hữu ích mà không cần mã.
toomanyairmiles



cho bất cứ ai tự hỏi cách thức hoạt động này trong năm 2015, <embed wmode="transparent" ...>phần là tất cả các bạn cần (ít nhất là trong firefox) và không cần phải lo lắng về việc thiết wmode trong url's param' s hoặc iframe
RozzA

Hãy nhớ rằng vì một số lý do, có hai loại liên kết youtube khác nhau: youtube.com/v/video_idyoutube.com/embed/video_id . Liên kết v bỏ qua chỉ mục z trong IE, nhưng nhúng hoạt động tốt.
Anton Lyhin

Câu trả lời:


243

Hãy thử thêm wmode, nó dường như có hai tham số.

&wmode=Opaque

&wmode=transparent

Tôi không thể tìm thấy lý do kỹ thuật tại sao nó hoạt động, hoặc giải thích nhiều hơn nhưng hãy xem truy vấn này .

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

hoặc cái này

//Fix z-index youtube video embedding
$(document).ready(function (){
    $('iframe').each(function(){
        var url = $(this).attr("src");
        $(this).attr("src",url+"?wmode=transparent");
    });
});

6
(Tôi là OP) Cảm ơn mọi người! Tôi tình cờ tìm thấy một giải pháp tương tự tại manisheriar.com/blog/flash_objects_and_z_index Khóa dường như đang sử dụng cả name = "wmode" value = "trong suốt" trên <param> wmode = "trong suốt" trên <embed>. Như tôi nghi ngờ, đó không phải là vấn đề iframe. Nó dường như là một vấn đề với Flash muốn (yêu cầu?) Chỉ số z cao nhất trừ khi bạn buộc nó phải trong suốt.
dùng249493

5
Nếu bạn đang sử dụng API JS iframe, playerVar wmodecũng hoạt động mặc dù nó không được ghi lại.
Richard M

1
Tôi đã tích hợp cái này và stil Fancybox của tôi không hoạt động trong eg7 / 8 và tôi vẫn nhận được video trên đầu trang. encompasscu.com.au/homeiswheretheheartis tôi có thể làm gì
Dan

6
Tùy chọn? Wmode = trong suốt hoạt động như một cơ duyên đối với tôi. Tôi chỉ muốn tôi nhanh hơn trong việc tìm đúng câu hỏi để hỏi. 24 giờ sau khi tôi bắt đầu tìm kiếm, tôi tìm thấy câu trả lời này. Cảm ơn bạn đã trả lời và gửi câu hỏi ở trên là tốt!
djmarquette

1
@Dan, xem chỉnh sửa của tôi ... bạn có thể đã có một chuỗi truy vấn trong mã nhúng youtube của bạn. (như? rel = 0 để không hiển thị video liên quan). Nếu đó là trường hợp sử dụng & wmode = trong suốt (hoặc mờ - tôi đã nghe nói mờ sử dụng ít tài nguyên hệ thống hơn, vì vậy tôi sử dụng chủ yếu, trừ khi tôi có lý do để làm cho nó trong suốt).
Sean Kendle

28

Câu trả lời của Joshc đã đi đúng hướng, nhưng tôi thấy rằng nó hoàn toàn xóa ?rel=0chuỗi truy vấn và thay thế nó bằng ?wmode=transparentmục - có tác dụng hiển thị danh sách Video được đề xuất của YouTube khi kết thúc phát lại, mặc dù ban đầu bạn không làm thế t muốn điều này xảy ra

Tôi đã thay đổi mã để srcthuộc tính của video được nhúng trước tiên được quét, để xem đã có dấu chấm hỏi ?chưa (vì điều này biểu thị sự hiện diện của chuỗi truy vấn đã tồn tại trước đó, thể giống như ?rel=0trên lý thuyết là bất cứ điều gì YouTube chọn để nối thêm trong tương lai). Nếu đã có một chuỗi truy vấn ở đó, chúng tôi muốn giữ lại nó, không phá hủy nó, bởi vì nó đại diện cho một cài đặt được chọn bởi bất kỳ ai đã dán trong video YouTube này và có lẽ họ đã chọn nó vì lý do!

Vì vậy, nếu ?được tìm thấy, wmode=transparentsẽ được thêm vào bằng cách sử dụng định dạng: &mode=transparentchỉ gắn thẻ nó vào cuối chuỗi truy vấn có sẵn.

Nếu không ?tìm thấy, thì mã sẽ hoạt động chính xác theo cách ban đầu (trong bài đăng của toomanyairmiles ), nối thêm ?wmode=transparentnhư một chuỗi truy vấn mới vào URL.

Bây giờ, bất kể những gì có thể có hoặc không có ở cuối URL YouTube dưới dạng chuỗi truy vấn, nó vẫn được giữ nguyên và các wmodetham số bắt buộc được tiêm hoặc thêm mà không làm hỏng những gì đã có trước đó.

Đây là mã để thả vào document.readychức năng của bạ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"
    });
  }
});

Điều này làm việc cho tôi trong khi câu trả lời được chấp nhận là không (ngay cả sau khi sửa mã). Cảm ơn đã sửa chữa.
Tom

? bắt đầu chuỗi truy vấn tham số và là dấu phân cách. Vật liệu cơ bản. Xem stackoverflow.com/questions/2667551/ từ
cdonner

2
Điều này đã khắc phục sự cố của tôi 10 giây trước khi bỏ cuộc!
Malibur

1
Hoàn hảo! Tôi đã tìm kiếm điều này từ lâu!
Jeroen W

2
Không opaquephải Opaque(lưu ý trường hợp)
Szymon Toda

6

Chỉ cần thêm một trong hai vào 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>

5

Tôi có cùng một vấn đề trên iframe YouTube chỉ nhúng trong trình duyệt internet explorer.

Chỉ số Z đã bị bỏ qua hoàn toàn hoặc video flash chỉ xuất hiện ở chỉ số cao nhất có thể.

Đây là những gì tôi đã sử dụng, điều chỉnh nhẹ kịch bản jquery ở trên.

Mã nhúng của tôi, trực tiếp từ YouTube ...

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


JQuery hơi thích nghi với câu trả lời trên ...

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


Về cơ bản nếu bạn không chọn Hiển thị video được đề xuất khi video kết thúc trong cài đặt nhúng của mình, bạn có một ?rel=0đoạn cuối "src"url. Vì vậy, tôi đã thêm bit thay thế trong trường hợp ?rel=0tồn tại. Nếu không ?wmode=transparentsẽ không làm việc.



2

Chúng tôi chỉ đơn giản có thể thêm ?wmode=transparentvào cuối URL YouTube. Điều này sẽ bảo YouTube bao gồm video với bộ wmode. Vì vậy, mã nhúng mới của bạn sẽ trông như thế này: -

<iframe width="420" height="315" src="http://www.youtube.com/embed/C4I84Gy-cPI?wmode=transparent" frameborder="0" allowfullscreen>

Điều này đã được đề xuất trong nhiều câu trả lời ở đây, không cần phải lặp lại với câu trả lời khác. Nếu bạn có một cái gì đó mới để thêm xin vui lòng làm, nếu không xin vui lòng không lặp lại những gì người khác đã đăng.
Shadow Wizard là Ear For You

2

Chỉ cái này làm việc cho tôi:

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

Tôi tải nó trong tập tin Wordpress footer.php. Mã được tìm thấy trong bình luận ở đây (cảm ơn Gerson)


1

wmode = mờ đục hoặc trong suốt ở đầu chuỗi truy vấn của tôi không giải quyết được gì. Vấn đề này đối với tôi chỉ xảy ra trên Chrome và không phải trên tất cả các máy tính. Chỉ cần một cpu. Nó xảy ra trong vimeo nhúng là tốt, và có thể những người khác.

Giải pháp của tôi để gắn vào sự kiện 'hiển thị' và 'ẩn' của các mô-đun bootstrap tôi đang sử dụng, thêm một lớp đặt iframe thành 1x1 pixel và xóa lớp khi đóng chế độ. Có vẻ như nó hoạt động và đơn giản để thực hiện.


1

Các câu trả lời không thực sự hiệu quả với tôi, tôi đã có một sự kiện nhấp chuột trên trình bao bọc và tức là 7,8,9,10 đã bỏ qua chỉ số z, vì vậy cách khắc phục của tôi là tạo cho trình bao bọc màu nền và tất cả đều bất ngờ hoạt động . Mặc dù nó được cho là trong suốt, vì vậy tôi đã xác định trình bao bọc với màu trắng nền, và sau đó độ mờ 0,01, và bây giờ nó hoạt động. Tôi cũng có các chức năng trên, vì vậy nó có thể là một sự kết hợp.

Tôi không biết tại sao nó hoạt động, tôi chỉ hạnh phúc nó làm.


1

Mã Javascript của BigJack hoạt động với tôi, nhưng trong trường hợp của tôi, trước tiên tôi phải thêm một số mã "noconflict" của JQuery. Đây là phiên bản sửa đổi hoạt động trên trang web của tôi:

<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

Tất cả những gì bạn cần trên iframe là:

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

và trong URL:

http://www.youtube.com/embed/123?wmode=transparent
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.