نگارش SCSS و خروجی CSS
فایل .scss نحو CSSمانند دارد و کامپایلر آن را به CSS معمولی تبدیل میکند؛ فایل Sass فشردهٔ .sass از تورفتگی استفاده میکند.
$brand: #46eac2;.button { color: $brand; font-weight: 700;}
راهنمای کاربردی Sass برای ساخت stylesheetهای قابلنگهداری؛ از متغیر، تودرتویی و mixin تا ماژولها، تابعهای رنگ و ساخت ruleهای پویا با شرط و حلقه. مثالها بر مبنای SCSS و الگوهای ماژولار امروزی نوشته شدهاند. Sass امکاناتی برای سازماندهی stylesheet اضافه میکند و در نهایت به CSS تبدیل میشود. مثالها از نگارش SCSS با آکولاد استفاده میکنند؛ برای پروژههای جدید ماژولهای @use و @forward را جایگزین @import قدیمی کنید. Mixinها بلوک اعلانهای قابلاستفادهٔ مجدد میسازند و تابعها برای محاسبه مقدار برمیگردانند. پارامترهای پیشفرض و بلوکهای content را برای API روشن و قابلگسترش تعریف کنید. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
فایل .scss نحو CSSمانند دارد و کامپایلر آن را به CSS معمولی تبدیل میکند؛ فایل Sass فشردهٔ .sass از تورفتگی استفاده میکند.
$brand: #46eac2;.button { color: $brand; font-weight: 700;}متغیر Sass هنگام build جایگزین میشود؛ فلگ !default به مصرفکننده اجازه میدهد پیش از بارگذاری، مقدار اولیه را override کند.
$default-link-color: #46eac2 !default;a { color: $default-link-color;}تودرتویی را برای رابطههای واقعی و کمعمق نگه دارید؛ & selector والد را در حالتهایی مانند hover یا BEM جایگذاری میکند.
.button { color: $default-link-color; &:hover, &:focus-visible { text-decoration: underline; } &__icon { margin-inline-end: 0.5rem; }}ماژولهای مدرن Sass فضای نام ایجاد میکنند و از importهای تکراری و آلودگی scope جلوگیری میکنند؛ @import قدیمی منسوخ شده است.
// _tokens.scss$brand: #0f766e;// app.scss@use "tokens";.link { color: tokens.$brand; }کامنت // معمولاً در CSS خروجی باقی نمیماند؛ کامنت /* */ میتواند به خروجی CSS منتقل شود.
// توضیح فقط برای منبع Sass/* توضیحی که میتواند در CSS خروجی بماند */.card { border-radius: 0.75rem; }با @mixin گروهی از اعلانها را تعریف و با @include در یک یا چند selector وارد کنید.
@mixin focus-ring($color: #0f766e) { outline: 2px solid $color; outline-offset: 3px;}.button:focus-visible { @include focus-ring;}بلوک @content امکان تزریق اعلانها به mixin را میدهد؛ برای ورودیهای پیچیده، پارامترهای نامدار خواناترند.
@mixin media-min($width) { @media (min-width: $width) { @content; }}@include media-min(48rem) { .layout { display: grid; }}تابع Sass با @return یک مقدار تولید میکند و میتواند در هر property که آن نوع مقدار را میپذیرد استفاده شود.
@function spacing($step) { @return $step * 0.25rem;}.card { padding: spacing(4);}برای propertyهایی مانند font و text میتوان مقدارهای مرتبط را زیر نام مشترک قرار داد؛ خروجی هرکدام به اعلان CSS جدا تبدیل میشود.
.heading { font: { family: Arial, sans-serif; size: 1.5rem; weight: 700; }}با @use ماژول استاندارد را وارد کنید و تابع را با namespace فراخوانی کنید تا منبع آن مشخص بماند.
@use "sass:color";$brand: #0f766e;$brand-dark: color.adjust($brand, $lightness: -10%);$brand-soft: color.change($brand, $alpha: 0.2);.button { background: $brand-dark; }.badge { color: $brand-soft; }color.adjust تغییر ثابت و color.scale تغییر نسبی کانالها را بیان میکند؛ برای ساخت رنگ مکمل یا تغییر hue از توابع مربوط استفاده کنید.
@use "sass:color";$base: #639;$muted: color.scale($base, $saturation: -25%);$complement: color.adjust($base, $hue: 180deg);ماژول color برای خواندن کانالها و تنظیم alpha APIهای صریح دارد؛ در صورت نیاز به محاسبات رنگ، فضای رنگ را آگاهانه انتخاب کنید.
@use "sass:color";$accent: #168aad;$red-channel: color.channel($accent, "red");$transparent-accent: color.change($accent, $alpha: 0.35);interpolation مقدار Sass را در رشته یا selector وارد میکند؛ quote و unquote را فقط با آگاهی از نوع خروجی بهکار ببرید.
$name: "notice";$selector: ".#{$name}";#{$selector} { content: quote("ready");}عملیات ریاضی روی واحدهای سازگار قابلمحاسبه است؛ unit و unitless را برای بررسی نتیجه بهکار ببرید.
@use "sass:math";$rounded: math.ceil(3.2);$half: math.percentage(0.5);$pixels: 3px;$unit-name: math.unit($pixels);list.nth بر اساس اندیس یکمبنا مقدار را میدهد؛ طول و separator فهرست را با توابع ماژول sass:list بررسی کنید.
@use "sass:list";$sizes: 0.5rem, 1rem, 2rem;$first-size: list.nth($sizes, 1);@each $size in $sizes { .gap-#{$size} { gap: $size; }}mapها برای نگهداری tokenهای کلید-مقدار مفیدند؛ وجود کلید را پیش از دریافت مقدار بررسی کنید.
@use "sass:map";$colors: ( "primary": #0f766e, "surface": #f8fafc);$primary: map.get($colors, "primary");شرطها برای انتخاب مقدار یا تولید rule بهکار میروند؛ قواعد CSS وابسته به قابلیت مرورگر را با @supports بیان کنید.
$theme: "dark";@if $theme == "dark" { :root { color-scheme: dark; }} @else { :root { color-scheme: light; }}@supports (display: grid) { .layout { display: grid; }}through مقدار انتهایی را هم شامل میشود؛ to آن را کنار میگذارد. تعداد خروجیها را محدود و نامگذاری را پایدار نگه دارید.
@for $index from 1 through 4 { .order-#{$index} { order: $index; }}each برای ساخت خانوادهای از ruleها از دادهٔ تعریفشده استفاده میشود؛ نامهای CSS خروجی را خوانا و بدون برخورد انتخاب کنید.
$breakpoints: ( "tablet": 48rem, "desktop": 72rem);@each $name, $width in $breakpoints { @media (min-width: $width) { .show-#{$name} { display: block; } }}برای خطاهای زمان کامپایل پیام روشن بسازید؛ ورودیهای mixin و تابع را پیش از تولید خروجی بررسی کنید.
@mixin columns($count) { @if $count < 1 { @error "Column count must be positive."; } grid-template-columns: repeat($count, 1fr);}SCSS را با پسوند .scss بنویسید و پیش از انتشار به CSS کامپایل کنید.
توکنهای قابلتنظیم را در متغیرهای Sass یا custom propertyهای CSS نگه دارید.
برای کدهای قابلاستفادهٔ مجدد از mixin و برای محاسبهٔ مقدار از function استفاده کنید.
تودرتویی selectorها را کمعمق نگه دارید تا specificity ناخواسته رشد نکند.
برای Sass مدرن از @use و @forward استفاده کنید؛ @import منسوخ شده است.
تابعهای رنگ را از ماژول sass:color وارد کنید و APIهای جدید را بهکار ببرید.
با @each روی فهرست یا map حلقه بزنید و تعداد ruleهای خروجی را محدود کنید.
برای سازگاری CSS از @supports استفاده کنید، نه feature checkهای منسوخ Sass.
در پروژههای جدید بهجای @import از @use و @forward استفاده کنید تا وابستگیها و namespaceها روشن بمانند.
رنگها را با ماژول sass:color تنظیم کنید و تابعهای قدیمی مانند lighten() را به APIهای مدرن منتقل کنید.