Безопасен ли селектор типа * + *? - PullRequest
11 голосов
/ 15 февраля 2012

Недавно я столкнулся с этим селектором CSS, пытаясь найти способ легко выделить основные элементы блога, такие как абзацы и изображения. Примером его использования будет что-то вроде этого:

.post *+* {margin-top: 15px;}
/* or... */
.post > *+* {margin-top: 15px;}
/* if you don't want the margin to apply to nested elements */

На первый взгляд это показалось довольно полезным. Итак, мой вопрос: Каковы недостатки использования этих селекторов?

В частности:

  1. Какова поддержка браузера для этого?

  2. Есть ли случаи, когда вы не хотели бы иметь одинаковое расстояние между элементами в статье, и если нет, то проще ли сначала объявить это, а затем перезаписать или просто объявить каждый элемент отдельно?

  3. Есть ли у вас проблемы с производительностью, поскольку вы выбираете все дважды?

Ответы [ 3 ]

6 голосов
/ 15 февраля 2012
  1. Какова поддержка браузера для этого?

    По сути, IE7 + и любой другой современный браузер.

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

  2. Есть ли случаи, когда вы не хотели бы иметь равномерный интервал между элементами в статье, и если нет, проще ли сначала объявить это, а затем перезаписать или просто объявить каждый элемент отдельно?

    Это кажется довольно полезным на первый взгляд, но если вы подумаете об этом, вероятно, будет гораздо лучше уточнить, к чему применять маржу. Это одно правило, которое я могу себе представить, будет многократно переопределено во всей остальной таблице стилей другими определенными селекторами, что делает его довольно избыточным и даже нежелательным во многих случаях. Я не могу представить себе какое-либо использование в реальном мире для правила, подобного вашему примеру.

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

  3. Есть ли у вас проблемы с производительностью, так как вы выбираете все дважды?

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

    Теперь, люди говорят , что использование универсального селектора * в сочетании почти с любым комбинатором приводит к катастрофическим последствиям производительности рендеринга, поэтому люди говорят , что такого рода вещи следует избегать любой ценой. Но эти вещи вряд ли важны вообще (честно говоря, селектор, такой как * + *, всего на несколько микросекунд медленнее, чем p + p), так что вам действительно не нужно беспокоиться об этом. Сначала рассмотрите полезность самого правила CSS, а затем решите, действительно ли вам нужно правило, основанное на этом.


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

.post > * { margin: 15px 0; }

Возможно, стоит заменить * на p, только если вы знаете, что единственные дочерние элементы, которые вы хотите выделить - это параграфы:

.post > p { margin: 15px 0; }

Или любые абзацы в пределах .post по этому вопросу (например, в кавычках):

.post p { margin: 15px 0; }

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

2 голосов
/ 15 февраля 2012

Он называется «Селектор брата».

Согласно SitePoint , он поддерживается во всех последних браузерах и в IE8 +. IE7 имеет несколько ограничений, объясненных на странице SitePoint, но в основном будет работать.

Это определено в спецификации CSS2 .

О производительности: множество CSS переопределяет другие селекторы. Это часть каскадного характера этого. Кроме того, производительность зависит от движков рендеринга, поэтому не стоит беспокоиться о производительности, когда дело касается CSS.

0 голосов
/ 15 февраля 2012

Также следует учитывать ошибку IE7, связанную с игнорированием комбинатора смежных братьев и сестер (а также псевдокласса :first-child), если HTML-комментарий находится там, где IE7 ожидает увидеть элемент. Существует обходной путь , который удаляет комментарии как узлы DOM после загрузки страницы в IE7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...