插入换行符

通过 CSS 来插入换行的需求在越来越多的场景中运用到,例如我们使用定义列表来呈现一行行的名值对,例如下面一段代码:

<dl>
    <dt>Name:</dt>
    <dd>John</dd>

    <dt>Email:</dt>
    <dd>[email protected]</dd>

    <dt>Sex:</dt>
    <dd>male</dd>
</dl>

我期望达到下面的效果:

我依次做了下面的尝试:

1. 在每一个 <dd> 后面添加了一个 <br> ,让他们换行,可效果却是这样的:

查找资料我明白了,<dd> 本来是块级元素,并且占有一定的外边距,它们默认情况下不能同占一行。

2. 我添加了一些样式:

dd {
    margin: 0;
    font-weight: bold;
}
dt, dd {
    display: inline;
}

嗯,还不错,才进行两步就满足了我的要求,我效率也太高了吧。

——扯淡,写成这样还好意思说。(不仅仅污染了结构层的代码,而且在可维护方面也是一种糟糕的实践)

于是我想尝试一种不加入 <br> 这种额外的标签就能达到我想要的效果的方法。

一、添加生成内容

有一个 Unicode 字符是专门代表换行符的:0x000A。在 CSS 中可以使用 "\000A", 或者简化成 "\A"。可以使用它来作为伪元素 ::after 的生成内容,把它添加到 <dd> 元素的后面:

dd::after {
  content: "\A" ;
}

不过,这段 CSS 代码想当于在 HTML 结构中的所有关闭标签 </dd> 之前添加换行符。添加的空白符会和其他相邻的空白符进行合并(我们输入很多空白符,只相当于输入了一个空白符!)。当然我们这里需要保留这些空白符和换行,可以用 white-space: pre; 。不过这里只针对伪元素生成的换行符设置这个样式。

二、对生成内容设置样式,保留源代码中的这些换行和空白符

dt, dd {
  display: inline;
}
dd {
  margin: 0;
  font-weight: bold;
}
dd::after {
  content: "\A";
  white-space: pre;
}

至此我们完成了我们的需求,而不加任何 <br />。

可是这样的代码有这样的问题,如果我们某一个定义项有多个内容,即一个 <dl> 中有多个 <dd> ,具体到该项目中,该用户有两个邮箱:[email protected] 和 [email protected],那么我们得到的效果会是:

看起来 [email protected] 又是一个定义列表,且没有标题。

更改一、既然如此,我们可以将换行符加载 <dt> 前面,并且 <dt> 前面要有 <dd>:

dd + dt::before {
  content: "\A";
  white-space: pre;
}

更改二、多个 <dd> 之间用 ", " 分割:

dd + dd::before {
  content: ", ";
  font-weight: normal;
}

全部的代码:

dt, dd {
  display: inline;
}
dd {
  margin: 0;
  font-weight: bold;
}
dd + dt::before {
  content: "\A";
  white-space: pre;
}
dd + dd::before {
  content: ", ";
  font-weight: normal;
}

扩展:以后 <hgroup> 里面有 <h2> , <h3> 等,并且 <h2> 和 <h3> 的宽度需要根据文本的长度进行调整,而不是 100%,那么就需要将其设置为 display: inline-block; 这样的情况下, <h2> 和 <h3> 之间需要插入换行符,便可以通过这种方式实现了。

时间: 2024-08-03 10:10:51

插入换行符的相关文章

nl2br()与nl2p()函数,php在字符串中的新行(\n)之前插入换行符

使用情景 很多场合我们只是简单用textarea获取用户的长篇输入,而没有用编辑器.用户输入的换行以“\n”的方式入库,输出的时候有时候会没有换行,一大片文字直接出来了.这个时候可以根据库里的“\n”给文字换行.PHP有自带的函数nl2br(),我们也可以自定义函数nl2p(). 先来看看nl2br() 函数吧. 定义和用法 nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />). 一个简单的例子: 1 <?php 2   3 $str = &q

sublime 3 快捷处理【取掉换行符】【列插入】

1.sublime 3 取掉换行符 1.选中需要操作的行 2.Ctrl + H 调出替换栏 3.在 Find 栏中输入(是同时按这三个键) Ctrl + Shift + Enter , Replace 栏不填 4.按Replace All 2.sublime 3 列插入 1.选中需要操作的行 2.Ctrl + Shift + L 左右选定插入 原文地址:https://www.cnblogs.com/Mr-Wenyan/p/9146226.html

C++操控器endl与换行符&#39;\n&#39;的区别

?? 很多C++的初学者都以为endl只是'\n'换行符的替代者,这是一种片面的看法,因为endl不仅仅在在输出流中插入了'\n',而且还有刷新缓冲区的作用.输入输出流会把获取到的数据先存放在缓冲区中,当计算机不忙的时候,会实时地把数据处理掉,这时候'\n'和endl没有什么太大的区别,当计算机任务繁重的时候,就会默认等到缓冲区被填满,再一块处理掉这些数据,这时候endl就开始发挥作用,它会告诉计算机立即开始处理缓冲区里的数据. cout << a ; cout << b ; re

textarea 中的换行符问题

下面是我对这个问题的解决过程,最后算是完全搞懂了,真是阴沟里险些翻船 1.必须知道textarea中的换行符是 \n  (个人检测发现按回车键是\n,好像在linux下是\r\n) 2.用nl2br之前,请仔细看好手册解释,我就是搞郁闷了,一般都理解为将\n转换成<br >,其实不是的: 看php手册解释: nl2br –  Inserts HTML line breaks before all newlines in a string Returns string with ‘<br

搞了半天原来是DOS换行符的问题^M

今天在windows上的一个文件拷贝到Linux 系统中 没有注意到换行符的问题导致一个批处理始终有问题. 特别是通过记事本拷贝的文件 首先要通过cat -v file.txt 查看输入如下既有换行符的 UrrtIU56567=koiiH8IO188^M kymMPuAGuwBlqSWsWvK0^M ^M就是带的换行符号 $dos2unix -k killws 去掉换行符 $cat -v file.txt UrrtIU56567=koiiH8IO188 kymMPuAGuwBlqSWsWvK0

python 按每行读取文件怎么去掉换行符

python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello world\n" >>> print a #可以看到hello world下面空了一格 hello world >>> a.split() #通过split方法将字符转换成列表 ['hello', 'world'] #从列表中取第一个字符 >>> a.

Git中的AutoCRLF与SafeCRLF换行符问题

最近在使用GitHub,发现不时没有修改过的文件要提交,对比发现文件全部修改,但找不到不一样的地方.想可能是换行符的问题,因为Windows和Linux的换行符不一样,而Git默认应该是Linux的,今天Bing了下,果然是这个问题. CR回车 LF换行Windows/Dos CRLF \r\n Linux/Unix LF \n MacOS CR \r 解决方法是:打开命令行,进行设置,如果你是在Windows下开发,建议设置autocrlf为true.2014/08/20 补充:如果你文件编码

linux下与windows下的换行符

回车符号和换行符号产生背景 关于"回车"(carriage return)和"换行"(line feed)这两个概念的来历和区别.在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失.     于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符.一

dede文章插入分页符不起作用

dede下的长文章插入分页符(插入方式如图)不管用,研究了下是因为没有加{dede:pagebreak/},在内容模版里(一般是article_article.htm)找到{dede:field.body/}或者{dede:field name=’body’/}这个标签,这是文章内容标签,在其后面写上<br>{dede:pagebreak/}这段然后刷新文档HTML就可以了