我有一个包含边框的段落样式:
p.caution {
border-top: 1.5pt double #FF0000;
border-bottom: 1.5pt double #FF0000;
}
当我的文档包含两个连续的“注意”段落时,我想省略这些段落之间的边框。 我想省略两个边框:第一段的边框底部和第二段的边框顶部。
这是我想要的结果:
似乎没有CSS选择器可以让我看下一段。
border-collapse: collapse;
也没有理想的结果。
这可能吗? (我正在使用Antennahouse渲染器处理CSS Paged Media,但这似乎不是特定于Paged Media的问题)
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>
答案 0 :(得分:2)
以下可能是解决方案:
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
是另一个元素为.caution
的相邻元素,请删除其顶部边框。.caution
是:last-child
,请添加一个border-bottom
.caution
有一个没有.caution
类的相邻兄弟姐妹(这也意味着它不是最后一个孩子,因此前面的情况将不适用)将border-top
添加到相邻的兄弟姐妹。这将与一个,两个或多个连续的p.caution
一起使用。
答案 1 :(得分:1)
新答案
您可以尝试以下操作:
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>
答案 2 :(得分:1)
如果您承诺不对可能引起注意的任何事情使用::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
。如果您使用其他值,则还需要在此处使用它。
答案 3 :(得分:0)
我最终使用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;
}