文本布局傻傻分不清楚?换行?折叠?溢出?

246 阅读4分钟

CSS3-文本布局

​#前端#​ ​#css#​

text-overflow

text-overflow影响块容器元素在内联前进方向上的溢出的内容,开发人员可以通过这个属性来设置溢出内容的展示形式,但是它不能影响块元素在底部方向的溢出。text-overflow属性不能单独生效,它需要和overflow和white-space一起使用,此时,white-space必须设置为nowrap或者pre,防止文本因为父元素宽度限制而被动换行。同时,使用text-flow必须要对该元素设置宽度。

text-overflow可以将溢出内容的展示形式设置为折叠、省略或者其他自定义字符串。

CSS PropertyCSS Values
text-overflow
clip
ellipsis
<string>
fade
*fade()*​

white-space

white-space属性用于设置元素内部的空白如何展示,空白主要包括空格,退格,换行等。这个设置的内容主要包括两个部分:

  1. 空白部分是否需要折叠,如何折叠
  2. 行上的换行是否换行以及如何换行

|CSS Property
|CSS Values
|备注
|||||

显式换行空格和Tab被动换行行尾空格和Tab行尾其他空白
white-space
normal折叠合并换行去除保留原样
nowrap折叠合并不换行去除保留原样
pre保留原样保留原样不换行去除不换行,保留在同一行
pre-wrap保留原样保留原样换行保留原样保留原样
pre-line保留原样合并换行去除保留原样
break-spaces保留原样保留原样换行换行换行

显式换行:\n​和 <br />​,被动换行:父元素宽度限制导致的文本换行

overflow

overflow属性用于控制当元素内部内容溢出容器时的显示和处理方式,当你使用这个属性时,必须限制元素的宽度或者高度,否则外部元素尺寸无限撑开,内部内容将永远无法溢出容器。

CSS PropertyCSS Values备注
overflow
visible默认值,不进行裁剪
hidden裁剪溢出部分,进行隐藏
scroll溢出部分显示滚动条,即便不溢出,也会显示一个滚动条
auto溢出时显示滚动条,不溢出不显示滚动条
overflow-xvisible, hidden, scroll, auto单独设置水平轴方向的溢出
overflow-y
visible, hidden, scroll, auto单独设置垂直轴方向的溢出

word-break

word-break指定怎么在单词内断行。当然,这也需要外部容器有一个宽度或者最大宽度的限制,否则容器内容不会设计到被动换行的断行断字行为。对于CJK文本来说,word-break的默认行为很简单,如果行内放不下就换行,但是对于非CJK文本(C: 中文,J:日文,K:韩文),比如英文,因为换行必须考虑单词的完整性,浏览器对于word-break的处理就比较复杂了,情况如下:

  1. 浏览器按照空格来识别单词,默认情况下,行内放不下文本时,浏览器也不会在单词内自动换行。也就是说:如果你的非CJK文本没有空格,浏览器默认不会帮你自动换行,此时,不论单词长度是否超过元素宽度,浏览器会强行将内容渲染,不管超出以后的样式,也不会撑开元素的宽度(注意:这里一定不能理解为撑开元素宽度)。
  2. 当一行放不下时,浏览器会尝试将最后一个单词放入下一行,但是如果下一行还是放不下这个单词,浏览器会任由这个单词超出容器,不会拆开这个单词。此时,浏览器将文本分行,但是第二行还是超过容器宽度,内容直接超出容器显示(注意:这里一定不能理解为撑开元素宽度
CSS PropertyCSS Values备注
word-break
normal默认值。
CJK文本放不下就换行,非CJK文本放不下就溢出
break-allCJK文本保持默认行为,
非CJK文本在任意字符处进行断行
keep-allCJK文本也不换行,放不下就溢出,
非CJK文本保持默认行为,放不下就溢出
break-wordCJK文本保持默认行为,
非CJK文本优先在单词边界处断字

总结:break-all和break-word都是用来处理非CJK文档的,此时,CJK文本的行为还是放不下就换行。 keep-all其实是用来处理CJK文档的,使CJK文档不换行,非CJK文档保持默认值。