Можно ли обратититься к предыдущеме элементу в css?
<table>
<th>.. 0 ..</th>
<th>.. 1 ..</th>
</table>
<style>
th + th {
color: red;
} // так я обратился с 0 к 1
th - th {
color: red;
} // так бы я обратился но таково в css нет
</style>
Например меню. Пункты идут вертикально, между ними разделить в виде канавки имитируется двумя бордерами - предыдущий нижний посветлее и свой верхний потемнее.
При наведении на пункт он должен поменять цвет фона и разделители бывает "режут глаз", хорошо бы их обесцветить или подогнать цвет под новый.
Сергей delphinpro, ну да. В голову сразу лезет костыль с только border-top и box-shadow или псевдоэлементом (для двойной рамки). Красивее было бы с prev. Почему не добавили, непонятно.
Владимир Проскурин, вот-вот )
А по-поводу "почему не добавили" — где-то читал, что это связано с особенностями парсинга/построения DOM. Подробностей уже не помню, суть в том, что подобный селектор будет "тяжелым" для выполнения.
Возможно поэтому до сих пор нигде не реализован :has
Надо бы найти ту статейку, перечитать.
Сергей delphinpro, На самом деле, спорно. Если бы они по такой причине заботились о производительности, не существовало бы HTML5, т.к. XHTML своей строгостью позволяет быстрее анализировать документ. А html позволяет делать ляпы, не закрывать теги, писать атрибуты абы как, поэтому там много перерисовок и анализа. Еще есть :empty, который также заставит вернуться на уровень вверх, и применяется он после нахождения закрывающего тега. В этот же момент можно применять parent. Конечно, это что касается parent. С prev ситуация конечно сложнее, например если каждый элемент будет менять стили элементу prev, в больших списках это будет затратно. Но flex создает еще больше перерисовок.
Статья за 2011 год, возможно тогда это было актуально.
Хотя has реализовали для JS, и использоваться он будет как раз тогда, когда элемент и его потомки уже загружены. Возможно и правда.
Алексей Тен, смотря с какой стороны подойти
:empty был придуман примерно тогда же, когда и :last-child, и тогда уже стояла проблема о :parent, поэтому мне все еще сложно согласиться.
Владимир Проскурин, в порядке следования в DOM разумеется. Смысл в том, даже если у тебя пока только половина html, а остальное ещё грузится, ты уже можешь покрасить текст в синий и быть уверенныи, что это значение не поменяется после загрузки остального html.
Да, есть проблемы с рефлоу, таблицами и тп, но оригинальная мысль была такая
div {
background: red;
}
div:empty {
background: green;
}
т.е. красишь в красный, а потом он перекрашивается в зеленый. Я кстати не знаю, на сколько это заметно.
Очень много что может поменять текущее состояние элемента, картинки выше, flex, transition, дополнительные стили и.т.д.. Много чего если не брать под контроль, может поменять текущий элемент (ну не все свойства конечно), поэтому это не повод не добавлять селектор, который позволит не писать куча костылей. Оригинальная мысль должна была уйти с появлением CSS3, а теперь и с появлением CSS Houdini.