Знайомимось з SASS

14 хв. читання

Хочете вивчити Sass, але ніяк не складається? Тоді читайте далі, тому що сьогодні ми збираємося розглянути особливості Sass і деякі цікаві речі, які ви можете робити з його допомогою.

Що таке Sass?

Sass (Syntactically Awesome Style Sheets) \- це CSS-препроцесор, Він надає додатковий набір функцій, що робить процес написання стилів більш простим та швидким.

Як він працює?

Цікаве питання. Є кілька способів компілювання Sass:

  • Оригінальний бінарний файл Ruby Sass. Встановіть його з gem install sass і скомпілюйте, запустивши sassc myfile.scss myfile.css

  • GUI-додатки, такі як Hammer, CodeKit, або Compass;

  • Мій особистий фаворит libsass \- швидкий компілятор Sass, написаний на C. Ви можете встановити libsass через NPM з node-sass (npm install node-sass).

Який з них слід використовувати? Залежить від того, чим ви займаєтесь. Якщо Ви не людина "командного рядка", то GUI для вас.

Якщо вам просто потрібно попрактикуватися або поділитися прикладами, ідеальний вибір - Sassmeister. Це веб-Sass майданчик, який ми будемо використовувати в цій статті.

SASS або SCSS?

Коли вийшла перша версія Sass, основний синтаксис відрізнявся від CSS. Замість фігурних дужок були відступи, використання крапки з комою було необов'язковим, застосовувались стенографічні (скорочені) оператори.

Деякі люди не могли швидко освоїти синтаксис, тому у 3 версії Sass змінив основний синтаксис до .scss. SCSS вигладає як CSS, але має всі можливості Sass.

Ви можете застосовувати оригінальний синтаксис, якщо хочете. В статті ми розглядатимемо .scss.

Навіщо використовувати Sass?

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

Налаштування

  • Встановити компілятор на вибір і створити style.scss файл;

Або

Змінні

Sass приносить змінні в CSS.

Допустимі значення змінних: числа, рядки, кольори, null, списки і карти.

Змінні в Sass поширюються за допомогою символу $. Давайте створимо нашу першу змінну.

    $primaryColor: #eeffcc;

При компіляції ми просто встановлюємо змінну в межах області видимості, змін в CSS не відбувається. Надалі, ви можете використовувати її:

    $primaryColor: #eeffcc;
    
    body {
        background: $primaryColor;
    }

Sass має область видимості змінної, якщо ви оголошуєте змінну всередині селектора, її область дії буде обмежена цим селектором.

    $primaryColor: #eeccff;
    
    body {
      $primaryColor: #ccc;
      background: $primaryColor;
    }
    
    p {
      color: $primaryColor;
    }
    
    // Після компіляції, селектор нашого параграфа матиме колір #eeccff

Але що, якщо ми хочемо встановити глобальну змінну в декларації? Для цього слід використовувати !global:

    $primaryColor: #eeccff;
    
    body {
      $primaryColor: #ccc !global;
      background: $primaryColor;
    }
    
    p {
      color: $primaryColor;
    }
    
    // При компіляції,колір параграфа буде #ccc

Ще один дуже корисний інструмент, зокрема, при написанні mixins \- !default. Це дозволяє нам переконатися, що існує значення за замовчуванням для змінної, якщо значення вказано - воно буде перезаписане:

    $firstValue: 62.5%;
    
    $firstValue: 24px !default;
    
    body {
        font-size: $firstValue;
    }
    
    // розмір шрифта для body = 62.5%

Математика

На відміну від CSS, Sass дозволяє нам використовувати математичні вирази! Це супер корисно в mixins, і дозволяє нам робити деякі дійсно класні речі.

Підтримуються оператори:

  • \+ Додавання;

  • \- Віднімання;

  • / Ділення;

    • Множення;
  • % Залишок від ділення;

  • == Рівність;

  • != Нерівність.

Перед тим, як рухатися далі, я хочу відзначити два потенційних "підводних камені".

По-перше, при діленні, знак (/) потрібно обернути в дужки, так як цей символ також використовується в стенографічних CSS властивостях шрифту (наприклад, font: 14px/16px).

    $fontDiff: (14px/16px);

По-друге, ви не можете змішувати значення:

    $container-width: 100% - 20px;

Наведений вище приклад не буде працювати. Для цього конкретного прикладу ви могли б використовувати CSS функцію calc, так як вона повинна бути інтерпретована під час рендеринга.

Повертаючись до математики, давайте створимо динамічну декларацію стовпця, виходячи з базової ширини контейнера:

    $container-width: 100%;
    
    .container {
      width: $container-width;
    }
    
    .col-4 {
      width: $container-width / 4;
    }
    
    //  Компілюється в:
    //  .container {
    //   width: 100%;
    //  }
    //
    //  .col-4 {
    //      width: 25%;
    //  }

Функції

Краща частина Sass, на мій погляд - це вбудовані функції. Ви можете побачити повний список тут. ВІН ВЕЛИКИЙ.

Чи було у вас таке, що ви хотіли створити гарну на вигляд кнопку і витрачали години, щоб підібрати для неї потрібні ефекти та тіні?

Скористайтесь функцією darken(). Ви можете встановити колір та процент затемнення.

Вкладання

Корисною особливістю Sass є можливість вкладання декларацій. Це означає, що ви здатні мати декларації всередині декларації. У звичайному CSS ми робимо так:

    .container {
        width: 100%;
    }
    
    .container h1 {
        color: red;
    }

Але в Sass ми можемо отримати такий же результат, написавши:

    .container {
        width: 100%;
        h1 {
            color: red;
        }
    }

Що, якщо ми хочемо посилатися на батьківський елемент? Це досягається за допомогою символа &(amp);.Погляньте, як ми можемо використовувати це, щоб додати псевдо-селектори для анкерних елементів:

    a.myAnchor {
        color: blue;
        &;:hover {
            text-decoration: underline;
        }
        &;:visited {
            color: purple;
        }
    }

Тепер ми знаємо, що таке вкладання.

Якщо ми хочемо виконати протилежну дію, нам потрібно використовувати @at- root директиви. Нехай ми маємо таку структуру вкладеності:

    .first-component {
        .text { font-size: 1.4rem; }
        .button { font-size: 1.7rem; }
        .second-component {
            .text { font-size: 1.2rem; }
            .button { font-size: 1.4rem; }
        }
    }

Вкладення - дійсно відмінний спосіб заощадити час і зробити ваші стилі більш читабельними, але пам'ятайтеся правило: не більше, ніж чотири рівня вкладеності.

Імпорт

Імпорт дозволяє розбити стилі в окремі файли і з легкістю імпортувати їх. Ми можемо імпортувати .scss файли за допомогою директиви @import:

    @import "grids.scss";

Вказувати розширення необов'язково:

    @import "grids";

Sass компілятори також включають в себе концепцію "частин". Якщо .sass або .scss файл має підкреслення (наприклад, _partial.scss), він не компілюється в CSS. Це корисно, якщо файл існує тільки для того, щоб імпортувати його в головний файл style.scss.

Extend і Заповнювачі

@extend директива є відмінним способом, щоб успадкувати вже існуючі стилі.

    .input {
      border-radius: 3px;
      border: 4px solid #ddd;
      color: #555;
      font-size: 17px;
      padding: 10px 20px;
      display: inline-block;
      outline: 0;
    }
    
    .error-input {
      @extend .input;
      border:4px solid #e74c3c;
    }

Зверніть увагу, що це не копіювання стилів з .input в .error-input.

Але що робити, якщо ми хочемо продовжити декларацію з набором стилів, які вже не існують? Нам потрібен заповнювач.

    %input-style {
        font-size: 14px;
    }
    
    input {
        @extend %input-style;
        color: black;
    }

Заповнювач працює з префіксом ім'я класу, додаючи символ %.В результаті, елементи опиняються в одному блоці.

Mixins

Mixin директива є неймовірно корисною особливістю Sass, вона дозволяє включати стилі так само як і @extend, але з можливістю підтримки й інтерпретації аргументів.

Sass використовує @mixin директиви для визначення mixins і директиви @include, щоб їх використовувати. Побудуємо простий mixin, який ми зможемо використовувати для медіа-запитів!

Перший крок - це визначення нашого mixin:

    @mixin media($queryString){
    
    }

Ми викликаємо наш mixin і додаємо $queryString аргумент. Після додавання mixin, ми можемо додати рядковий аргумент, який буде динамічно рендиритись.

    @mixin media($queryString){
        @media #{$queryString} {
          @content;
        }
    }

Ми хочемо, щоб наш рядковий аргумент з'являвся там де нам потрібно, ми використовуємо Sass синтаксис інтерполяції, #{}. Коли ви додаєте змінну у фігурні дужки, вона не рахується, а виводиться.

Ще один шматок нашої головоломки - @content директиви. Коли ви обертаєте mixin навколо вмісту за допомогою фігурних дужок, обгорнутий контент стає доступним через @content директиву.

І, нарешті, давайте використаймо mixin з @include:

    .container {
        width: 900px;
        @include media("(max-width: 767px)"){
            width: 100%;
        }
    }

Директивні функції

Директивні функції у Sass схожі на mixins, але замість повернення розмітки, вони повертають значення через @return. Вони можуть бути використані для DRY (don't repeat yourself) вашого коду, і зробити його більш зручним для читання.

Давайте підемо далі і створимо директивну функцію, щоб прибрати наші grid- розрахунки з grid-демо:

    @function getColumnWidth($width, $columns,$margin){
        @return ($width / $columns) - ($margin * 2);
    }

Тепер ми можемо використовувати цю функцію в коді нижче:

    $container-width: 100%;
    $column-count: 4;
    $margin: 1%;
    
    .container {
      width: $container-width;
    }
    
    .column {
      background: #1abc9c;
      height: 200px;
      display: block;
      float: left;
      width: getColumnWidth($container-width,$column-count,$margin);
      margin: 0 $margin;
    }

Демо

Тепер в нашому розпорядженні є всі вищезгадані інструменти. Давайте створимо наш власний grid-фреймворк.

Почнемо з створення карти налаштуваннь:

    $settings: (
        maxWidth: 800px,
        columns: 12,
        margin: 15px,
        breakpoints: (
            xs: "(max-width : 480px)",
            sm: "(max-width : 768px) and (min-width: 481px)",
            md: "(max-width : 1024px)  and (min-width: 769px)",
            lg: "(min-width : 1025px)"
        )   
    );

Далі давайте напишемо mixin, який буде рендерити наш фреймворк:

    @mixin renderGridStyles($settings){
    
    }

Нам потрібно візуалізувати розмітку для кожної точки зупину, тож давайте перебиремо їх і викличемо наш медіа-mixin. Використаймо map-get метод, щоб отримати значення точок, і нашу @each директиву, щоб виконати ітерації через отримані значення:

    @mixin renderGridStyles($settings){
      $breakpoints: map-get($settings, "breakpoints");
      @each $key, $breakpoint in $breakpoints {
        @include media($breakpoint) {
          
        }
      }
    }

Ми повинні отримати фактичну сітку розмітки з ітерації, тому давайте створимо renderGrid mixin. Скористаємось map-get методом, щоб отримати карту значень і @while директиву для перебору стовпців з $i в якості індексу. Ми рендеримо ім'я класу за допомогою інтерполяції.

    @mixin renderGrid($key, $settings) {
      $i: 1;
      @while $i <;= map-get($settings, "columns") {
        .col-#{$key}-#{$i} {
          float: left;
          width: 100% * $i / map-get($settings,"columns");
        }
        $i: $i+1;
      }
    }

Додаємо контейнер та стилі:

    .container {
        padding-right: map-get($settings, "margin");
        padding-left: map-get($settings, "margin");
        margin-right: auto;
        margin-left: auto;
    }
    
    .row {
        margin-right: map-get($settings, "margin") * -1;
        margin-left: map-get($settings, "margin") * -1;
    }
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.6K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація