Верстка сайту з використанням SASS/SCSS

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.
Розробка та обслуговування будь-яких видів сайтів:
Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Верстка сайту з використанням SASS/SCSS
Проста
~2-3 робочих дні
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Вёрстка сайту із SASS/SCSS

SCSS — синтаксична надбудова над CSS із підтримкою змінних, вкладеності, миксинів, функцій, умов та циклів. Компілюється в чистий CSS без runtime-залежностей. Dart Sass — поточна еталонна реалізація, LibSass застарів. У 2024 році SCSS залишається стандартом для проектів без React або з вимогою мінімального bundle без CSS-in-JS.

Встановлення

npm install -D sass

Vite підтримує .scss з коробки після встановлення sass:

// vite.config.ts
import { defineConfig } from 'vite';

export default defineConfig({
  css: {
    preprocessorOptions: {
      scss: {
        // Автоматично інджектити глобали в кожен файл
        additionalData: `@use "@/styles/abstracts" as *;`,
        api: 'modern-compiler', // Dart Sass 2.x API
      },
    },
  },
});

Архітектура 7-1

src/styles/
  abstracts/
    _variables.scss      ← змінні (розміри, breakpoints)
    _colors.scss         ← палітра кольорів
    _functions.scss      ← допоміжні функції
    _mixins.scss         ← переиспользовані блоки
    _index.scss          ← @forward все з abstracts
  base/
    _reset.scss
    _typography.scss
    _root.scss           ← CSS Custom Properties
  components/
    _button.scss
    _card.scss
    _nav.scss
    _modal.scss
  layout/
    _grid.scss
    _header.scss
    _footer.scss
    _section.scss
  pages/
    _home.scss
    _about.scss
    _contact.scss
  themes/
    _light.scss
    _dark.scss
  main.scss              ← точка входу, @use все
// abstracts/_variables.scss
$grid-breakpoints: (
  'xs': 0,
  'sm': 576px,
  'md': 768px,
  'lg': 992px,
  'xl': 1280px,
  '2xl': 1536px,
) !default;

$container-max-widths: (
  'sm': 540px,
  'md': 720px,
  'lg': 960px,
  'xl': 1200px,
  '2xl': 1400px,
) !default;

$spacers: (
  0: 0,
  1: 0.25rem,
  2: 0.5rem,
  3: 0.75rem,
  4: 1rem,
  5: 1.5rem,
  6: 2rem,
  7: 3rem,
  8: 4rem,
  9: 6rem,
) !default;

$font-sizes: (
  'xs': 0.75rem,
  'sm': 0.875rem,
  'base': 1rem,
  'lg': 1.125rem,
  'xl': 1.25rem,
  '2xl': 1.5rem,
  '3xl': 1.875rem,
  '4xl': 2.25rem,
  '5xl': 3rem,
) !default;

Миксини

// abstracts/_mixins.scss

// Медіа-запити
@mixin respond-to($breakpoint) {
  $value: map.get($grid-breakpoints, $breakpoint);
  @if $value == null {
    @error 'Unknown breakpoint: #{$breakpoint}';
  }
  @media (min-width: $value) {
    @content;
  }
}

// Флекс-центрування
@mixin flex-center($direction: row) {
  display: flex;
  flex-direction: $direction;
  align-items: center;
  justify-content: center;
}

// Обрізка тексту
@mixin truncate($lines: 1) {
  @if $lines == 1 {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
  } @else {
    display: -webkit-box;
    -webkit-line-clamp: $lines;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
}

// Візуально приховано (доступність)
@mixin visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}

// Флюїдна типографія
@mixin fluid-type($min-size, $max-size, $min-width: 320px, $max-width: 1280px) {
  font-size: $min-size;

  @media (min-width: $min-width) {
    font-size: clamp(
      #{$min-size},
      #{$min-size} + #{($max-size - $min-size)} * ((100vw - #{$min-width}) / #{($max-width - $min-width)}),
      #{$max-size}
    );
  }
}

// Стандартизований focus ring
@mixin focus-ring($color: var(--color-accent)) {
  &:focus-visible {
    outline: 2px solid $color;
    outline-offset: 2px;
  }
}

Компоненти

// components/_button.scss
@use '../abstracts' as *;

.btn {
  @include flex-center;
  @include focus-ring;

  gap: 0.5rem;
  font-family: inherit;
  font-weight: 500;
  border: 1px solid transparent;
  cursor: pointer;
  white-space: nowrap;
  text-decoration: none;
  transition:
    background-color 150ms ease,
    border-color 150ms ease,
    color 150ms ease,
    transform 100ms ease;

  &:active { transform: scale(0.98); }
  &:disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
  }

  // Розміри
  &--sm {
    height: 32px;
    padding: 0 12px;
    font-size: map.get($font-sizes, 'sm');
    border-radius: 4px;
  }

  &--md {
    height: 40px;
    padding: 0 16px;
    font-size: map.get($font-sizes, 'base');
    border-radius: 8px;
  }

  &--lg {
    height: 48px;
    padding: 0 24px;
    font-size: map.get($font-sizes, 'lg');
    border-radius: 8px;
  }

  // Варіанти
  &--primary {
    background: var(--color-accent);
    color: #fff;
    &:hover:not(:disabled) { background: var(--color-accent-dark); }
  }

  &--ghost {
    background: transparent;
    color: var(--color-accent);
    border-color: var(--color-accent);
    &:hover:not(:disabled) { background: var(--color-accent-light); }
  }

  &--full { width: 100%; }
}
// layout/_grid.scss
@use '../abstracts' as *;

.container {
  width: 100%;
  margin-inline: auto;
  padding-inline: 1rem;

  @each $name, $max-width in $container-max-widths {
    @include respond-to($name) {
      max-width: $max-width;
    }
  }
}

.row {
  display: flex;
  flex-wrap: wrap;
  margin-inline: -0.75rem;
}

@for $i from 1 through 12 {
  .col-#{$i} { flex: 0 0 auto; width: percentage(math.div($i, 12)); }
}

@each $bp, $value in $grid-breakpoints {
  @if $value > 0 {
    @include respond-to($bp) {
      @for $i from 1 through 12 {
        .col-#{$bp}-#{$i} { flex: 0 0 auto; width: percentage(math.div($i, 12)); }
      }
    }
  }
}

Головний файл

// main.scss
@use 'sass:math';
@use 'sass:map';
@use 'sass:color';

@use 'base/reset';
@use 'base/root';
@use 'base/typography';

@use 'layout/grid';
@use 'layout/header';
@use 'layout/footer';

@use 'components/button';
@use 'components/card';
@use 'components/nav';

@use 'pages/home';
@use 'pages/about';

Терміни

Настройка архітектури та базових абстракцій: 3–5 годин. Вёрстка сторінки: порівняна з звичайним CSS при наявності готової системи миксинів. Корпоративний сайт 5–8 сторінок: 4–7 днів.