Пропуск границы, когда есть 2 последовательных абзаца - PullRequest
0 голосов
/ 01 июля 2018

У меня есть стиль абзаца, который включает границы:

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

Когда мой документ содержит 2 последовательных абзаца «Осторожно», я бы хотел пропустить границы между этими абзацами. Я хочу опустить две границы: border-bottom в первом абзаце и border-top во втором абзаце.

Итак, это мой желаемый результат:

enter image description here

Кажется, что нет селектора CSS, который позволил бы мне взглянуть на следующий абзац.
border-collapse: collapse; тоже не дает желаемого результата.

Возможно ли это? (Я работаю над CSS Paged Media, используя рендерер Antennahouse, но, похоже, этот вопрос не относится к 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 голосов
/ 06 июля 2018

В итоге я использовал 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;
}
0 голосов
/ 01 июля 2018

Следующее может быть решением:

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.

0 голосов
/ 02 июля 2018

Если вы пообещаете иным образом не использовать ::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 от html.css, который поставляется с AH Formatter. Если вы используете другое значение, вам также необходимо использовать его здесь.

0 голосов
/ 01 июля 2018

Новый ответ

Вы можете попробовать что-то вроде этого:

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>

UPDATE

Чтобы пропустить все границы между 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...