这个问题非常经典,因为 IE 对 HTML 和 CSS 的支持与现代浏览器(如 Chrome, Firefox, Edge)有很大差异。

问题根源
在 IE 中,<marquee> 默认的行为是 scroll(滚动),并且它会尝试将内容压缩在一行内显示,即使内容本身包含了换行符(如 <br> 标签或 CSS 的 white-space: pre-line),而在现代浏览器中,<marquee> 虽然已不推荐使用,但默认会尊重内容的换行。
解决方案
主要有两种解决方案:一种是纯CSS方法(推荐),另一种是修改织梦模板文件(不推荐,因为 <marquee> 已过时)。
纯CSS方法(强烈推荐)
这是最现代、最标准的解决方案,不依赖于过时的 <marquee> 标签,并且能兼容所有浏览器,包括 IE。
核心思路: 使用 CSS 的 @keyframes 动画来模拟 marquee 的滚动效果,并利用 white-space 和 overflow 属性来控制换行。

第1步:在织梦模板文件中添加CSS样式
打开你使用 <marquee> 标签的织梦模板文件(index.htm, article_list.htm 等),在 <head> 标签内找到 <style> 标签,如果没有就创建一个。
在 <style> 标签内加入以下CSS代码:
/* 首先定义一个通用的滚动容器样式 */
.marquee-container {
width: 100%; /* 设置你需要的宽度 */
overflow: hidden; /* 隐藏超出容器的内容 */
position: relative; /* 为内部动画定位提供参考 */
border: 1px solid #ccc; /* 可选:添加边框方便查看 */
padding: 5px 0; /* 可选:增加内边距 */
white-space: nowrap; /* 强制内容不换行,这是实现无缝滚动的关键 */
}
/* 定义滚动动画 */
.marquee-container .marquee-content {
display: inline-block; /* 必须是行内块元素才能水平排列 */
padding-left: 100%; /* 初始位置偏移一个容器的宽度,实现从右向左 */
animation: scroll-left 15s linear infinite; /* 应用动画:名称、时长、线性、无限循环 */
}
/* 定义动画关键帧 */
@keyframes scroll-left {
0% {
transform: translateX(0); /* 初始位置 */
}
100% {
transform: translateX(-100%); /* 向左移动一个自身的宽度,实现无缝滚动 */
}
}
/* ------------------------- 关键部分:处理多行换行 ------------------------- */
/* 这是解决IE换行问题的核心 */
.marquee-container-ie-fix {
white-space: normal !important; /* 覆盖上面的 white-space: nowrap; */
line-height: 1.5em; /* 设置行高,让多行内容有间距 */
}
/* 将动画内容也设置为多行模式 */
.marquee-container-ie-fix .marquee-content {
white-space: normal !important;
display: block; /* 改为块级元素,让内容自然换行 */
padding-left: 0; /* 重置内边距 */
animation-name: scroll-vertical; /* 改为垂直滚动动画 */
animation-duration: 20s; /* 调整滚动速度 */
}
/* 定义垂直滚动动画 */
@keyframes scroll-vertical {
0% {
transform: translateY(0);
}
100% {
transform: translateY(-100%); /* 向上移动一个自身的高度 */
}
}
第2步:修改HTML结构
将你原来的 <marquee> 标签替换为新的HTML结构。
原来的代码可能像这样:
<marquee behavior="scroll" direction="up" scrollamount="2"> 这里是第一行内容<br> 这里是第二行内容<br> 这里是第三行内容,内容可能很长,需要换行显示 </marquee>
修改后的代码(以垂直滚动为例):
<div class="marquee-container marquee-container-ie-fix">
<div class="marquee-content">
这里是第一行内容<br>
这里是第二行内容<br>
这里是第三行内容,内容可能很长,需要换行显示
</div>
</div>
代码解释:
- 外层容器
<div class="marquee-container marquee-container-ie-fix">:marquee-container:应用了基础滚动样式。marquee-container-ie-fix:这是解决IE换行问题的关键,它通过white-space: normal !important强制内容按照正常方式换行。
-
<div class="marquee-content">:- 在IE修复模式下,它被设置为
display: block和white-space: normal,这样里面的<br>标签和长文本就能正常换行。 - 动画也相应地改为了垂直滚动
scroll-vertical。
- 在IE修复模式下,它被设置为
第3步:根据需求调整
- 水平滚动:如果你需要水平滚动并且内容很长(比如新闻标题列表),你需要复制一份CSS,去掉
-ie-fix相关的样式,并确保内容在一行内,这种情况下,内容本身不应该包含换行符。 - 滚动速度:调整
animation-duration的值,数值越大,滚动越慢。 - 滚动方向:
- 水平向左:使用上面提供的
scroll-left动画。 - 水平向右:修改
@keyframes,初始transform: translateX(-100%),结束transform: translateX(0)。 - 垂直向上:使用上面提供的
scroll-vertical动画。 - 垂直向下:修改
@keyframes,初始transform: translateY(-100%),结束transform: translateY(0)。
- 水平向左:使用上面提供的
修改织梦模板(不推荐,仅作了解)
如果你因为某些原因必须使用 <marquee> 标签,可以通过添加特定的CSS属性来尝试让IE支持换行。
在 <marquee> 标签内添加 loop="true" 和 width="100%",并配合CSS。
HTML:
<marquee behavior="scroll" direction="up" scrollamount="2" style="white-space:normal; width:100%;"> 这里是第一行内容<br> 这里是第二行内容<br> 这里是第三行内容,内容可能很长,需要换行显示 </marquee>
CSS (在 <head> 中):
/* 针对 IE 的特定修复 */
/* 在 IE8 及以下版本中,可能需要使用这个 hack */
* html marquee {
white-space: normal;
width: 100%;
}
/* 或者更通用的写法 */
marquee {
white-space: normal; /* 告诉浏览器允许换行 */
width: 100%; /* 让 marquee 占据全宽,以便内容有空间换行 */
}
为什么不推荐这个方案?
<marquee>已过时:<marquee>标签是微软的私有标签,早已被 W3C 废弃,现代浏览器可能在未来完全移除对它的支持。- 兼容性差:即使添加了
white-space: normal,在某些旧版本的 IE 中仍然可能不生效,需要非常具体的 hack。 - 样式控制弱:使用 CSS 动画(方案一)可以更精细地控制滚动速度、暂停、悬停等效果。
| 特性 | 方案一 (CSS动画) | 方案二 (<marquee>
|
|---|---|---|
| 推荐度 | ⭐⭐⭐⭐⭐ 强烈推荐 | ⭐ 不推荐 |
| 标准性 | 符合W3C标准,是现代网页开发实践 | 非标准,已废弃的标签 |
| 兼容性 | 兼容所有现代浏览器和IE | 仅兼容IE,且行为不稳定 |
| 可扩展性 | 强大,可轻松实现暂停、悬停等效果 | 弱,功能有限 |
| 换行控制 | 通过CSS white-space 精确控制 |
依赖hack,不可靠 |
最终建议: 请务必采用方案一,虽然初期设置代码稍多,但它是解决此问题的最佳实践,能让你的网站在现在和未来都保持良好的兼容性和可维护性。
