《架构师重学前端》HTML长文本换行

112 阅读3分钟

长文本

对于文本换行,针对的其实都是长文本,这里需要注意,长文本是指超过文本区域范围的文本

<div>
    I am a sunny boy
</div>
<div>
    我是答案,测试测试测
</div>

image-20240527213019032

上面这些并不是长文本,因为文字宽度或者单词宽度并未超过文本区域

image-20240527213150896

这里的sunnysunnysunny就是长文本

长文本类型可以大致分为3类

  • 中文长文本(只有多个中文连在一起才算)
我是答案测试测试测试测测试测试测试测试一下
  • 英文长文本
longlonglonglonglonglong
  • 中文标点符长文本(只做演示,一般不会出现)
我是答案案案....................................

默认表现

<div>
    我是答案测试测试测试测测试测试测试测试一下
</div>
<div>
    longlonglonglonglonglong
</div>
<div>
    我是答案案案....................................
</div>

image-20240527215559313

除了中文长文本以外,另外两种长文本都溢出了内容区域,显然这不是我们所期待的...

那要如何实现另外两种文本的换行喃?那就要用到 word-break属性

word-break

word-break属性是控制超出区域文本如何换行的

normal

演示效果就如同上面默认一样

只能在正常的单词间或段落间(例如两个单词之间的空格)处换行

  • 中文长文本:每个中文之间进行换行

break-all

<style>
    div {
        word-break: break-all;
    }
</style>
<main>
    <div>
        我是答案测试测试测试测测试测试测试测试一下
    </div>
    <div>
        longlonglonglonglonglong
    </div>
    <div>
        我是答案案案案.....
    </div>
</main>

image-20240527215402789

好消息是英文长文本被解决了,但是中文符号长文本还是没有被解决

  • 中文长文本:每个中文之间进行换行
  • 英文长文本:单词间进行换行,并且长英文单词切割换行

keep-all

<style>
    div {
        word-break: keep-all;
    }
</style>
<main>
    <div>
        我是答案测试测试测试测测试测试测试测试一下
    </div>
    <div>
        longlonglonglonglonglong
    </div>
    <div>
        我是答案案案案.....
    </div>
</main>

image-20240527215357323

更糟糕的事情发生了,三种长文本都无法换行了

break-word

<style>
    div {
        word-break: break-word;
    }
</style>
<main>
    <div>
        我是答案测试测试测试测测试测试测试测试一下
    </div>
    <div>
        longlonglonglonglonglong
    </div>
    <div>
        我是答案案案案.....
    </div>
</main>

image-20240527215905221

完美解决了所有使用长文本问题吧

  • 中文长文本:每个中文之间进行换行
  • 英文长文本:单词间进行换行,并且长英文单词切割换行
  • 中文标点符长文本:字符间进行换行,长标点符号切割换行

许多文章都在说break-word要废弃了,但是我发现浏览器还是能够正常使用,并且MDN上面也没有注明不要用,所以还是可以用break-word作为属性值

网上大多数文章都说overflow-wrap:break-word;word-break:break-word;替代品,也就简单介绍一下吧

overflow-wrap

overflow-wrapbreak-word的作用是一样的,都是控制文本换行的

normal

作用和word-break: normal;相同

break-all

作用和word-break:break-all;相同

anywhere

主要用于max-contentmin-content,不懂可以参考CSS疑难点

能够根据这两个属性所表示的区域进行换行

<style>
    div {
        overflow-wrap: anywhere;
        width: max-content;
    }
</style>
<main>
    <div>
        我是答案测试测试测试测测试测试测试测试一下
    </div>
    <div>
        longlonglonglonglonglong
    </div>
    <div>
        我是答案案案案.....
    </div>
</main>

image-20240527223417737

推荐使用

个人觉得可以在文本换行时,可以任何区域使用overflow-wrap:break-word;,可以评论区讨论