Вёрстка сайта с использованием 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: {
        // Автоматически инджектить globals в каждый файл
        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

// Media queries
@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;
  }
}

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

// Fluid typography
@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 дней.