sass: первый потомок не работает

#css #sass #pseudo-element

#css #sass #псевдоэлемент

Вопрос:

Я не использую SASS очень долгое время и хотел бы знать, есть ли какие-то проблемы с псевдоэлементами, такими как :first-child или :last-child ?

Комментарии:

1. В scss мне пришлось сделать: div { > div:nth-child(1) { styles } }

Ответ №1:

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

Что касается вашего вопроса о том, есть ли какие-либо проблемы, я бы сказал, что на самом деле я их не видел, хотя синтаксис для псевдоэлемента может быть немного сложным, особенно при первом разборе. Итак:

 div#top-level
  declarations: ...
  div.inside
    declarations: ...
    amp;:first-child
      declarations: ...
  

который компилируется, как и следовало ожидать:

 div#top-level{
  declarations... }
div#top-level div.inside {
  declarations... }
div#top-level div.inside:first-child {
  declarations... }
  

Я не видел никакой документации ни по одному из этого, за исключением заявления о том, что «sass может делать все, что может делать css». Как всегда, с Haml и SASS отступ — это все.

Комментарии:

1. Очень полезно — как указано выше, не забудьте поставить amp; перед :first-child , как в amp;:first-child

2. В вашем примере, разве вы не должны ожидать, что это скомпилируется в div#top-level:first-child? amp;: первый потомок находится за пределами блока div.inside, зачем его применять к div.inside?

3. @Danny: Абсолютно верно — я обновил пример, чтобы отразить.

Ответ №2:

Я думаю, что лучше (по моему опыту) использовать: :first-of-type , :nth-of-type() , :last-of-type . Это можно сделать, немного изменив правила, но я смог сделать гораздо больше, *-of-type чем *-child селекторы.

Ответ №3:

Именно так я обычно пишу псевдоэлементы :first-child , :last-child и :nth-child(n) в sass

 .my-class {
    amp;:first-child {
       // your css code             
    }

    amp;:last-child {
       // your css code             
    }

    amp;:nth-child(2) {
       // your css code             
    }
}
  

Ответ №4:

Прежде всего, все еще существуют браузеры, которые не поддерживают эти псевдоэлементы (т. Е.: первый потомок, : последний потомок), поэтому вам придется «разобраться» с этой проблемой.

Есть хороший пример, как заставить это работать без использования псевдоэлементов:

http://www.darowski.com/tracesofinspiration/2010/01/11/this-newbies-first-impressions-of-haml-and-sass/

— смотрите пример канала с разделителем.

Я надеюсь, что это было полезно.

Комментарии:

1. Кстати, приятно знать, что :first-child существует с нами со времен CSS2 и, следовательно, широко поддерживается, тогда как :last-child был добавлен только в CSS3.

2. Я согласен с вами, @Ronny, но все же людям приходится сталкиваться с некоторыми проблемами со старыми версиями браузеров, хотя: first_child появился в CSS2, старые браузеры глючат. Ссылка: reference.sitepoint.com/css/pseudoclass-firstchild

3. Да, но при работе с наиболее распространенными случаями — удалением первой / последней границы и т.п., нет причин использовать еще менее поддерживаемый селектор. В остальном я полностью за агрессивную деградацию 😉