YouTube 播放器的 FF3/Windows CSS z-index 问题

Posted

技术标签:

【中文标题】YouTube 播放器的 FF3/Windows CSS z-index 问题【英文标题】:FF3/Windows CSS z-index problem with YouTube player 【发布时间】:2010-09-24 11:33:27 【问题描述】:

我被困在与 YouTube 播放器似乎存在 CSS/z-index 冲突的问题上。在 Windows XP 下的 Firefox 3 中,查看此页面:http://spokenword.org/program/21396 单击收集按钮并注意弹出

出现在 YouTube 播放器。在其他浏览器上, 出现在顶部。它的 z-index 值为 999999。我尝试将包含播放器的 元素的 z-index 设置为较低的值,但这不起作用。知道如何让弹出窗口出现在播放器上方吗?

【问题讨论】:

您使用的是什么版本的 Flash? 【参考方案1】:

虽然 CMS 的推荐是有效的,但有一个重要的更新。如果您想使用 'iframe' 而不是 'embed' ,只需将 ?wmode=transparent 添加到您的视频链接中即可。我觉得这更简单、更干净。

更新,2014 年 2 月

已经有一段时间了,这可能已经过时了。

有人报告说现在&wmode=transparent 可以代替了。

【讨论】:

这真的很好用,ile!您是从哪里得知此次更新的? 这是最相关的答案,因为没有人使用 YouTube 嵌入标签了。谢谢! 太棒了!谢谢!的确,这是今天的相关答案:) 同意。这个应该在上面。【参考方案2】:

我找到了一个可以在所有浏览器中修复它的纯 JS 函数!

你去吧:

function fix_flash() 
    // loop through every embed tag on the site
    var embeds = document.getElementsByTagName('embed');
    for (i = 0; i < embeds.length; i++) 
        embed = embeds[i];
        var new_embed;
        // everything but Firefox & Konqueror
        if (embed.outerhtml) 
            var html = embed.outerHTML;
            // replace an existing wmode parameter
            if (html.match(/wmode\s*=\s*('|")[a-zA-Z]+('|")/i))
                new_embed = html.replace(/wmode\s*=\s*('|")window('|")/i, "wmode='transparent'");
            // add a new wmode parameter
            else
                new_embed = html.replace(/<embed\s/i, "<embed wmode='transparent' ");
            // replace the old embed object with the fixed version
            embed.insertAdjacentHTML('beforeBegin', new_embed);
            embed.parentNode.removeChild(embed);
         else 
            // cloneNode is buggy in some versions of Safari & Opera, but works fine in FF
            new_embed = embed.cloneNode(true);
            if (!new_embed.getAttribute('wmode') || new_embed.getAttribute('wmode').toLowerCase() == 'window')
                new_embed.setAttribute('wmode', 'transparent');
            embed.parentNode.replaceChild(new_embed, embed);
        
    
    // loop through every object tag on the site
    var objects = document.getElementsByTagName('object');
    for (i = 0; i < objects.length; i++) 
        object = objects[i];
        var new_object;
        // object is an IE specific tag so we can use outerHTML here
        if (object.outerHTML) 
            var html = object.outerHTML;
            // replace an existing wmode parameter
            if (html.match(/<param\s+name\s*=\s*('|")wmode('|")\s+value\s*=\s*('|")[a-zA-Z]+('|")\s*\/?\>/i))
                new_object = html.replace(/<param\s+name\s*=\s*('|")wmode('|")\s+value\s*=\s*('|")window('|")\s*\/?\>/i, "<param name='wmode' value='transparent' />");
            // add a new wmode parameter
            else
                new_object = html.replace(/<\/object\>/i, "<param name='wmode' value='transparent' />\n</object>");
            // loop through each of the param tags
            var children = object.childNodes;
            for (j = 0; j < children.length; j++) 
                try 
                    if (children[j] != null) 
                        var theName = children[j].getAttribute('name');
                        if (theName != null && theName.match(/flashvars/i)) 
                            new_object = new_object.replace(/<param\s+name\s*=\s*('|")flashvars('|")\s+value\s*=\s*('|")[^'"]*('|")\s*\/?\>/i, "<param name='flashvars' value='" + children[j].getAttribute('value') + "' />");
                        
                    
                
                catch (err) 
                
            
            // replace the old embed object with the fixed versiony
            object.insertAdjacentHTML('beforeBegin', new_object);
            object.parentNode.removeChild(object);
        
    

现在你可以在页面加载时运行 jQuery:

 $(document).ready(function () 
            fix_flash();    
 );

【讨论】:

我希望我上个月在寻找这样的东西时看到了这个!我的搜索从未找到此页面。最后写出几乎一模一样的东西! 按广告宣传。谢谢! 请注意,这个解决方案会在 IE 上隐藏 Flash 对象 嘿,粉丝。它仍然对我有用。我在这里用过:skydiveinisrael.com,一切看起来都很好。查看中间的 youtube 视频,然后按侧面的一张图片。你会看到闪光灯上方弹出的图片正是想要的结果......【参考方案3】:

我注意到 wmode="opaque" 严重影响 CPU 的使用。 Chrome 在我的笔记本电脑上使用 50% 的 CPU 使用率(不透明 ~8%)。 所以要小心这个选项。

【讨论】:

【参考方案4】:

尝试将wmode 参数添加为opaque,如下所示:

(请注意,它包含在两个 &lt;param&gt; 标签 &lt;embed&gt; 标签上的wmode 属性中。)

<object width='425' height='344'> 
    <param name='movie' value='http://www.youtube.com/v/Wj_JNwNbETA&hl=en&fs=1'> 
    <param name='type' value='application/x-shockwave-flash'> 
    <param name='allowfullscreen' value='true'> 
    <param name='allowscriptaccess' value='always'> 
    <param name="wmode" value="opaque" />
    <embed width='425' height='344'
            src='http://www.youtube.com/v/Wj_JNwNbETA&hl=en&fs=1'
            type='application/x-shockwave-flash'
            allowfullscreen='true'
            allowscriptaccess='always'
            wmode="opaque"
    ></embed> 
    </object> 

【讨论】:

哈!做到了。我将不得不阅读以了解原因。本来以为让玩家不透明可能会产生相反的效果。太棒了! 很糟糕的是,广告网络不这样做,有时甚至拒绝这样做。他们希望他们的广告通过... Taht 代码在 IE 中对我有效,但在 Firefox 中无效。我有相同的代码。【参考方案5】:

我们使用jQuery Flash plugin 将 YouTube 链接转换为 Flash 电影。在这种情况下,wmode 作为一个选项传递,以便让 YouTube 视频出现在我们打开的 jQuery 对话框下方:

$('a[href^="http://www.youtube.com"]').flash(
     width: nnn, height: nnn, wmode: 'opaque' 
);

【讨论】:

以上是关于YouTube 播放器的 FF3/Windows CSS z-index 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 UIWebView 的情况下播放 youtube 视频或在 youtube 视频开始使用 webview 播放时检测视频播放器?

控制 youtube 电影播放器

Android YouTube API“初始化 YouTube 播放器时出错”

Android youtube API 在一个主要活动中播放两个或多个 Youtube 播放器

播放 YouTube 播放器的事件

在嵌入式 YouTube 播放器中自动播放下一个视频