打印

BW5008: WebKit 中 MARQUEE 元素 的 behavior 属性值为 alternate 时如果其中包含块级元素则会影响其滚动效果

作者:钱宝坤

标准参考

问题描述

MARQUEE 标记中存在 "behavior" 值为 "alternate" 时,MARQUEE 标记内的处于普通流中块元素的交替往复移动效果消失。

造成的影响

在 Chrome Safari 中 MARQUEE 标记失效。

受影响的浏览器

Chrome Safari  

问题分析

MARQUEE 不属于 W3C 规范中的元素,它最初由 IE2.0 引入,然而目前它以成为事实标准,所有浏览器均支持 MARQUEE 元素。

参考 MSND BEHAVIOR Attribute | behavior Property 中的相关说明。

参考 Mozilla Developer Center marquee 中的相关说明。

参考 Safari Reference Library Attribute behavior 的相关说明。

分析以下代码:

<marquee width="500" behavior="alternate">
  <div style="width:50px; height:50px; background:black;"></div>
</marquee>

代码中 MARQUEE 标记使用了 behavior="alternate" 属性值,期望内部的 DIV 块元素可以交替反复移动。

但在 Chrome Safari 中会失去 MARQUEE 效果。

如果将其内 DIV 标记的 'display' 值变更为 'inline' 或 'inline-block',抑或加入 'float:left' 样式,均可以重新获得 MARQUEE 效果,如:

<marquee width="500" behavior="alternate">
  <div style="width:50px; height:50px; background:black; float:left;"></div>
</marquee>

这些样式属性修改最终影响的是块级标记的实际宽度,虽然之前 DIV 标记已经被设置了远远小于容器 MARQUEE 的宽度,实际上在 Webkit 内核浏览器中并没起到作用,MARQUEE标记依然认为其内部容器的宽度与它相同,交替反复移动效果无法支正常体现出来。

直到其子容器的显示样式被修改为非块级元素或进入浮动流重新计算了子容器宽度后,MARQUEE 标记才认为其内部空间足够子元素做交替反复移动,此时运动效果立现。

解决方案

在 MARQUEE 标记内避免使用普通流中的块级元素,或用脚本程序模拟 MARQUEE 标记的效果。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6
Chrome 4.0.302.3 dev
Safari 4.0.4
Opera 10.51
测试页面: marquee.html
本文更新时间: 2010-07-28

关键字

WebKit MARQUEE behavior alternate block-level element 块级元素 不滚动