Препроцесор SSCS: змінні, вкладення


Sass (Syntactically Awesome Stylesheets) — це скриптова метамова, яка компілюється в звичайні CSS-стилі.

 Препроцесор SСSвикористовує: 

  • змінні, 
  • цикли, 
  • міксини, 
  • функції .

Особливості препроцесора SСSS:

  • читаність: синтаксис дуже схожий на CSS; 
  • крива навчання: додається тільки кілька додаткових можливостей до CSS;
  •  сумісність: CSS-файл є коректним SCSS-файлом; 
  • ресурси: багато статей для читання і бібліотек з відкритим вихідним кодом для використання; 
  • розширюваність: легко перейти від SCSS до Sass.

Можливості Sass

  • зміннізамість повторення #fce473 у всьому файлі CSS, просто встановити $yellow: #fce473 один раз;
  •  вкладення: правила CSS можуть бути вкладені одна в одну; 
  • домішки: призначені для користувача функції, які можуть приймати параметри і виключити непотрібні повтори; 
  • розширення: найпростіший спосіб наслідувати однакові властивості іншого селектора; 
  • оператори: додавання, віднімання, множення і ділення значень, на кшталт 960px / 4 або $space * 2.

Змінні в Sass

синтаксис:  змінна починається  зі знака долара ($):

$yellow: #fce473;

Цей рядок нічого не робить, крім визначення змінної, в даному випадку відтінку жовтого: значення # fce473 є змінною. Сенс імені $yellow залишається незмінним, але значення може змінитися.

Приклад:

$pink: #ff1493;
.quote { border-left: 5px solid $pink; }
.button { background: $pink; }
.sidebar a:hover { border-bottom-color: $pink; }
.footer a { color: $pink; }

Препроцесор зкомпіює це у  код CSS таким чином:

.quote { border-left: 5px solid #ff1493; }


.button { background: #ff1493; }
.sidebar a:hover { border-bottom-color: #ff1493; }
.footer a { color: #ff1493; }

Якщо потрібно  перейти на інший відтінок рожевого, то досить  змінити  один раз  колір у змінній $pink

$pink: 
#c71585;

See the Pen scss-змінні by kravets (@raisa69) on CodePen.

Приклад:

А якщо  потрібно використовувати не рожевий в якості основного кольору, а зелений, то потрібно визначити змінну $ green: # 32cd32 і замінити в  CSS все $ pink на $ green

// Визначення значення кольору
$yellow: #fce473;
$pink: #c71585;
$green: #32cd32;
$blue: #1d90ff;
  
// Визначення основного кольору
$primary-color: $green;
  
.quote { border-left: 5px solid $primary-color; }
.button { background: $primary-color; }
.sidebar a:hover { border-bottom-color: $primary-color; }
.footer a { color: $primary-color; }

Замість безпосереднього посилання на змінну $green, визначається змінна для основного кольору, яка встановлюється як $green.

See the Pen scss-змінні основні by kravets (@raisa69) on CodePen.

Застосувати цей спосіб можна не тільки для кольорів:

// Колір
$yellow:              #fce473;
$pink:                #c71585;
$green:               #32cd32;
$blue:                #1d90ff;
  
$primary-color:       $blue;
$secondary-color:     $yellow;

// Шрифти
$serif:               "Lora", "Playfair Display", Georgia, serif;
$sans-serif:          "Roboto", "Source Sans Pro", "Open Sans", Arial, sans-serif;
$monospace:           "Inconsolata", monospace;
  
$primary-font:        $sans-serif;
$secondary-font:      $serif;

// Відстані
$mobile-space:        10px;
$desktop-space:       35px;
$blue: #3bbfce; /* колір */
$margin: 16px; /* відступ */
$fontSize: 14px; /* розмір тексту */

Вкладення в Sass (nesting)

У Sass правила вкладення CSS дозволяють визначити ієрархію селекторів:

 SCSS

.title {
  strong {}
  em {}
}

Це буде скомпільовано в наступне: 

CSS

.title {}
.title strong {}
.title em {}

Оскільки strong і em з'являються всередині правила .title (між двох фігурних дужок), то обидва вони будуть починатися з батьківського селектора .title.

Мета вкладення 

Оскільки пріоритет в CSS може виявитися непростим, то при написанні селекторів зазвичай використовують специфічність, шляхом комбінації декількох класів або тегів, щоб заборонити взаємовиключні правила CSS

.description {}
.description p {}
.description p a {}
.description p a:hover {}
.description p strong {}
.description table {}
.description table tr {}
.description table tr:nth-child(2n) {}
.description table th,
.description table td {}
.description table td.empty,
.description table th.empty {}
.description table th {}

Щоб запобігти повторному написанню .description можна використовувати вкладення: 

SCSS

description {
  p {}
  p a {}
  p a:hover {}
  p strong {}
  table {}
  table tr {}
  table tr:nth-child(2n) {}
  table th,
  table td {}
  table th {}
  table td.empty,
  table th.empty {}
}

В прикладі вище  ще є повтори тегів p і table, тому вкладення можна  поглибити:

.description {
  p {
    a {
      &:hover {}
    }
    strong {}
  }
  table {
    tr {
      &:nth-child(2n) {}
    }
    th,
    td {
      &.empty {}
    }
    th {}
  }
}

Відступи в Sass між батьківським селектором і його дочірнім  дозволяють відтворити, як елементи HTML вкладені один в один.

// SCSS
.parent {
  .child {}
}
  
// перетворюється в CSS
.parent .child {}

Пропуск між .parent і .child визначає ієрархію: цей селектор націлюється на елементи HTML з class = "child" вкладені в class = "parent".

See the Pen scss-вкладеність by kravets (@raisa69) on CodePen.

Вкладеність властивостей

See the Pen scss-вкладені властивості by kravets (@raisa69) on CodePen.


Амперсанд батьківського селектора

Якщо потрібно  в селекторах використати псевдокласи, то  можна застосувати знак амперсанд:

// SCSS
.parent {
  &:hover {}
  &.other-class {}
}
  
// компілюється в CSS
.parent:hover {}
.parent.other-class {}

Увага! між .parent і : hover або .other-class немає пробілу.

За допомогою символу & можна явно вказати, де повинен бути вставлений батьківський селектор.

Приклад:

CSS

.post-content {}
.post-content a {}
.post-content a:hover {}
.post-content aside {}
.post-content blockquote {}
.post-content code {}
.post-content h3 {}
.post-content h3 a {}
.post-content h4 {}
.post-content h4:before {}
.post-content h4:after {}
.post-content p {}
.post-content p:first-child {}
.post-content p:last-child {}
.post-content ul {}
.post-content ul ul {}
.post-content ul ul ul {}
.post-content dl {}
.post-content dl:before {}
.post-content dl dt {}
.post-content dl dd {}
.post-content pre {}
.post-content pre code {}
.post-content table {}
.post-content table tr {}
.post-content table tr:nth-child(2n) {}
.post-content table th,
.post-content table td {}
.post-content table th {}
.post-content table td.empty,
.post-content table th.empty {}
.post-content table code {}
.post-content table pre {}
.post-content table pre:before {}

SCSS

.post-content {
  a {
    &:hover {}
  }
  aside {}
  blockquote {}
  code {}
  h3 {
    a {}
  }
  h4 {
    &:before {}
    &:after {}
  }
  p {
    &:first-child {}
    &:last-child {}
  }
  ul {
    ul {
      ul {}
    }
  }
  dl {
    &:before {}
    dt {}
    dd {}
  }
  pre {
    code {}
  }
  table {
    tr {
      &:nth-child(2n) {}
    }
    th,
    td {
      &.empty {}
    }
    th {}
    code {}
    pre {
      &:before {}
    }
  }
}