[转] RX8012: 不同浏览器中 Flash 与其他元素发生覆盖时有差异

标准参考

堆栈级 stack level 概念请参见 CSS 2.1 规范:9.9 Layered presentation

'z-index' 特性对 stack level 的影响,请参见 CSS 2.1 规范:9.9.1 Specifying the stack level: the 'z-index' property

问题描述

不同浏览器中 Flash 与其他元素发生覆盖时, Flash 与其他元素的层叠顺序有差异。

造成的影响

Flash 被其他元素遮挡,或其他元素被 Flash 遮挡,与期待效果不同。

受影响的浏览器

所有浏览器 

问题分析

一般情况下,页面中会用 OBJECT 与 EMBED 元素来显示一个 FLASH 动画。大致代码如下:

<object type="application/x-shockwave-flash" data="clock.swf
">
  <param value="clock.swf
" name="movie"/>
  <param value="wmode" name="window"/>

</object>

OBJECT 元素内 PARAM 元素负责为 Flash 动画设置相应参数,其中 wmode 参数较为重要,它决定了 Flash 的渲染方式。

Adobe 公司的 Flash 开发者文档中有关于 wmode 参数值的详细说明: Support for WMODE

当 wmode = "transparent" 或 "opaque" 时,Flash 动画交由页面渲染引擎负责渲染,此时它在定位流中的位置由 CSS 中的 'z-index' 特性控制。

如果 wmode 没有设置,他的默认值是 window,这代表 Flash 动画将在 window 窗口级别渲染,相应元素拥有系统级的窗口句柄,它所在定位流中的 'z-index' 特性将失效,而会处于所有未拥有窗口句柄特性的页面元素之上,此时用来控制定位流中 Z 轴方向中上下层位置的 'z-index' 特性将会失效。

分析如下代码:

<body style="margin:40px;">
  <object type="application/x-shockwave-flash" data="clock.swf
" style="height:80px; width:80px; position:absolute; top:0; left:0;">
    <param value="clock.swf
" name="movie"/>
    <param value="wmode" name="window"/>

  </object>
  <iframe src="http://www.google.com/logos/
" style="width:240px; height:120px;"></iframe>
</body>

页面中用来播放 Flash 的 OBJECT 元素被设置了绝对定位 position:absolute,使其处于定位流中,'z-index' 特性没有设置,采用默认值 auto。此时它已不在普通流中占有位置。

由于其本身已经处于定位流中,页面中其他元素均处于普通流中,它本身还在窗口级别渲染,其他定位流中元素也无法覆盖它。因此可以断定它会遮挡住其后的 IFRAME 元素显示。

观看实际情况:

IE6 IE7 IE8 Firefox Safari OperaChrome

IE6 IE7 IE8 Firefox Safari Opera 浏览器中显示情况均与相关规范吻合。但是 Chrome 中处于普通流中的 IFRAME 元素却将拥有窗口句柄的定位流中元素覆盖。

造成这个问题的情况只能有一种,即在 Chrome 中 IFRMAE 元素实际上拥有窗口句柄,虽然这个句柄无法使用 SPY++ 等窗口句柄信息查看工具获取到。

根据 window 窗口建立的规律,后建立的窗口会拥有更高的堆栈级别,覆盖于最先建立的窗口上。

我们只需将原始代码中的 IFRAME 元素放置到 OBJECT 元素之前,使它先被创建,观察其是否被后创建的 OBJECT 覆盖,就可以证实这个推测:

<body style="margin:40px;">
  <iframe src="http://www.google.com/logos/
" style="width:240px; height:120px;"></iframe>

  <object type="application/x-shockwave-flash" data="clock.swf
" style="height:80px; width:80px; position:absolute; top:0; left:0;">
    <param value="clock.swf
" name="movie"/>
    <param value="wmode" name="window"/>

  </object>
</body>

观看实际情况:

所有浏览器

根据上表可以看出,实际情况与猜测情况相吻合。

绝对定位元素与 Flash ( wmode = "window" )重叠时,当 'background' 的特性值不是 'transparent' 时, Firefox 中绝对定位元素却可以遮挡 Flash ,其它浏览器都不能遮挡 Flash 。

分析以下代码:

<!DOCTYPE HTML>
<html>
    <head></head>
    <body style="margin:40px;">
  <object type="application/x-shockwave-flash"
    data="clock.swf"
    style="height:80px; width:80px; position:absolute; top:0; left:0;">
    <param value="clock.swf" name="movie"/>
    <param value="wmode" name="window"/>

  </object>
  <div style="top:0;position:absolute;
 left: 0;background: gold;">this is test word this is test word</div>
    </body>
</html>
      

以上代码在不同浏览器中表现如下:

FirefoxIE6 IE7 IE8 Chrome Safari Opera

绝对定位元素是 iframe 时与 Flash ( wmode = "window" )重叠, IE 和 Chrome 中 iframe 会遮挡 Flash ,而Firefox Safari Opera 中 Flash 会遮挡iframe

分析以下代码:

<!DOCTYPE HTML>
<html>
    <head></head>
    <body style="margin:40px;">
  <object type="application/x-shockwave-flash"
    data="clock.swf"
    style="height:80px; width:80px; position:absolute; top:0; left:0;">
    <param value="clock.swf" name="movie"/>
    <param value="wmode" name="window"/>

  </object>
  <iframe src="about:blank" class="cover_iframe" width="200" height="50" frameborder="1" scrolling="no" style="position:absolute;
top:0;left:0;"></iframe>
    </body>
</html>
      

以上代码在不同浏览器中表现如下:

IE ChromeFirefox Safari Opera

有没有办法让 iframe 元素在所有浏览器下都可以遮挡 Flash呢?

分析以下代码:

<!DOCTYPE HTML>
<html>
    <head></head>
    <body style="margin:40px;">
    <embed type="application/x-shockwave-flash"
    src="clock.swf" 
    style="height:80px; width:80px; position:absolute; top:0; left:0;" wmode="transparent">
    </embed>
  <iframe src="about:blank" width="200" height="40" frameborder="1" scrolling="no" style="position:absolute;top:0px;left:0px;background: gold;"></iframe>
    </body>
</html>
      

以上代码在不同浏览器中表现如下:

IEFirefox Chrome Safari Opera

解决方案

若有页面需求是要求其他元素遮挡 Flash

  • 1.使用 EMBED 引入Flash 。
  • 2.wmode的值使用 'transparent' 或 'opaque' 。
  • 3.使用的 iframe 需要设置背景色(设置为白色)。

注意:当wmode的值不是window时,Flash中有可能无法切换输入法,该问题为插件问题,期待插件厂商修复。关于 IE 和非IE浏览器背景色不同的问题请参见RC3001: IE6 IE7(Q) IE8(Q) 中 IFRAME 元素 'background-color' 特性默认值不是 transparent

内容概要:本文介绍了MATLAB实现DBN-RBF深度置信网络结合RBF神经网络多输入单输出回归预测的详细项目实例。项目旨在通过深度置信网络(DBN)和径向基函数神经网络(RBF)的结合,设计出一种高效的回归预测模型,以应对高维数据和非线性关系的挑战。DBN用于无监督特征提取,RBF用于快速回归,两者结合显著提升了预测精度和模型泛化能力。文详细描述了项目的背景、目标、挑战、解决方案、模型架构、代码实现、GUI设计、性能评估及未来改进方向。 适合人群:具备一定编程基础,对机器学习和深度学习有一定了解的研发人员,尤其是从事金融预测、医疗健康、智能制造等领域的工程师和技术人员。 使用场景及目标:①解决高维数据的特征提取难题,提升非线性回归的拟合精度;②通过无监督学习与快速训练能力的结合,提高模型的预测精度和泛化能力;③应用于金融预测、医疗健康、智能制造等多个领域,提供高效的回归预测工具;④通过实时数据流处理和GPU加速推理,确保系统在实时应用的快速响应。 其他说明:此项目不仅提供了详细的理论分析和代码实现,还涵盖了系统架构设计、模型部署与应用、安全性与用户隐私保护等方面的全面指导。通过结合其他深度学习模型、多任务学习、增量学习等技术,项目具备广阔的扩展性和应用前景。系统还支持自动化CI/CD管道、API服务与业务集成、前端展示与结果导出等功能,确保了系统的高可用性和易用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值