整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用CSS3 box-decoration-brea

使用CSS3 box-decoration-break特性实现多行文本样式

文章中的长文本被自动断行为多行文本时,其样式可能会出乎我们的设计。本文介绍如何使用CSS3中的box-decoration-break特性来处理多行元素样式。

按照规范定义,box-decoration-break被用来处理分页(page-break)或断行(line-break)时元素的样式。默认情况下,当我们设置元素背景(background)或边界(border)时,这个样式被应用在整个元素上,

即使被断行也是如此,比如下面的块元素:

样式代码如下:

div.test{background: orange;}

块状元素的样式被应用在整个block上,结果如下:

如果我们想实现下面的背景效果:

可以把块元素(block)换成行内元素(inline):

span.test{background: orange;}

可以看到尽管被断成了多行,border和padding样式仍然被当作整行作用在文本上。如果要想把样式应用到每个断行文本上,即如下的预期效果:

这个时候就需要使用CSS3新引入的“实验”特性:box-decoration-break,把box-decoration-break设置为clone,即可获得上面的效果,其实现原理是把长文本切分成多个短文本,然后分别在每个短文本上应用样式。

IV+CSS标准化布局的优势

使用“DIV+CSS”对网站进行布局符合W3C标准,采用这种方式布局通常是为了说明与HTML表格定位方式的区别。因为现在的网站设计标准中,已经不再使用表格定位技术,而是采用DIV+CSS的方式实现各种定位。通过使用div盒子模型结构将各部分内容划分到不同的区块,然后用css来定义盒子模型的位置、大小、边框、内外边距、排列方式等。简单地说,div用于搭建网站结构(框架)、css用于创建网站表现(样式/美化)。该标准简化了HTML页面代码,获得一个较优秀的网站结构,有利于日后网站维护、协同工作和便于搜索引擎抓取。当然并不是所有的网页都需要用div布局,例如数据页面、报表之类的页面,还是使用HTML的表格会比较方便,web标准里并没有说要抛弃table。

DIV+CSS标准的优点

  • 表现和内容相分离
  • 代码简洁,提高页面浏览速度
  • 易于维护和改版
  • 提高搜索引擎对网页的索引效率

各个浏览器之间的差异

  • 安装多种浏览器,对比差异进行调试
  • 在FF浏览器中安装firebug

Firebug 为你的 Firefox 集成了浏览网页的同时随手可得的丰富开发工具。你可以对任何网页的 CSS、HTML 和 JavaScript 进行实时编辑、调试和监控

就算在不同的浏览器中效果不完全一致,也要做到大概一至

“无意义”的元素div和span

  • HTML只是赋予内容的手段,大部分HTML标签都有其意义(例如,标签p创建段落,h1标签创建标题等等)的,然而div和span标签似乎没有任何内容上的意义,听起来就像一个泡沫做成的锤子一样无用。但实际上,与CSS结合起来后,它们被用得十分广泛。你所需要记住的是span和div是“无意义”的标签。它们的存在纯粹是应用样式,所以当样式表失效时它就没有任何的作用
  • 它们被用来组合成一大块的HTML代码并赋予一定的信息,大部分用类属性class和标识属性id与元素联系起来。span和div的不同之处在于span是内联的,用在一小块的内联HTML中。而div(division)元素是块级的(简单地说,它等同于其前后有断行),用于组合一大块的代码,为HTML 文档内大块的内容提供结构和背景的元素,可以包含段落、标题、表格甚至其他部分,这使div便于建立不同集成的类。
  • div的起始标签和结束标签之间的所有内容都是用来构成这个块的,其中所包含元素的特性由div标签的属性来控制,或者是通过使用样式表格式化这个块来进行控制。

盒子模型

每个HTML元素都可以看作一个装了东西的盒子,盒子具有宽度(width)和高度(height),盒子里面的内容到盒子的边框之间的距离即填充(padding),盒子本身有边框(border),而盒子边框外和其他盒子之间,还有边界(margin)。

布局中的主要样式

  • font
  • line-height
  • color
  • margin
  • padding
  • border
  • text-align
  • background

定位属性

区块属性(区块模型)

区块框浮动

虽然使用绝对定位可以实现页面布局,但由于调整某个区块框时其它区块的位置并不会跟随着改变,所以并不是布局的首选方式。而使用浮动的区块框可以向左或向右移动,直到它的外边缘碰到包含它区块的边框或另一个浮动框的边框为止。并且由于浮动框不在文档的普通流中,所以文档的普通流中的区块框表现得就像浮动框不存在一样。

设置浮动

行框和清理

在进行页面布局时,经常需要设置多个区块框并列在一行中排列。最常见的方式就是使用float属性,再通过left或right值移动区块框向左或向右浮动。但当前面并列的多个区块框总宽度不足包含框的100%时,就会在行框中留出一定的宽度,而下面的某个区块框又恰好满足这个宽度,则很可能会向上提,和上一行并列的区块框在同一行排列。而这不并是我们想要的结果,所以可以使用clear属性解决这一问题,该属性的值可以是 left、right、both 或 none,它表示框的哪些边不应该挨着浮动框。

使用区块框设计页面布局

  • 区块居中设计

高度和宽度固定的区块居中(position)

高度和宽度可变的区块居中(margin)

  • 布局页面居中
  • 设置两列浮动的布局
  • 设置三列浮动的布局
  • 设置多列浮动的布局

零宽空格的实现原理

零宽空格(Zero Width Space, ZWSP)是一个特殊的Unicode字符,编码为U+200B。它是一个不可见的字符,其宽度为零,不占用任何可见空间。在文本处理系统中,尽管它在视觉上是不可见的,但它在文本中确实存在,并可以作为潜在的断点,即允许在此位置断开行。这意味着如果一行文本过长需要自动换行时,文本可以在零宽空格的位置进行折行,而不影响单词的完整性。

应用场景

  1. 文本格式化和断行控制
  2. 在不允许在单词内自动换行的语言或特定格式中,零宽空格可以插入到长单词或URL中,允许这些文本在不影响阅读的情况下进行合适的换行。
  3. 在HTML和其他Web内容中,零宽空格常用于长无空格字符串的断行控制。
  4. 隐秘标记和文本隐藏
  5. 零宽空格可以用于在文本中隐藏信息,因为它在视觉上不可见。例如,可以通过在特定位置插入零宽空格来编码额外信息,这种技术有时用于数字水印或隐藏的标记。
  6. 在某些安全领域,零宽字符用于对抗自动文本分析工具,通过在文本中嵌入这些字符来“污染”数据,使自动处理变得更困难。
  7. 程序和网页开发
  8. 在编程中,特别是在Web开发中,零宽空格可以帮助处理和显示不断行的长字符串,如路径或特定代码段。
  9. 在用户界面开发中,零宽空格可以用来调整或微调文本显示,尽管这通常不是最佳实践。
  10. 排版和设计
  11. 在复杂的排版设计中,设计师可能使用零宽空格来精确控制文本的布局和行间距,尤其是在多语言排版中。
  12. 在电子书和PDF文档中,零宽空格可以帮助实现更优雅的文本格式,尤其是在处理多种语言和脚本时。

注意事项

虽然零宽空格在许多情况下都是有用的,但它也可能引起问题,特别是在文本处理和数据清洗中。不注意这些看不见的字符可能导致数据的意外错误、搜索失败、数据不一致等问题。因此,在处理来自不同源的文本数据时,了解和考虑这些不可见字符是非常重要的。

2 在Python中处理零宽空格

(Zero Width Space, Unicode编码为U+200B)通常可以通过字符串的替换操作来实现。这里有几种常见的方法来去除字符串中的零宽空格:

方法1: 使用str.replace()

str.replace() 方法是去除字符串中特定字符的一种直接方式。你可以使用它来替换零宽空格为一个空字符串:

original_string="This is a test\u200b string with zero width space."
cleaned_string=original_string.replace('\u200b', '')
print(cleaned_string)

这个方法将去除字符串中所有的零宽空格。

方法2: 使用正则表达式

如果你需要去除字符串中的多种不可见字符,包括零宽空格,使用正则表达式是一个更强大的选择。Python的 re 模块可以帮助实现这一功能:

import re

original_string="This is a test\u200b string with zero width space."
cleaned_string=re.sub(r'\u200b', '', original_string)
print(cleaned_string)

这个方法同样可以针对多种类型的不可见字符进行调整,只需修改正则表达式即可。

方法3: 使用translate()

另一个选项是使用字符串的 translate() 方法。这种方法可以在一个步骤中删除字符串中的多个不同类型的字符:

original_string="This is a test\u200b string with zero width space."
remove_chars=dict.fromkeys([0x200b], None)
cleaned_string=original_string.translate(remove_chars)
print(cleaned_string)

这里,我们创建了一个字典,指定要删除的字符(零宽空格的Unicode编码是0x200B)映射到 None,这意味着这些字符将被删除。

方法4: 清除所有Unicode控制字符

去除字符串中所有的Unicode控制字符(包括但不限于零宽空格),可以使用更通用的正则表达式:

import re

original_string="This is a test\u200b string with zero width space."
cleaned_string=re.sub(r'[\u200B-\u200D\uFEFF]', '', original_string)
print(cleaned_string)

这里,正则表达式涵盖了多个常见的Unicode控制字符。

3 常见的Unicode控制字符

在 Unicode 中,\u200B, \u200C, \u200D 以及 \uFEFF 分别代表一些特定的不可见字符,它们的用途和行为在文本处理中各有不同。这里是每个字符的详细说明:

\u200B - 零宽空格 (Zero Width Space, ZWS)

  • Unicode 编码:U+200B
  • 描述:一个不可见的分隔符,不占任何空间,用于可能的换行点。它允许在其点处断行,而不显示任何字符。

\u200C - 零宽非连接符 (Zero Width Non-Joiner, ZWNJ)

  • Unicode 编码:U+200C
  • 描述:在需要字符独立显示而不是与前后字符联合时使用。在一些书写系统如阿拉伯语和波斯语中非常有用,用于控制字符的连写表现。

\u200D - 零宽连接符 (Zero Width Joiner, ZWJ)

  • Unicode 编码:U+200D
  • 描述:用于促使两个字符生成一个单独的合成字符。常用于一些复杂书写系统的特定字形显示,或在新兴的表情符号序列中,如家庭组合或肤色变化的表情符号。

\uFEFF - 字节顺序标记 (Byte Order Mark, BOM)

  • Unicode 编码:U+FEFF
  • 描述:在 UTF-16 和 UTF-32 的编码序列中用作字节序的标记。在 UTF-8 中,虽然不必要,但有时用作标识文件是以 UTF-8 编码的标记。当用作普通文本中时,它通常被视为零宽不换行空格 (Zero Width No-Break Space)。

用途和影响

这些字符在现代文本处理和网络内容中扮演着关键角色,尤其是在多语言和多脚本环境中,它们帮助实现了细微的文本格式控制和视觉表现。然而,它们也可能导致文本处理上的问题,比如字符串匹配失败、文本渲染异常等,因此在处理文本数据时需要特别注意这些不可见字符的存在。在数据清洗和预处理阶段移除或适当处理这些字符,是确保数据质量和应用稳定性的重要步骤。