有连续2个段落时省略边框

时间:2018-07-01 15:46:01

标签: css antenna-house

我有一个包含边框的段落样式:

p.caution {
    border-top: 1.5pt double #FF0000;
    border-bottom: 1.5pt double #FF0000;
}

当我的文档包含两个连续的“注意”段落时,我想省略这些段落之间的边框。 我想省略两个边框:第一段的边框底部和第二段的边框顶部。

这是我想要的结果:

enter image description here

似乎没有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>

4 个答案:

答案 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;
}