当有 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有一个没有.cautionclass的相邻兄弟(这也意味着它不是最后一个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;
}