Знак плюс ( +
) предназначен для следующего брата.
Есть ли эквивалент для предыдущего брата?
css
css-selectors
Jourkey
источник
источник
Ответы:
Нет, селектор «предыдущий брат» отсутствует.
С другой стороны,
~
это для родного брата-наследника (имеется в виду, что элемент идет после этого, но не обязательно сразу после) и является селектором CSS3.+
для следующего родного брата и CSS2.1.См. Смежный братский комбинатор от селекторов уровня 3 и 5.7 Смежные соседние братские селекторы от каскадных таблиц стилей, редакция 1 уровня 2 (CSS 2.1) .
источник
Я нашел способ стилизовать всех предыдущих братьев и сестер (напротив
~
), которые могут работать в зависимости от того, что вам нужно.Допустим, у вас есть список ссылок, и при наведении на одну из них все предыдущие должны стать красными. Вы можете сделать это так:
источник
float:right
). Для этого потребовался пробел между единицами / словами и отступами вместо полей, но он работает совершенно иначе!Селектор уровня 4 вводит
:has()
(ранее индикатор предмета!
), который позволит вам выбрать предыдущего брата с:... но на момент написания этой статьи, это некое преимущество за пределами поддержки браузеров.
источник
:has()
псевдокласс.Рассмотрим
order
свойство гибких и сеточных макетов.Я сосредоточусь на flexbox в примерах ниже, но те же понятия применимы к Grid.
С помощью flexbox можно смоделировать предыдущий селектор брата.
В частности,
order
свойство flex может перемещать элементы по экрану.Вот пример:
ШАГОВ
Сделайте
ul
гибкий контейнер.Обратный порядок братьев и сестер в разметке.
Используйте селектор брата, чтобы предназначаться для Элемента A (
~
или+
сделаю).Используйте
order
свойство flex, чтобы восстановить порядок братьев и сестер на визуальном дисплее.... и вуаля! Предыдущий родной селектор рождается (или, по крайней мере, имитируется).
Вот полный код:
Из спецификации flexbox:
Начальное
order
значение для всех элементов flex - 0.Также смотрите
order
в спецификации CSS Grid Layout .Примеры «предыдущих селекторов братьев и сестер», созданных с помощью
order
свойства flex .jsFiddle
Примечание: два устаревших представления о CSS
Flexbox разрушает давние убеждения о CSS.
Одним из таких убеждений является то, что предыдущий селектор брата не возможен в CSS .
Сказать, что это убеждение широко распространено, было бы преуменьшением. Вот выборка связанных вопросов только по переполнению стека:
Как описано выше, это убеждение не совсем верно. Предыдущий селектор брата может быть смоделирован в CSS с помощью
order
свойства flex .z-index
МифДругое давнее убеждение заключается в том, что он
z-index
работает только с позиционированными элементами.На самом деле, самая последняя версия спецификации - проект редактора W3C - все еще утверждает, что это правда:
В действительности, однако, эта информация является устаревшей и неточной.
Элементы, которые являются гибкими элементами или элементами сетки, могут создавать контексты стекирования, даже когда они
position
естьstatic
.Вот демонстрация
z-index
работы с не позиционированными элементами Flex: https://jsfiddle.net/m0wddwxs/источник
order
Свойство не является решением , поскольку оно предназначено исключительно для изменения визуального порядка, так что это не восстановить первоначальный семантический порядок , который вы вынуждены изменения в HTML для этого обходного пути на работу.z-index
будет работать, даже если «omg, там неposition
указано!», В спецификации упоминается концепция стекового контекста , что хорошо объясняется в этой статье о MDNfloat: right
(или с любым другим способом отменить порядок, которыйflex/order
имеет небольшие (наименьшие?) Побочные эффекты). Взбил две скрипки: демонстрацияfloat: right
подхода и демонстрацияdirection: rtl
У меня был тот же вопрос, но потом у меня был "дух" момент. Вместо того чтобы писать
записывать
Очевидно, что это соответствует «х» вместо «у», но отвечает «есть совпадение?» вопрос, и простой обход DOM может привести вас к нужному элементу более эффективно, чем зацикливание в javascript.
Я понимаю, что исходный вопрос был вопросом CSS, поэтому этот ответ, вероятно, совершенно не имеет значения, но другие пользователи Javascript могут наткнуться на вопрос с помощью поиска, как я.
источник
y ~ x
можно решить мою проблемуy ~ x
не отвечает "есть совпадение?" вопрос, потому что два селектора, приведенные здесь, означают совершенно разные вещи. Там нет никакого способа,y ~ x
чтобы когда-либо произвести сопоставление, данное поддерево,<root><x/><y/></root>
например. Если вопрос "существует ли у?" тогда селектор простоy
. Если вопрос «существует ли у данного брата х в любой произвольной позиции?» тогда вам понадобятся оба селектора. (Хотя, может быть, я просто придираюсь к этому моменту ...)Два трюка . В основном, инвертирование порядка HTML ваших желаемых элементов в HTML и использование оператора
~
Next siblings :float-right
+ обратный порядок элементов HTMLРодитель с
direction: rtl;
+ в обратном порядке внутренних элементовисточник
Вы можете использовать два селектора топора :
!
и?
В обычном CSS есть 2 последовательных селектора :
+
является непосредственным последующим селектором родного брата~
это любой последующий селектор родственныйВ обычном CSS нет никакого предыдущего родственного селектора .
Однако в библиотеке постпроцессора Axe CSS есть два предыдущих селектора :
?
является непосредственным предыдущим селектором родного брата (напротив+
)!
это любой предыдущий селектор родственный (противоположность~
)Рабочий пример:
В приведенном ниже примере:
.any-subsequent:hover ~ div
выбирает любой последующийdiv
.immediate-subsequent:hover + div
выбирает непосредственное последующееdiv
.any-previous:hover ! div
выбирает любой предыдущийdiv
.immediate-previous:hover ? div
выбирает непосредственно предыдущийdiv
источник
Еще одно решение flexbox
Вы можете использовать обратный порядок элементов в HTML. Тогда помимо использования,
order
как в ответе Michael_B, вы можете использоватьflex-direction: row-reverse;
илиflex-direction: column-reverse;
зависимости от вашего макета.Рабочий образец:
источник
Официального способа сделать это в настоящее время не существует, но вы можете использовать небольшой трюк для достижения этой цели! Помните, что он экспериментальный и имеет некоторые ограничения ... (проверьте эту ссылку, если вы беспокоитесь о совместимости навигатора)
Что вы можете сделать, это использовать селектор CSS3: псевдо-класс называется
nth-child()
Ограничения
источник
:nth-child(-n+4)
это псевдокласс, который нужно применить к селектору, чтобы он работал правильно. Если вы не уверены, попробуйте поэкспериментировать с вилкой моей скрипки, и вы увидите, что она не работает*
селектор, но это ужасно плохая практика.li#someListItem
и я хотел, чтобы узлы были перед ним (именно так я интерпретирую «предыдущий») - я не понимаю, как предоставленная вами информация может помочь мне выразить это через CSS. Вы просто выбираете первые n братьев и сестер и предполагаете, что я знаю n. Основываясь на этой логике, любой селектор может сделать свое дело и выбрать нужный мне элемент (ы) (например, not ()).Если вы знаете точную позицию,
:nth-child()
сработает исключение всех следующих братьев и сестер на основе.Который выбрал бы все
li
s до 3-го (например, 1-го и 2-го). Но, на мой взгляд, это выглядит некрасиво и имеет очень узкий сценарий использования.Вы также можете выбрать nth-child справа налево:
Который делает то же самое.
источник
Нет. Это невозможно через CSS. Он принимает "Каскад" близко к сердцу ;-).
Однако, если вы сможете добавить JavaScript на свою страницу, немного jQuery поможет вам достичь конечной цели.
Вы можете использовать jQuery
find
для «предварительного просмотра» целевого элемента / класса / id, а затем вернуться назад, чтобы выбрать цель.Затем вы используете jQuery, чтобы переписать DOM (CSS) для вашего элемента.
Основываясь на этом ответе Майка Бранта , может помочь следующий фрагмент jQuery.
Сначала выбираются все
<ul>
s, которые сразу же следуют за<p>
.Затем он «возвращается», чтобы выбрать все предыдущие
<p>
s из этого набора<ul>
s.По сути, «предыдущий брат» был выбран с помощью jQuery.
Теперь используйте
.css
функцию, чтобы передать новые значения CSS для этого элемента.В моем случае я искал способ выбрать DIV с идентификатором
#full-width
, но ТОЛЬКО если он имел (косвенный) потомок DIV с классом.companies
.Я контролировал весь HTML-код
.companies
, но не мог изменить ни один из HTML-кодов над ним.И каскад идет только в 1 направлении: вниз.
Таким образом я мог выбрать ВСЕ
#full-width
s.Или я мог выбрать,
.companies
что только следовал за#full-width
.Но я не мог выбрать только
#full-width
то, что продолжалось.companies
.И, опять же, я не смог добавить
.companies
выше в HTML. Эта часть HTML была написана внешне и обернула наш код.Но с помощью jQuery я могу выбрать нужные
#full-width
s, а затем назначить соответствующий стиль:Он находит все
#full-width .companies
и выбирает только те.companies
, которые похожи на то, как селекторы используются для нацеливания на определенные элементы в стандарте в CSS.Затем он использует
.parents
«backtrack» и выбирает ВСЕХ родителей.companies
,но фильтрует эти результаты, чтобы сохранить только
#fill-width
элементы, так что, в конце концов,он выбирает
#full-width
элемент, только если у него есть.companies
потомок класса.Наконец, он присваивает новое значение CSS (
width
) результирующему элементу.Справочные документы jQuery : элемент
$ () или jQuery () : DOM.
, find : Получить потомков каждого элемента в текущем наборе соответствующих элементов, отфильтрованных селектором, объектом jQuery или элементом.
, родители : Получить непосредственно предшествующий брат каждого элемента в наборе соответствующих элементов. Если предоставляется селектор, он извлекает предыдущего родного брата, только если он соответствует этому селектору (фильтрует результаты, чтобы включить только перечисленные элементы / селекторы).
, css : установить одно или несколько свойств CSS для набора соответствующих элементов.
источник
previousElementSibling
).previousElementSibling()
для тех, кто более знаком с нативными функциями JS DOM, может быть предложен другой путь, отличный от CSS.+
(несуществующий) селектор, который специально запрашивал OP. Считайте этот ответ JS "взломать". Это здесь, чтобы сэкономить время, которое я потратил, чтобы найти решение.Там нет «предыдущий» селектор родственный , к сожалению, но вы можете , возможно , , до сих пор получить тот же эффект , с помощью определения местоположения (например , флоат право). Это зависит от того, что вы пытаетесь сделать.
В моем случае я хотел использовать 5-звездочную систему рейтинга CSS. Мне нужно покрасить (или поменять иконку) предыдущие звезды. Плавая каждый элемент вправо, я, по сути, получаю тот же эффект (таким образом, HTML для звезд должен быть написан «назад»).
Я использую FontAwesome в этом примере и меняю между юникодами fa-star-o и fa-star http://fortawesome.github.io/Font-Awesome/
CSS:
HTML: (40)
JSFiddle: http://jsfiddle.net/andrewleyva/88j0105g/
источник
+
или~
селекторы поражают меня как самая чистая работа вокруг.В зависимости от вашей конкретной цели, есть способ достичь полезности родительского селектора без его использования (даже если бы он существовал) ...
Скажем, у нас есть:
Что мы можем сделать, чтобы блок Socks (включая цвета носков) выделялся визуально, используя интервалы?
Что бы хорошо, но не существует:
Что существует:
Это устанавливает все якорные ссылки на 15px наверху и сбрасывает его обратно на 0 для тех, у которых нет элементов UL (или других тегов) внутри LI.
источник
Мне нужно решение, чтобы выбрать предыдущий родной брат tr. Я придумал это решение, используя компоненты React и Styled. Это не мое точное решение (это по памяти, часы спустя). Я знаю, что есть ошибка в функции setHighlighterRow.
OnMouseOver для строки установит индекс строки в состояние и повторно отобразит предыдущую строку с новым цветом фона
источник
Нет и есть .
Если вы должны поместить метку перед входом, вместо этого поместите метку после ввода, сохраните и метку, и ввод внутри элемента div, и стилируйте элемент div следующим образом:
Теперь вы можете применить стандартные опции стилей для следующего брата, доступные в css, и вы увидите, что вы используете предыдущий стилевый стиль.
источник
У меня была похожая проблема, и я обнаружил, что все проблемы такого рода можно решить следующим образом:
и таким образом вы сможете стилизовать ваши текущие, предыдущие элементы (все элементы, переопределенные текущими и последующими элементами) и ваши следующие элементы.
пример:
Надеюсь, это кому-нибудь поможет.
источник