当有 2 个连续段落时省略边框
Omitting a border when there are 2 consecutive paragraphs
我有一个包含边框的段落样式:
p.caution {
border-top: 1.5pt double #FF0000;
border-bottom: 1.5pt double #FF0000;
}
当我的文档包含 2 个连续的 'Caution' 段落时,我想省略这些段落之间的边框。
我想省略两个边框:第一段的 border-bottom 和第二段的 border-top。
所以这是我想要的结果:
似乎没有 CSS 选择器可以让我查看下一段。
border-collapse: collapse;
也没有得到想要的结果。
这可能吗?
(我正在使用 Antennahouse 渲染器处理 CSS 分页媒体,但这似乎不是特定于分页媒体的问题)
HTML 片段:
<div>
<p class="other">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="other">some text</p>
</div>
新答案
您可以尝试这样的操作:
p.caution {
border-top: 1.5pt double #FF0000;
border-bottom: 1.5pt double #FF0000;
margin:2px;
padding:10px;
}
p.caution + p.caution {
border-top-color:#fff;
margin-top:-3pt;
position:relative;
}
<div>
<p class="other">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="other">some text</p>
</div>
旧答案
如果所有 p
都在同一个容器中,您可以尝试这样的操作:
p.caution {
border-top: 1.5pt double #FF0000;
margin:0;
padding:20px;
}
p.caution:last-child {
border-bottom: 1.5pt double #FF0000
}
<div>
<p class="caution">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="caution">some text</p>
</div>
并且只有一个 p
它也可以正常工作:
p.caution {
border-top: 1.5pt double #FF0000;
margin:0;
padding:20px;
}
p.caution:last-child {
border-bottom: 1.5pt double #FF0000
}
<div>
<p class="caution">some text</p>
</div>
更新
要省略 p
之间的所有边框,您可以试试这个:
p.caution {
margin:0;
padding:20px;
}
p.caution:first-child {
border-top: 1.5pt double #FF0000
}
p.caution:last-child {
border-bottom: 1.5pt double #FF0000
}
<div>
<p class="caution">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="caution">some text</p>
</div>
以下可能是一个解决方案:
p {
margin: 0;
}
.caution {
border-top: 4px double red;
}
.caution + .caution {
border-top: none;
}
.caution:last-child {
border-bottom: 4px double red;
}
.caution + p:not(.caution) {
border-top: 4px double red;
}
<div>
<p class="other">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="other">some text</p>
</div>
此代码的作用:
- 添加一个
border-top
到.caution
- 如果
.caution
是具有 class .caution
的另一个元素的相邻兄弟元素,请移除其顶部边框。
- 如果
.caution
是:last-child
,添加一个border-bottom
- 如果
.caution
有一个没有.caution
class的相邻兄弟(这也意味着它不是最后一个child,因此前面的情况不会apply) 将 border-top
添加到相邻的兄弟。
这将按预期用于一个、两个或多个连续 p.caution
。
如果您承诺不使用 ::before
任何可以遵循警告的东西:
.caution {
border-top: 1.5pt double red;
}
.caution:last-child {
border-bottom: 1.5pt double red;
}
.caution + .caution {
border-top: none;
}
.caution + *:not(.caution) {
margin-top: -1.12em;
}
.caution + *:not(.caution)::before {
border-top: 1.5pt double red;
display:block;
content: "";
margin-bottom: 1.12em;
}
1.12em
来自AH Formatter自带的html.css
。如果您使用不同的值,那么您也需要在此处使用它。
我最终使用 XSLT 修改我的输入 HTML。我添加了一个属性来指定我希望边框出现的位置:
<xsl:template match="p[@class='caution']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="border-after">
<xsl:choose>
<xsl:when test="following-sibling::*[1]/@class='caution'">no</xsl:when>
<xsl:otherwise>yes</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="border-before">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1]/@class='caution'">no</xsl:when>
<xsl:otherwise>yes</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
在我的 CSS 中:
p.caution[border-after="yes"] {
border-bottom: 3pt double #FF0000;
}
p.caution[border-after="no"] {
margin-bottom: 3pt;
}
p.caution[border-before="yes"] {
border-top: 3pt double #FF0000;
}
p.caution[border-before="no"] {
margin-top: 3pt;
}
我有一个包含边框的段落样式:
p.caution {
border-top: 1.5pt double #FF0000;
border-bottom: 1.5pt double #FF0000;
}
当我的文档包含 2 个连续的 'Caution' 段落时,我想省略这些段落之间的边框。 我想省略两个边框:第一段的 border-bottom 和第二段的 border-top。
所以这是我想要的结果:
似乎没有 CSS 选择器可以让我查看下一段。
border-collapse: collapse;
也没有得到想要的结果。
这可能吗? (我正在使用 Antennahouse 渲染器处理 CSS 分页媒体,但这似乎不是特定于分页媒体的问题)
HTML 片段:
<div>
<p class="other">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="other">some text</p>
</div>
新答案
您可以尝试这样的操作:
p.caution {
border-top: 1.5pt double #FF0000;
border-bottom: 1.5pt double #FF0000;
margin:2px;
padding:10px;
}
p.caution + p.caution {
border-top-color:#fff;
margin-top:-3pt;
position:relative;
}
<div>
<p class="other">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="other">some text</p>
</div>
旧答案
如果所有 p
都在同一个容器中,您可以尝试这样的操作:
p.caution {
border-top: 1.5pt double #FF0000;
margin:0;
padding:20px;
}
p.caution:last-child {
border-bottom: 1.5pt double #FF0000
}
<div>
<p class="caution">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="caution">some text</p>
</div>
并且只有一个 p
它也可以正常工作:
p.caution {
border-top: 1.5pt double #FF0000;
margin:0;
padding:20px;
}
p.caution:last-child {
border-bottom: 1.5pt double #FF0000
}
<div>
<p class="caution">some text</p>
</div>
更新
要省略 p
之间的所有边框,您可以试试这个:
p.caution {
margin:0;
padding:20px;
}
p.caution:first-child {
border-top: 1.5pt double #FF0000
}
p.caution:last-child {
border-bottom: 1.5pt double #FF0000
}
<div>
<p class="caution">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="caution">some text</p>
</div>
以下可能是一个解决方案:
p {
margin: 0;
}
.caution {
border-top: 4px double red;
}
.caution + .caution {
border-top: none;
}
.caution:last-child {
border-bottom: 4px double red;
}
.caution + p:not(.caution) {
border-top: 4px double red;
}
<div>
<p class="other">some text</p>
<p class="caution">some text</p>
<p class="caution">more text</p>
<p class="other">some text</p>
</div>
此代码的作用:
- 添加一个
border-top
到.caution
- 如果
.caution
是具有 class.caution
的另一个元素的相邻兄弟元素,请移除其顶部边框。 - 如果
.caution
是:last-child
,添加一个border-bottom
- 如果
.caution
有一个没有.caution
class的相邻兄弟(这也意味着它不是最后一个child,因此前面的情况不会apply) 将border-top
添加到相邻的兄弟。
这将按预期用于一个、两个或多个连续 p.caution
。
如果您承诺不使用 ::before
任何可以遵循警告的东西:
.caution {
border-top: 1.5pt double red;
}
.caution:last-child {
border-bottom: 1.5pt double red;
}
.caution + .caution {
border-top: none;
}
.caution + *:not(.caution) {
margin-top: -1.12em;
}
.caution + *:not(.caution)::before {
border-top: 1.5pt double red;
display:block;
content: "";
margin-bottom: 1.12em;
}
1.12em
来自AH Formatter自带的html.css
。如果您使用不同的值,那么您也需要在此处使用它。
我最终使用 XSLT 修改我的输入 HTML。我添加了一个属性来指定我希望边框出现的位置:
<xsl:template match="p[@class='caution']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="border-after">
<xsl:choose>
<xsl:when test="following-sibling::*[1]/@class='caution'">no</xsl:when>
<xsl:otherwise>yes</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:attribute name="border-before">
<xsl:choose>
<xsl:when test="preceding-sibling::*[1]/@class='caution'">no</xsl:when>
<xsl:otherwise>yes</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
在我的 CSS 中:
p.caution[border-after="yes"] {
border-bottom: 3pt double #FF0000;
}
p.caution[border-after="no"] {
margin-bottom: 3pt;
}
p.caution[border-before="yes"] {
border-top: 3pt double #FF0000;
}
p.caution[border-before="no"] {
margin-top: 3pt;
}