Выберите CSS программно

Мне нужно определить правила CSS для элементов HTML, размещенных на одном уровне, без возможности манипулировать html. В частности, необходимо использовать элементы li с классами, которые содержат строку «section_break» для разграничения групп. Я не знаю заранее количество разделов и количество элементов li в каждом разделе.

Например;

<fieldset class = "multistep-fieldset">

    <li class = "section_break"></li>

    <li class = "background_color field-size-large"></li>          
    <li class = "background_image field-size-large"></li>

    <li class = "section_break_1"></li>
    
    <li class = "main_image field-size-large"></li>

    <li class = "section_break_2"></li>
    
    <li class = "main_image field-size-large"></li>
    <li class = "main_image field-size-large"></li>

</fieldset>

Мне нужно сгруппировать правила css от section_break до section_break_1, затем от section_break_1 до section_break_2 и так далее. В примере первые 3 элемента li (включая li с классом section_break) являются частью первого раздела, следующие 2 элемента li являются частью второго раздела, последние 3 элемента li являются частью третьего раздела. Мне нужно нарисовать границы, которые покрывают каждую из них отдельно.

Есть ли простой способ сделать это, используя только CSS?

Более близкий ответ выглядит так; Выбор CSS для случайного количества элементов Спасибо @m.piras за это решение. Но все еще нужно добавить границу к нижней части ящиков до последнего.

P.S. К сожалению, я не могу манипулировать HTML-элементами, потому что они генерируются автоматически с помощью кода. Я также не знаю заранее, сколько секций и элементов в каждой секции у меня получится.

КОДЕПЕН

Это похоже на проблему XY: похоже, что вашу разметку необходимо обновить, чтобы она отражала предполагаемую группировку/организацию/иерархию, например. вложенные элементы списка. Например, почему <li> используется в качестве декоративного элемента для разрыва раздела? Это не то, что CSS должен делать за вас.

Terry 16.01.2023 15:10

@Terry К сожалению, я не могу манипулировать элементами HTML, потому что они генерируются автоматически с помощью кода.

083N 16.01.2023 15:40
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
2
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте использовать селектор n-го типа. Например:

li:nth-of-type(1) {
  border-top: 1px solid red;
}

поместит границу поверх первого элемента li

РЕДАКТИРОВАТЬ

Если вы не знаете, сколько элементов section_break будет на вашей странице, вы можете добавить комбинацию селекторов атрибутов и комбинатора смежных элементов , как показано ниже ( codepen):

li[class* = "section_break"]{
  border-top: 1px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 0px solid black;
}

li[class* = "section_break"] ~ :not(li[class* = "section_break"]) { 
  border-top: 0px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 0px solid black;
}


li[class* = "section_break"] ~ :last-of-type:not(li[class* = "section_break"]) {
  border-top: 0px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 1px solid black;
}

li[class* = "section_break"] ~ 
:not(li[class* = "section_break"]):has(+ li[class* = "section_break"]){
  border-bottom: 1px solid black;
}

Первый блок выбирает каждый li, который содержит строку section_break в своем атрибуте класса; второй блок выбирает соседние с ними li, у которых нет section_break в их атрибуте класса; третий блок выбирает последнюю итерацию соседнего li, у которого нет section_break в их атрибуте класса; последний блок добавляет границу к последнему из каждой группы на основе следующего брата, имеющего section_break в своем классе.

Ты прав. Я могу сделать это с помощью nth-of-type или комбинации с first-of-type и last-of-type. ссылка Но, подумайте так; если мы не знаем, сколько li генерируется кодом, и если мы можем выбрать их только с помощью класса section_break, section_break_1, section_break_2 и т. д. Возможно, для этого нам понадобится какой-нибудь js. Но мне любопытно, есть ли другой способ решить эту проблему с помощью CSS. Может быть, используя переменные в CSS или что-то в этом роде.

083N 16.01.2023 18:04

Я отредактировал решение. Я думаю, вы сможете получить то, что ищете, добавив селекторы атрибутов и смежные комбинаторы братьев и сестер.

m.piras 17.01.2023 09:56

Спасибо за ваш ответ. Я отредактировал пин Codepen: выберите случайное количество элементов. Не мог бы ты взглянуть на это? Как я могу добавить нижнюю границу к полям до последнего?

083N 17.01.2023 11:21

Конечно, я отредактировал ответ, добавив последний блок, который делает то, что вы просите.

m.piras 17.01.2023 11:41

Прохладный. Я многому научился на этой быстрой сессии вопросов и ответов. Спасибо 🙏🏻 большое m.piras. Поддерживать связь! ✌🏻

083N 19.01.2023 17:24

Другие вопросы по теме