Css селектор предыдущий элемент

Есть ли селектор «предыдущий брат»?

OMG, все ответы здесь, предлагающие вам изменить порядок элементов html, а затем использовать CSS, чтобы они выглядели задом наперед, являются настоящим натяжением. Конечно, это не указывает на вопрос, но большинство вопросов «Можете ли вы сделать X с помощью CSS» должны предполагать, что вы не можете изменить HTML структурно.

@squarecandy, я в основном согласен с вашим комментарием. Но решения, которые вы называете неадекватными, тем не менее, в некоторых случаях полезны (обратите внимание на отрицательные отзывы). Так что их стоит опубликовать. То, что вы видите как «настоящий натяжение», может быть «творческим решением» для других.

Нет, селектор «предыдущий брат» отсутствует.

С другой стороны, ~ это для родного брата-наследника (имеется в виду, что элемент идет после этого, но не обязательно сразу после) и является селектором CSS3. + для следующего родного брата и CSS2.1.

Из стандарта CSS3: элементы, представленные двумя последовательностями, имеют одного и того же родителя в дереве документа, и элемент, представленный первой последовательностью, предшествует (не обязательно сразу) элементу, представленному второй.

Полезная для этого функция jquery: prev (). Например, $ («# the_element»). Prev (). Css («background-color», «red»)

Я нашел способ стилизовать всех предыдущих братьев и сестер (напротив ~ ), которые могут работать в зависимости от того, что вам нужно.

Допустим, у вас есть список ссылок, и при наведении на одну из них все предыдущие должны стать красными. Вы можете сделать это так:

/* default link color is blue */ .parent a  color: blue; > /* prev siblings should be red */ .parent:hover a  color: red; > .parent a:hover, .parent a:hover ~ a  color: blue; >
 class="parent">  href="#">link   href="#">link   href="#">link   href="#">link   href="#">link  

Вы можете добавить объяснение того, как это работает. (кажется, что вы применяете стиль ко всем элементам и к следующим элементам, но он может быть подробно описан)

Отличное решение. Нет необходимости переупорядочивать элементы в разметке или в рендере (через float:right ). Для этого потребовался пробел между единицами / словами и отступами вместо полей, но он работает совершенно иначе!

@ Линн ответ включает только код, чтобы сделать предыдущие ссылки красным при наведении курсора. Дополнительные стили зависят от вашего варианта использования. Для компонента звездного рейтинга (который, я полагаю, является распространенным случаем) вам необходимо избавиться от этого места, а также сделать красным ссылку.

Селектор уровня 4 вводит :has() (ранее индикатор предмета ! ), который позволит вам выбрать предыдущего брата с:

. но на момент написания этой статьи, это некое преимущество за пределами поддержки браузеров.

«Чувствительность для поддержки браузера» может быть преувеличением. На момент написания этой статьи даже самая последняя версия Chrome не могла использовать :has() псевдокласс.

msgstr «: has не помечен как часть профиля динамического селектора, что означает, что его нельзя использовать в таблицах стилей; только с такими функциями, как document.querySelector ().» — developer.mozilla.org/en-US/docs/Web/CSS/:has

Рассмотрим order свойство гибких и сеточных макетов.

Я сосредоточусь на flexbox в примерах ниже, но те же понятия применимы к Grid.

С помощью flexbox можно смоделировать предыдущий селектор брата.

В частности, order свойство flex может перемещать элементы по экрану.

Вы хотите, чтобы элемент A стал красным, когда элемент B наведен.

    Сделайте ul гибкий контейнер.

li:hover + li  background-color: red; >

. и вуаля! Предыдущий родной селектор рождается (или, по крайней мере, имитируется).

ul  display: flex; > li:hover + li  background-color: red; > li:last-child  order: -1; > /* non-essential decorative styles */ li  height: 200px; width: 200px; background-color: aqua; margin: 5px; list-style-type: none; cursor: pointer; >

5.4. Порядок отображения: order собственность

Элементы Flex по умолчанию отображаются и располагаются в том же порядке, в котором они отображаются в исходном документе. order Свойство может быть использовано для изменения этого порядка.

В order управляет свойство порядок , в котором гибкие элементы появляются в гибком контейнере, назначая их порядковые группы. Он принимает одно значение, которое указывает, к какой порядковой группе относится элемент flex.

Начальное order значение для всех элементов flex — 0.

Примеры «предыдущих селекторов братьев и сестер», созданных с помощью order свойства flex .

.container  display: flex; > .box5  order: 1; > .box5:hover + .box4  background-color: orangered; font-size: 1.5em; > .box6  order: -4; > .box7  order: -3; > .box8  order: -2; > .box9  order: -1; > .box9:hover ~ :not(.box12):nth-child(-1n+5)  background-color: orangered; font-size: 1.5em; > .box12  order: 2; > .box12:hover ~ :nth-last-child(-1n+2)  background-color: orangered; font-size: 1.5em; > .box21  order: 1; > .box21:hover ~ .box  background-color: orangered; font-size: 1.5em; > /* non-essential decorative styles */ .container  padding: 5px; background-color: #888; > .box  height: 50px; width: 75px; margin: 5px; background-color: lightgreen; display: flex; justify-content: center; align-items: center; text-align: center; cursor: pointer; >
  Using the flex order  property to construct a previous sibling selector   class="container">  class="box box1"> 1 
class="box box2"> 2
class="box box3"> 3
class="box box5"> HOVER ME
class="box box4"> 4
class="container"> class="box box9"> HOVER ME class="box box12"> HOVER ME class="box box6"> 6 class="box box7"> 7 class="box box8"> 8 class="box box10"> 10 class="box box11"> 11 class="container"> class="box box21"> HOVER ME class="box box13"> 13 class="box box14"> 14 class="box box15"> 15 class="box box16"> 16 class="box box17"> 17 class="box box18"> 18 class="box box19"> 19 class="box box20"> 20

jsFiddle

Примечание: два устаревших представления о CSS

Flexbox разрушает давние убеждения о CSS.

Сказать, что это убеждение широко распространено, было бы преуменьшением. Вот выборка связанных вопросов только по переполнению стека:

Как описано выше, это убеждение не совсем верно. Предыдущий селектор брата может быть смоделирован в CSS с помощью order свойства flex .

z-index Миф

Другое давнее убеждение заключается в том, что он z-index работает только с позиционированными элементами.

На самом деле, самая последняя версия спецификации — проект редактора W3C — все еще утверждает, что это правда:

В действительности, однако, эта информация является устаревшей и неточной.

Элементы, которые являются гибкими элементами или элементами сетки, могут создавать контексты стекирования, даже когда они position есть static .

4,3. Flex Item Z-Ordering

Элементы Flex отображаются точно так же, как и встроенные блоки, за исключением того, что порядок документов с измененным порядком используется вместо порядка необработанных документов, и z-index значения, отличные от auto контекста стека, даже если они position есть static .

5.4. Ось Z Порядок: z-index свойство

Порядок рисования элементов сетки точно такой же, как и у встроенных блоков, за исключением того, что порядок документов с измененным порядком используется вместо порядка необработанных документов, а z-index значения auto отличаются от контекста стека, даже если он position есть static .

Вот демонстрация z-index работы с не позиционированными элементами Flex: https://jsfiddle.net/m0wddwxs/

order Свойство не является решением , поскольку оно предназначено исключительно для изменения визуального порядка, так что это не восстановить первоначальный семантический порядок , который вы вынуждены изменения в HTML для этого обходного пути на работу.

Имейте в виду, что CSS2.2 ED, который вы цитируете, по сути, все еще CSS2. А в CSS2 нет flexbox и макета сетки, поэтому, что касается CSS2, эта информация, безусловно, верна. По крайней мере, текст может быть обновлен, чтобы упомянуть, что z-index может применяться к другим типам элементов на будущих уровнях CSS, так же как он говорит, что другие свойства могут устанавливать контекст стека, такой как непрозрачность.

@BoltClock Мой комментарий не имеет ничего общего с поддержкой браузера. Техника нарушает семантику в пользу изложения. Я считаю, что обычный регулярный класс, добавленный к элементу «предыдущий брат» на стороне сервера, гораздо более разумен.

В случае, если у кого-то возникают проблемы с пониманием того, когда z-index будет работать, даже если «omg, там не position указано!», В спецификации упоминается концепция стекового контекста , что хорошо объясняется в этой статье о MDN

@Michael_B, пожалуйста! Я имел дело с множеством фронтменов, не подозревающих об этом. Еще одна вещь, о которой я хотел бы упомянуть, селектор поддельного предыдущего брата также прекрасно работает с float: right (или с любым другим способом отменить порядок, который flex/order имеет небольшие (наименьшие?) Побочные эффекты). Взбил две скрипки: демонстрация float: right подхода и демонстрация direction: rtl

У меня был тот же вопрос, но потом у меня был «дух» момент. Вместо того чтобы писать

Очевидно, что это соответствует «х» вместо «у», но отвечает «есть совпадение?» вопрос, и простой обход DOM может привести вас к нужному элементу более эффективно, чем зацикливание в javascript.

Я понимаю, что исходный вопрос был вопросом CSS, поэтому этот ответ, вероятно, совершенно не имеет значения, но другие пользователи Javascript могут наткнуться на вопрос с помощью поиска, как я.

Я считаю, что это работает, когда вы можете легко найти. Проблема в том, что если y можно найти только относительно x, и, перевернув его, вы не сможете найти y, потому что сначала нужно найти x. Это, конечно, относится к вопросу о том, что у вас предшествующий брат, а не о следующем, но может также относиться к тому, что у следующий брат.

Ты грубый, суровый. (извините, не смог устоять.) Дело в том, что иногда вам просто нужно знать «существует ли у вас?». В других случаях вы можете использовать «: before», чтобы поместить что-то между двумя элементами. Наконец, если вам нужно перейти в jQuery, использовать find («y ~ x»). Prev () проще, чем многие альтернативы.

Идея предыдущего родственного селектора состоит в том, что он выберет предыдущий элемент. К сожалению, изменение его, как описано здесь, не обеспечивает эту функциональность.

Спасибо @Zenexer за разъяснение, что этот ответ не дает реального решения исходного вопроса, я начинал чувствовать себя глупо, размышляя о том, как y ~ x можно решить мою проблему

Я понимаю идею, лежащую в основе этого ответа, однако аргументация, приведенная в ответе, не совсем имеет смысла. Селектор y ~ x не отвечает «есть совпадение?» вопрос, потому что два селектора, приведенные здесь, означают совершенно разные вещи. Там нет никакого способа, y ~ x чтобы когда-либо произвести сопоставление, данное поддерево, например. Если вопрос «существует ли у?» тогда селектор просто y . Если вопрос «существует ли у данного брата х в любой произвольной позиции?» тогда вам понадобятся оба селектора. (Хотя, может быть, я просто придираюсь к этому моменту . )

Два трюка . В основном, инвертирование порядка HTML ваших желаемых элементов в HTML и использование оператора
~ Next siblings :

float-right + обратный порядок элементов HTML

div /* Do with the parent whatever you know just to make the inner float-right elements appear where desired */ display:inline-block; > span float:right; /* float-right the elements! */ > span:hover ~ span /* On hover target it's "previous";) elements */ background:red; > 

Источник

Читайте также:  Compare treemap in java
Оцените статью