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;
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow