【问题标题】:How to use css to implement same effect as having a <br> inside target element?如何使用 css 实现与在目标元素内具有 <br> 相同的效果?
【发布时间】:2020-07-03 14:18:00
【问题描述】:

我希望html中所有空的&lt;p&gt;元素里面都有一个换行符,并使用css来实现这个效果。

详情:

下面的两个p 标记应该具有相同的外观(跨浏览器和缩放级别)

p标签的所有其他风俗风格都是一样的

p:empty {
  /** How can I code here (or some other way css codes can achieve this) **/
}
<p><br></p>
<p></p>

背景:我想在prosemirror编辑器中显示编辑内容的预览,而当将内容序列化为json时,编辑器不会在&lt;p&gt;中保留&lt;br&gt;,并使其在从@呈现预览时看起来不同987654330@。见:discuss.prosemirror

【问题讨论】:

  • :empty 如果

    标签中有任何内容将不起作用,请尝试更详细地解释您的问题。如果可能的话,试着让我们直观地看到你想要实现的目标

  • 我假设您正在尝试这样做以在某处创建相等的间距?换行符是一个非固定高度的 html 元素 - 它取决于其他因素,包括行高以及它是否具有自己的样式。没有简单的方法可以尝试在 CSS 中复制 html 元素的行为。告诉我们您到底想达到什么目标,也许我们可以提供更好的解决方案

标签: html css line-breaks


【解决方案1】:

有几种方法可以做到这一点,以下是您可以使用自己代码背后的相同逻辑的方法,只需在内容后添加空格 Unicode:

p:empty:after {
  content: '\00a0';
}

p {
  outline: 1px solid red;
}
<p><br></p>
<p></p>

演示:

console.log(document.getElementById("first").offsetHeight)
console.log(document.getElementById("second").offsetHeight)
p:empty:after {
  content: '\00a0';
}
p {
  outline: 1px solid red;
}
<p id="first"><br></p>
<p id="second"></p>

【讨论】:

    【解决方案2】:

    一个空的 inline-block 元素也可以完成这项工作:

    p:empty:after {
      content: '';
      display:inline-block;
    }
    
    p {
      outline:1px solid red;
    }
    <p><br></p>
    <p></p>
    
    <div style="font-size:30px">
    <p><br></p>
    <p></p>
    </div>

    或者像下面这样:

    p:empty:after {
      content: ' ';
      white-space:pre;
    }
    
    p {
      outline:1px solid red;
    }
    <p><br></p>
    <p></p>
    
    <div style="font-size:30px">
    <p><br></p>
    <p></p>
    </div>

    【讨论】:

    • 我测试了这个,但外观还是有一些不同。目前content: '\00a0' 是唯一可行的方法。
    • @dongjy 你可能涉及到更多的 CSS,因为你可以在 sn-p 中测试两者都产生相同的输出
    • CSS 之神发话了,我要+1
    • @TemaniAfif 谢谢,第二个解决方案确实有效,但不是第一个。经过研究,我发现一些非常奇怪的东西:您可以创建一个新的html并将inline-block解决方案(第一个)代码复制并粘贴到其中,然后用浏览器打开html文件以查看与单击生成的不同的布局运行代码 sn-p 按钮在此 sn-p 下方。空的&lt;p&gt; 在 Firefox 和 chrome 中的高度都为零。你能弄清楚为什么会有差异吗?
    • @dongjy 你是在文件顶部声明文档类型吗?
    【解决方案3】:

    您可以像这样为&lt;p&gt; 提供明确的heightline-height

    p {
      height: 1em;
      line-height: 1em;
    }
    

    工作示例:

    table, tr, th, td {
      border: 1px solid rgb(191, 191, 191);
    }
    
    p {
      height: 1em;
      line-height: 1em;
      text-align: center;
      border: 1px solid red;
    }
    <table>
      <thead>
      <th>Column 1</th>
      <th>Column 2</th>
      </thead>
    
      <tr>
        <td>
          <p></p>
          <p>Two</p>
          <p></p>
          <p>Four</p>
        </td>
        
        <td>
          <p><br></p>
          <p>Two</p>
          <p><br></p>
          <p>Four</p>
        </td>
      </tr>
    </table>

    【讨论】:

    • 我测试了一下,外观还是有一些不同,可能&lt;br&gt;不完全是1emline-heightheight
    • 是的,你是对的@dongjy - 正如我上面所说,p 标签的行高会影响显示高度,不同的段落可能有不同的行高,由 CSS 中的不同选择器设置。跨度>
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多