巧用 white-space 解决 回车不换行的显示问题

4,547 阅读2分钟

问题描述

最近在项目上遇到一个文案显示的相关问题:用户在输入文字时用了回车换行,后台存储以后,在页面回显时,并未如愿进行换行,而是把回车符当作了空格处理。

场景

  • 聊天室即时输入后即时显示,譬如类似微信聊天的场景内
  • 前端在展示某些文章时,段落文字的显示

原因分析

控制台打印(console)回显的文字,发现服务端存的回车是 ↵ 符号,页面在进行解析-反编译-渲染的时候,把 ↵符号 解析成了空格进行渲染,对这个 ↵ 符号的处理,成了问题关键

解决办法

  • 首先想到的办法,就是利用 js 正则 ,把 ↵ 替换成< br/>换行符,进行 html解析,貌似可行,实验了一下确实可以。但是如果文案内容过长,信息量过大时,这种方法的可行性,显然不高。

  • 在查阅资料时,无意中看到 MDN Web 文档, white-space 可以处理段落文字中的空格、回车符、制表符等符号,赶紧研究。<如果能用css解决的问题,傻子才会用js进行解决,哈哈>

属性值 回车是否换行 解释
normal 空格和回车换行都会被浏览器忽略
nowrap 文本不会换行,文本会在在同一行上继续,直到遇到换行符< br />标签为止
break-spaces 会换行,空格不会合并(不管是行首还是行尾,敲几个空格,就是几个空格),但是不会超出盒子大小。换行时,单词不会拆开,会保留完整单词再换行。
pre 只有遇到回车(换行符)时才会换行,否则不会换行
pre-wrap 同break-spaces 同break-spaces
pre-line 连续的空格会被合并(行内多个连续的空格会被合并成一个空格,行首行尾空格会被直接忽略)

总结

white-space 的默认值是 normal,在不对 white-space 重新赋值的情况下,页面渲染时默认把空格和回车都忽略了,所以就出现了页面回显文字时不换行的问题,把 white-space 赋值为 pre-line 就可以轻松解决这个问题了!

对标 微信PC版,发会现,在行首或者行尾输入一堆空格,回显时,却被忽略了,那我们可以大胆猜测,在页面进行回显时,是否用的就是 pre-line 呢?^_^