- 浏览: 2158882 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
HTML 的空白符处理规则
HTML 中的“空白符”包括空格 (space)、制表符 (tab)、换行符 (CR/LF) 三种。
我们知道,在默认情况下,HTML 源码中的空白符均被显示为空格,并且连续的多个空白符会被视为一个,或者说,连续的多个空白符会被合并。
然而在有些时候,我们希望 HTML 源码中的多个连续空格在网页浏览器中可以真实地呈现,或者需要源码中的换行符能起到真正的换行作用。于是,我们发现了 <pre> 标签,它可以真实还原它内部文本的空白符的真实情况。
于是我们经常会把一段表示计算机代码的文本放进 <pre> 标签中,它们在浏览器中会表现出自身的空格缩进和换行效果,而不需要我们增加额外的样式和标签来控制它的缩进和换行。
随着对 CSS 的了解不断深入,我们发现,原来这一切都是 white-space 属性在安排。<pre> 元素之所以如此神奇,是因为它自身具有 {white-space: pre;} 这一默认样式。
white-space 属性
CSS 中的 white-space 属性用于设置文本空白符的处理规则,这其中包括:是否合并空白符、是否保留换行符、是否允许自动换行。各属性值的不同行为如下表所示:
white-space 属性值一览表
normal |
合并 | 忽略 | 允许 | CSS 1 |
nowrap |
合并 | 忽略 | 不允许 | CSS 1 |
pre |
保留 | 保留 | 不允许 | CSS 1 |
pre-wrap |
保留 | 保留 | 允许 | CSS 2.1 |
pre-line |
合并 | 保留 | 允许 | CSS 2.1 |
(注:在 CSS1/2 下,white-space 属性只可应用于块级元素;在 CSS 2.1 下,可应用于所有元素。)
如果我们需要某个容器元素具有类似 <pre> 元素的空白符处理行为,则为它设置 {white-space: pre;} 样式即可。
对 pre-wrap 的需求
我们先解释一下上述表格中的“自动换行”行为,它是指某元素内部的文本流按照文本方向排版,当文本流遇到限制其继续延伸的边界时,是否换行。“不允许自动换行”则意味着文本流会溢出该元素。
因此,{white-space: pre;} 样式有时候并不能满足我们的期望。比如,在某些不需要特别严谨的场合,或者排版某些对换行不敏感的代码片断(比如 HTML 或 CSS)的时候,我们不希望代码片段中的一行长代码令它的容器元素产生水平滚动条,因为那样不便阅读。我们希望在这种情况下,长代码自动换行就好。
这时,对照一下上表中各属性值的不同行为特征,我们会发现 pre-wrap 这个属性值脱颖而出——它正是我们所需要的。
对 pre-wrap 的另一种需求
再来看另一种实战中可能会遇到的情形。
表单中的文本域(<textarea> 元素)可以接受包含换行符的文本数据,这是它有别于文本框(text 类型的 <input> 元素)的重要特征之一,所以我们通常也称它为“多行文本框”。
随之而来的一个问题就是,我们通过多行文本框提交多行文本数据,是为了在网页上最终显示出多行文本。但由于浏览器对 HTML 源代码默认进行空白符合并处理,为了确保我们提交的多行文本数据最终在网页上正确地呈现出多行的形态,通常需要在服务器端做处理,比如将文本中的换行符转换为 HTML 的换行标签 <br>,再写入数据库;或者从数据库中读出文本数据时进行类似的转换操作。
这样当服务器向网页输出这些文本数据时,原始的回车状态才能得到再现。
但是,由于设计失误(或系统有意限制),服务器端可能就不会做这样的处理。从而导致这些文本信息中的换行符无法呈现出换行效果,取而代之的是一个小空格。
(下图为 cnBeta 网站对评论文本的两种不同处理方式:左侧为普通评论,可能为了限制各条评论的高度、防止恶意刷屏,系统未做换行符转换处理;右侧为热门评论,系统进行了处理。)
如果服务器端因为疏忽没有做换行符转换处理,那么在前端是否可以用最小的代价来补救?这时,pre-wrap 就可以发挥作用——无需做任何的额外处理,直接为文本的容器元素设置 {white-space: pre-wrap;} 样式,就可以还原多行文本的真实状态。
杯具的 IE6 和 IE7
再来看一下上面的表格,我们发现 pre-wrap 是从 CSS 2.1 才开始引入的属性值。然而,目前网民使用最为广泛的 IE6 和 IE7 浏览器都是基于 CSS1 和部分 CSS2 的,它们完全不能识别 pre-wrap,当然也无法实现 pre-wrap 的空白符处理行为。
在疯狂地问候了微软、IE 及其相关人等之后,网页开发者们还是不得不面对这个问题——如何在 IE6,7 下实现 pre-wrap 的效果?
在 IE6,7 下变通实现 pre-wrap
经常反复测试,我们找到了在 IE6,7 下变通实现 pre-wrap 效果的方法。
比如,有如下 HTML 结构:
<div class="content">这是一段多行文本数据其中某些文本行会非常长从而溢出容器比如你现在看到的这行行与行之间有换行符但没有使用 HTML 换行标签</div>
我们需要将 .content 元素设置为 pre-wrap 样式,理想情况下只需要编写如下 CSS 代码就可以了。、
以下为引用的内容: .content { |
但为了应付 IE6,7,我们需要将上述 CSS 代码修改如下:
以下为引用的内容: .content { |
这样就可以了,我们在各浏览器中实测一下,可以发现我们需要的效果完美实现。
当然,你可能注意到了,我们使用了一点儿 CSS hack。别担心,它们条理清晰并且容易维护,我觉得这可以接受。在面对低能浏览器的时候,我们只能给予它们一些额外关照。
原理
如果你是一个实用主义者,那么文章到这里已经结束了。你可以把代码存下然后走人,或者继续浏览 CSS魔法 的其它文章。如果你是一个充满好奇心的 CSS 学习者,那么我很乐意与你一起来分析一下它的实现原理。
在上面的最终版 CSS 代码中,很显然对于标准浏览器,我们是用正常的 {white-space: pre-wrap;} 来实现所需效果的。而对于 IE6,7,我们使用了 CSS hack,让它接受额外的样式声明,使用其它方法来实现类似 pre-wrap 的效果。
首先,在 IE6,7 下,{white-space: pre-wrap;} 这条样式声明由于不能识别而被丢弃,于是我们为 .content 另外设置了 {white-space: pre;} 的样式。我们已经很熟悉 pre 了,它的特性与我们想要的 pre-wrap 效果只有一点区别,即 pre 不允许自动换行,也就是说,较长的文本行可能会溢出其容器元素。
因此,接下来,为了让这些较长的文本行自动换行,我们为 .content 元素设置 {word-wrap: break-word;} 样式(谨慎起见,我们用 CSS hack 将这条声明隔离给 IE6,7;不过即使将它暴露给所有浏览器,它也是无害的)。这条声明负责对 .content 元素内的文本行进行约束,并强制其换行。也就是说,{white-space: pre;} 完成了识别文本换行符的任务,剩下的自动换行的任务交由 {word-wrap: break-word;} 来完成。
插播 word-wrap 的相关资料
CSS 发展至今经历了多个版本,但它对文本排版的控制仍然不够精确和灵活。于是微软的 IE 浏览器开发了一些私有属性,扩展了 CSS 的文本排版功能,尤其可贵的是,这些扩展属性大多考虑到了非拉丁语系语言的排版规则。由于这些私有扩展属性确实很有价值,它们被整理并收录到了 CSS3 草案中。
word-wrap 属性就是其中很有代表性的例子。它决定了文本行超过容器的边界时是否断开转行。目前这一属性已经得到了绝大多数主流浏览器的支持。
回到前面的原理分析,其实我们会发现一个矛盾,{white-space: pre;} 很倔犟地不愿换行,而 {word-wrap: break-word;} 则要求内部文本自动换行。面对这样的冲突,浏览器如何决断?
在 CSS 中,控制文本换行方式的属性有很多,当发生冲突的时候,某些属性在文本排版中的优先级更高,因而会在冲突中胜出,决定最终的文本样式。很显然,在上面的这起冲突中,{word-wrap: break-word;} 更加强势,倔犟的文本行最终还是乖乖地换行了。
结语
感谢你看到了这里,希望这篇文章对你有所帮助!
发表评论
-
UML
2010-08-09 11:39 1303开放分类:计算机技术计算机术语计算机科学 收藏分享到顶[6] ... -
用WebService实现调用新浪的天气预报功能
2010-07-15 21:47 2973用WebService实现调用新 ... -
Cookie简介及JSP处理Cookie的方法
2010-07-29 09:28 970Cookie简介及JSP处理Cookie的方法 一.什么是 ... -
SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
2010-06-09 22:16 1256一直想把数据库的默认 ... -
C#Winform调用网页中的JS方法
2010-07-12 11:07 2230其实还是还是相当的简单,本文将详细的用代码来展示一下如何调用, ... -
用WebService实现调用新浪的天气预报功能
2010-07-15 21:47 1508用WebService实现调用新 ... -
SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径修改方法
2010-06-09 22:16 1085一直想把数据库的默认 ... -
基于 VS 2010 阐述C# 4个特性
2010-05-28 09:26 1078基于 VS 2010 阐述C# 4个特性基于 VS 20 ... -
Google AdSense中文官方博客今天公布了AdSense内容广告与AdSense搜索广告的收入分成比例
2010-05-25 09:12 1122google adsense 的广告分成比例总算是公布出来了。 ... -
权限管理数据表设计说明
2010-05-21 15:19 1082权限管理数据表设计说明 B/S系统中的权限比C/S中的更显的 ... -
权限管理的设计方法
2010-05-20 09:26 1427权限管理的设计方法是 ... -
多表分页存储过程
2010-05-17 14:25 1058分页存储过程 在网站设计,网页开发中,是要被经常遇到的。 ... -
vs2010跟vs2008比较增加了哪些功能
2010-05-18 09:10 2253随着vs2010的发布,新的 ... -
COM域名难逃实名监管 CN域名简化流程抢用户
2010-05-13 09:22 1188互联网实名制的落实第 ... -
网站安全之XSS漏洞攻击以及防范措施
2010-04-29 08:59 1425在网站开发中,安全问题是重中之重的问题,特别像一个sql注入, ... -
深入了解ASP.NET运行内幕
2010-04-28 09:04 1170做事情要知道根本所在 ... -
WebBrowser中显示乱码
2010-04-22 09:09 1737最近在开发cs项目的时候,因为嵌套了一个网页,要用到we ... -
vps配置笔记(10)架设svn服务
2010-04-21 09:41 1263linux 下面架设svn服务器,有点难度,我找了好多资料,现 ... -
IEnumerable
2010-04-16 09:12 1271在平常的代码编写中,虽然不常用到Ienumerable 但却不 ... -
JS代码实例:实现随机加载不同的CSS样式
2010-04-19 13:38 1419如果让网页浏览者每次打开页面都有新的感觉,可以通过替换css样 ...
相关推荐
然而,`pre-wrap` 在 Internet Explorer 6 (IE6) 和 Internet Explorer 7 (IE7) 这两个较老的浏览器版本中不受支持。这两个浏览器遵循CSS1和部分CSS2标准,不包含`pre-wrap`这个属性值。因此,为了在这些浏览器中...
.pre-wrap-style { white-space: pre-wrap; } /* 自动换行,合并空白 */ .normal-style { white-space: normal; } ``` 需要注意的是,`white-space: nowrap` 只会影响元素内的文本,如果子元素设置了换行,那么...
在IE6中,如果使用white-space:pre;,所有内容(包括长英文字符串)都会撑开容器。而使用white-space:nowrap;时,长英文字符串或中文长句都将在溢出容器时不会换行。 以上属性在使用时要考虑到不同浏览器的支持情况...
在做企业站的英文版的时候,英文单词由于剩下的空间不足,导致整个单词都换行,造成单词之间的空隙太大。如下图: 使用css属性word-break:break-all;...overflow:hidden 隐藏 white-space:normal 默认 pre 换行
white-space: nowrap | normal | pre | pre-wrap | pre-line | break-spaces; } ``` - `normal`(默认值):允许正常换行,即空格会被合并,多余的换行也会被忽略。 - `nowrap`:强制在同一行内显示所有文本,直到...
white-space: pre-wrap; white-space: -moz-pre-wrap; word-wrap: break-word; }`。然后,可以在其他样式中调用,例如 `pre { .wrap }`。输出结果为 `pre { text-wrap: wrap; white-space: pre-wrap; white-space: ...
查看资料 ... 设置 ... ... 在移动设备上,创建一个具有适当名称的书签,例如“ View Source 。 在URL字段中,输入... white-space : pre-wrap; word-wrap : break-word; } 美化HTML Beautify HTML有许多选项可以自定义HTM
6. **进阶技巧:** 除了基本用法,还可以结合CSS动画和JavaScript事件监听,创建更复杂的交互效果,比如在特定事件触发打印,或者与其他页面元素联动。 7. **版本更新与社区支持:** 开源项目通常会有持续的维护和...
#### 知识点四:IE6 和 IE7 的特殊处理 IE6 和 IE7 是比较古老的浏览器,在这些版本中,某些CSS特性支持不完善,需要特殊处理才能达到预期的效果。文档中提到了以下几点: - **IE6 和 IE7 的 `word-wrap` 支持**:...
如果需要兼容旧版本的浏览器,可以添加其他前缀的 `white-space` 属性值,如 `-moz-pre-wrap`(针对早期的 Mozilla 浏览器)、`-pre-wrap`(Opera 4-6)和 `-o-pre-wrap`(Opera 7)。 以下是一个完整的 CSS 样式...
如果只关注现代浏览器,可能只需要 `word-break: break-word` 和 `word-wrap: break-wrap` 或 `white-space: pre-wrap` 就足够了。然而,为了确保广泛兼容性,上述代码提供了全面的覆盖。 最后,别忘了设置容器的...
pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。...复制代码代码如下: pre{ white-space:pre-wrap; /* css3.0 */ white-space:-moz-pre-wrap; /* Firefox */ white-space:-pre-w
通过F12元素查看,在对应的样式中加入white-space:pre-wrap,该样式的主要作用是识别字符串中的换行符”\n”,故需要在待展示的信息字符串中加入相应的换行标识符。 在$notify消息提示中,作用于el-notification: ...
white-space:pre-wrap; 只对中文起作用,强制换行 4. white-space:nowrap; 强制不换行,都起作用 5. white-space:nowrap; overflow:hidden; text-overflow:ellipsis;不换行,超出部分隐藏且以省略号形式出现(部分...
- `-pre-wrap`: Opera 4-6版本的等效属性。 - `pre`: 空白符序列被保留,且不折叠。 - `pre-wrap`: 保留空白符序列,同时折叠行尾空白符,自动换行。 - `pre-line`: 合并空白符序列,但保留换行符作为空白符。 ...
margin:7px 6px 9px 0;vertical-align:middle}.bdsug .bdsug-direct p span{margin-left:8px}.bdsug .bdsug-direct p i{font-size:12px;line-height:100%;font-style:normal;font-weight:normal;color:#fff;...
`white-space: pre-wrap`允许空白字符保留,而`word-wrap: break-word`则允许长单词在必要时断行,从而实现多行`placeholder`的效果。 需要注意的是,这种做法依赖于Webkit内核的浏览器支持,对于非Webkit内核(如...