sass
Zagnieżdżanie
Szukaj…
Podstawowe zagnieżdżanie
Ilekroć deklarujesz nową regułę w innej regule, nazywa się to zagnieżdżaniem. W przypadku podstawowego zagnieżdżania, jak pokazano poniżej, zagnieżdżony selektor zostanie skompilowany jako nowy selektor CSS z dodanymi wszystkimi rodzicami oddzielonymi spacją.
// SCSS .parent { margin: 1rem; .child { float: left; } } // CSS output .parent { margin: 1rem; } .parent .child { float: left; }
Głębokość zagnieżdżenia
Zagnieżdżanie jest bardzo potężną funkcją, ale należy z nią korzystać ostrożnie. Może się zdarzyć dość łatwo i szybko, że zaczniesz zagnieżdżać się i włączać wszystkie dzieci w gnieździe, gnieździe, gnieździe. Pokażę:
// SCSS
header {
// [css-rules]
.holder {
// [css-rules]
.dropdown-list {
// [css-rules]
ul {
// [css-rules]
li {
margin: 1rem 0 0 1rem;
}
}
}
}
}
// CSS output of the last rule
header .holder .dropdown-list ul li {
margin: 1rem 0 0 1rem;
}
Problemy
Specyficzność
li
z powyższego przykładu ma ustawiony margin
. Powiedzmy, że chcemy to później zastąpić w zapytaniu o media.
@media (max-width: 480) {
// will not work
.dropdown-list ul li {
margin: 0;
}
// will work
header .holder .dropdown-list ul li {
margin: 0;
}
}
Dlatego zagnieżdżając zbyt głęboko, będziesz musiał zagnieżdżać się ponownie za każdym razem, gdy chcesz zastąpić określoną wartość. Co gorsza, często stosuje się zasadę !important
@media (max-width: 480) {
// BIG NO-NO, don't do this
.dropdown-list ul li {
margin: 0 !important;
}
Dlaczego !important
zasada jest złym pomysłem
Powinieneś napisać swój SCSS w dobry sposób, aby te obejścia nie były w ogóle konieczne. Używanie !important
w tak drobnych kwestiach już doprowadzi cię do króliczej nory!
Wielokrotnego użytku
Jest to dość podobne do problemu specyficzności, ale warto zwrócić uwagę osobno. Jeśli stylizujesz coś w stylu przycisku, a nawet menu rozwijanego, możesz chcieć ponownie użyć tych stylów w innym miejscu na stronie.
Poprzez zbyt głębokie zagnieżdżenie twoje style są powiązane tylko z elementami znajdującymi się w najbardziej zewnętrznym rodzicu (element na górze twojego SCSS). To prowadzi do kopiowania stylów i wklejania ich gdzie indziej. Prawdopodobnie w innej regule zagnieżdżonej.
Twoje arkusze stylów będą coraz większe i trudniejsze w utrzymaniu.
Jak głęboko powinieneś zagnieździć?
Większość poradników stylów ustawia maksymalną głębokość na 2. Jest to ogólnie dobra rada, ponieważ jest bardzo niewiele okazji, w których chciałbyś zagnieżdżać się głębiej. W większości przypadków 2 wystarcza.
Zagnieżdżanie z @ at-root
Zagnieżdżanie jest prawdopodobnie najczęściej używane do tworzenia bardziej szczegółowych selektorów, ale można go również wykorzystać do organizacji kodu. Korzystając z dyrektywy @at-root
, możesz „wyskoczyć” z miejsca, w którym zagnieżdżasz ją w Sassie, przywracając cię z powrotem na najwyższy poziom. Dzięki temu możesz grupować style bez tworzenia większej szczegółowości niż potrzebujesz.
Na przykład możesz zrobić coś takiego:
.item {
color: #333;
@at-root {
.item-wrapper {
color: #666;
img {
width: 100%;
}
}
}
.item-child {
background-color: #555;
}
}
To by się skompilowało do tego:
.item {
color: #333;
}
.item-wrapper {
color: #666;
}
.item-wrapper img {
width: 100%;
}
.item .item-child {
background-color: #555;
}
W ten sposób wszystkie nasze style związane z klasą .item
są razem w SCSS, ale niekoniecznie potrzebujemy tej klasy w każdym selektorze.
Z wyłączeniem kontekstów
Domyślnie deklaracje wewnątrz @at-root
pojawią się w dowolnym kontekście. Oznacza to, że reguły wewnątrz bloku @media
na przykład pozostaną.
@media print {
.item-wrapper {
@at-root {
.item {
background: white;
}
}
}
}
// Will compile to
@media print {
.item {
background: white;
}
}
Nie zawsze jest to pożądane zachowanie, więc można wykluczyć kontekst medialny, przekazując media
do opcji „ without
dyrektywy @at-root
.
@at-root (without: media) {..
Aby uzyskać więcej informacji, zobacz oficjalną dokumentację
Selektor nadrzędny (&)
Zagnieżdżanie doskonale nadaje się do utrzymywania powiązanych selektorów, aby ułatwić przyszłym programistom zrozumienie kodu. Selektor nadrzędny reprezentowany przez znak ampersand („&”) może to zrobić w bardziej złożonych sytuacjach. Istnieje kilka sposobów jego wykorzystania.
Utwórz nowy selektor, który wymaga zarówno selektora nadrzędnego, jak i innego na tym samym elemencie, umieszczając nowy selektor bezpośrednio za selektorem nadrzędnym.
// SCSS .parent { &.skin { background: pink; } }
// CSS output .parent.skin { background: pink; }
Niech rodzic pojawi się za zagnieżdżonym selektorem w skompilowanym CSS, umieszczając selektor nadrzędny za zagnieżdżonym selektorem.
// SCSS .parent { .wrapper & { border: 1px solid black; } }
// CSS output .wrapper .parent { border: 1px solid black; }
Stany i pseudoelementy
Oprócz używania zagnieżdżania dla klas i dzieci, zagnieżdżanie za pomocą selektora rodzica jest również powszechnie używane do łączenia stanów :active
:hover
i :focus
dla łączy.
// SCSS
a {
color: blue;
&:active,
&:focus {
color: red;
}
&:visited {
color: purple;
}
}
// CSS output a { color: blue; } a:active, a:focus { color: red; } a:visited { color: purple; }
Podobnie można stylizować pseudoelementy, zagnieżdżając je za pomocą selektora rodzica.
// SCSS .parent { &::after { display: table; clear: both; content: ''; } &::only-child { font-weight: bold; } }
// CSS output .parent::after { display: table; clear: both; content: ''; } .parent::only-child { font-weight: bold; }
Właściwości zagnieżdżania
Niektóre właściwości CSS należą do przestrzeni nazw, na przykład border-right
należy do przestrzeni nazw border
. Aby napisać mniej, możemy wykorzystać zagnieżdżanie właściwości i pomijać te prefiksy, nawet na wielu poziomach.
Gdybyśmy musieli utworzyć granicę po prawej i lewej stronie klasy o nazwie .borders
, moglibyśmy napisać to:
//SCSS .borders { border: 2px dashed blue; border: { left: 1px solid black; right: 1px solid red; } } // CSS output .borders { border: 2px dashed blue; border-left: 1px solid black; border-right: 1px solid red; }
To oszczędza nam konieczności pisania border-right
i border-left
, jednak wciąż piszemy powtarzalny kod z liniami 1px solid black
i 1px solid red
. Możemy napisać jeszcze mniej powtarzalny CSS, wykonując następujące czynności:
// SCSS
.borders {
border: 2px dashed blue {
left: 1px solid black;
right: {
color: red;
}
}
}
// CSS output
.borders {
border: 2px dashed blue;
border-left: 1px solid black;
border-right-color: red;
}