معالج SASS/SCSS

أساسيات صيغة SCSS وأول ملف أنماط

20 دقيقة الدرس 3 من 30

أساسيات صيغة SCSS وأول ملف أنماط

الآن بعد أن تم تثبيت SASS وإعداد بيئتك، حان الوقت للغوص بعمق في صيغة SCSS! في هذا الدرس، سنستكشف قواعد الصيغة الأساسية لـ SCSS، ونفهم كيف ترتبط بـ CSS، ونكتب أول ملف أنماط شامل يوضح قوة SASS.

SCSS: مجموعة فائقة من CSS

أهم شيء يجب فهمه حول SCSS هو أنها مجموعة فائقة من CSS. هذا يعني:

  • كل ملف CSS صالح هو أيضاً ملف SCSS صالح
  • يمكنك نسخ ولصق CSS في ملف SCSS وسيعمل
  • يمكنك إضافة ميزات SASS تدريجياً دون إعادة كتابة كل شيء
  • منحنى التعلم ضئيل إذا كنت تعرف CSS بالفعل
نصيحة: لأن SCSS مجموعة فائقة من CSS، يمكنك البدء بكتابة CSS عادي في ملفات .scss وتقديم ميزات SASS تدريجياً أثناء التعلم. لا يوجد ضغط لاستخدام كل شيء مرة واحدة!

امتدادات الملفات: .scss مقابل .sass

تدعم SASS صيغتين مختلفتين بامتدادات ملفات مختلفة:

ملفات .scss (Sassy CSS)

  • تستخدم أقواساً {} وفواصل منقوطة ;
  • تبدو وتبدو مثل CSS مع ميزات إضافية
  • معيار الصناعة - يستخدم في 95%+ من المشاريع
  • أسهل في التعلم والدمج مع CSS الموجود

مثال على صيغة SCSS

$primary: #3498db;

.button {
  background: $primary;
  padding: 10px 20px;

  &:hover {
    background: darken($primary, 10%);
  }
}

ملفات .sass (الصيغة المسننة)

  • لا أقواس أو فواصل منقوطة - تستخدم المسافات البادئة (مثل Python)
  • أكثر إيجازاً لكن أقل ألفة
  • نادراً ما تستخدم في المشاريع الحديثة
  • لا يمكن مزجها مع CSS - تتطلب إعادة كتابة كاملة

مثال على صيغة SASS (مسننة)

$primary: #3498db

.button
  background: $primary
  padding: 10px 20px

  &:hover
    background: darken($primary, 10%)
ملاحظة: سنستخدم صيغة SCSS (ملفات .scss) حصرياً في هذه الدورة، لأنها معيار الصناعة. عندما يقول الناس "SASS"، فإنهم عادةً يعنون SCSS.

التعليقات في SCSS: سطر واحد ومتعدد الأسطر

تدعم SCSS نوعين من التعليقات، وتتصرف بشكل مختلف أثناء الترجمة:

تعليقات سطر واحد (//)

تستخدم تعليقات السطر الواحد شرطتين مائلتين ويتم إزالتها تماماً من ناتج CSS المترجم. إنها مثالية لملاحظات المطور التي لا ينبغي أن تظهر في الإنتاج.

تعليقات سطر واحد

// هذا تعليق سطر واحد
// لن يظهر في CSS المترجم

$primary: #3498db; // التعليق المضمن يعمل أيضاً

.button {
  // TODO: إضافة المزيد من أنماط الأزرار لاحقاً
  background: $primary;
}

تعليقات متعددة الأسطر (/* */)

تستخدم التعليقات متعددة الأسطر صيغة /* */ (تماماً مثل CSS) ويتم الحفاظ عليها في الناتج المترجم (ما لم يتم استخدام النمط المضغوط).

تعليقات متعددة الأسطر

/*
 * هذا تعليق متعدد الأسطر
 * سيظهر في CSS المترجم
 * استخدمه لإشعارات حقوق النشر، التوثيق، إلخ.
 */

.header {
  background: #333; /* هذا التعليق المضمن محفوظ أيضاً */
}

ناتج CSS المترجم

/*
 * هذا تعليق متعدد الأسطر
 * سيظهر في CSS المترجم
 * استخدمه لإشعارات حقوق النشر، التوثيق، إلخ.
 */
.header {
  background: #333; /* هذا التعليق المضمن محفوظ أيضاً */
}
نصيحة: استخدم تعليقات السطر الواحد (//) للملاحظات الداخلية والمهام. استخدم التعليقات متعددة الأسطر (/* */) فقط لإشعارات حقوق النشر أو التوثيق الأساسي الذي يجب أن يبقى في CSS النهائي.

كتابة أول ملف SCSS

دعنا نكتب ملف SCSS شامل يوضح الميزات الأساسية. أنشئ ملفاً باسم styles.scss:

styles.scss - مثال كامل

// ===========================================
// المتغيرات
// ===========================================

// الألوان
$primary-color: #3498db;
$secondary-color: #2ecc71;
$danger-color: #e74c3c;
$text-color: #333;
$light-gray: #ecf0f1;

// الطباعة
$font-family: 'Helvetica Neue', Arial, sans-serif;
$base-font-size: 16px;
$heading-font-size: 32px;

// المسافات
$base-padding: 16px;
$base-margin: 16px;

// ===========================================
// الأنماط الأساسية
// ===========================================

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: $font-family;
  font-size: $base-font-size;
  color: $text-color;
  line-height: 1.6;
  padding: $base-padding;
  background-color: $light-gray;
}

// ===========================================
// الطباعة
// ===========================================

h1 {
  font-size: $heading-font-size;
  color: $primary-color;
  margin-bottom: $base-margin;

  // محدد متداخل للتأكيد
  span {
    color: $secondary-color;
    font-weight: normal;
  }
}

p {
  margin-bottom: $base-margin;
  line-height: 1.8;
}

// ===========================================
// المكونات
// ===========================================

.container {
  max-width: 1200px;
  margin: 0 auto;
  padding: $base-padding * 2;
  background: white;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.button {
  display: inline-block;
  padding: $base-padding / 2 $base-padding;
  background: $primary-color;
  color: white;
  text-decoration: none;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: $base-font-size;
  transition: all 0.3s ease;

  // فئة زائفة متداخلة
  &:hover {
    background: darken($primary-color, 10%);
    transform: translateY(-2px);
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
  }

  // فئة زائفة متداخلة
  &:active {
    transform: translateY(0);
  }

  // فئة معدلة متداخلة
  &.secondary {
    background: $secondary-color;

    &:hover {
      background: darken($secondary-color, 10%);
    }
  }

  // فئة معدلة متداخلة
  &.danger {
    background: $danger-color;

    &:hover {
      background: darken($danger-color, 10%);
    }
  }
}

.card {
  background: white;
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: $base-padding;
  margin-bottom: $base-margin;

  .card-header {
    font-size: 20px;
    font-weight: bold;
    margin-bottom: $base-margin / 2;
    color: $primary-color;
  }

  .card-body {
    font-size: 14px;
    color: #666;
  }

  .card-footer {
    margin-top: $base-margin;
    padding-top: $base-padding / 2;
    border-top: 1px solid #eee;
    font-size: 12px;
    color: #999;
  }
}

الترجمة ومشاهدة الناتج

الآن دعنا نترجم ملف SCSS هذا ونرى ما هي CSS المُنشأة. قم بتشغيل أمر الترجمة:

أمر الترجمة

sass styles.scss styles.css

إليك جزء من ناتج CSS المُنشأ:

CSS المُنشأ (مقتطف)

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: "Helvetica Neue", Arial, sans-serif;
  font-size: 16px;
  color: #333;
  line-height: 1.6;
  padding: 16px;
  background-color: #ecf0f1;
}

h1 {
  font-size: 32px;
  color: #3498db;
  margin-bottom: 16px;
}
h1 span {
  color: #2ecc71;
  font-weight: normal;
}

.button {
  display: inline-block;
  padding: 8px 16px;
  background: #3498db;
  color: white;
  text-decoration: none;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;
  transition: all 0.3s ease;
}
.button:hover {
  background: #217dbb;
  transform: translateY(-2px);
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
.button:active {
  transform: translateY(0);
}
.button.secondary {
  background: #2ecc71;
}
.button.secondary:hover {
  background: #25a25a;
}
.button.danger {
  background: #e74c3c;
}
.button.danger:hover {
  background: #d62c1a;
}
ملاحظة: لاحظ كيف تم استبدال جميع المتغيرات بقيمها الفعلية، تم تسطيح جميع التداخلات إلى محددات CSS صحيحة، وتم استبدال رمز & بالمحدد الأصل. هذا هو سحر ترجمة SASS!

فهم كيفية تعيين التداخل إلى CSS

واحدة من أقوى ميزات SCSS هي التداخل. دعنا نفهم بالضبط كيف تترجم SCSS المتداخلة إلى CSS:

التداخل الأساسي

إدخال SCSS

.card {
  padding: 20px;

  .card-title {
    font-size: 24px;
  }
}

ناتج CSS

.card {
  padding: 20px;
}

.card .card-title {
  font-size: 24px;
}

يصبح .card-title المتداخل .card .card-title (محدد تابع).

محدد الأصل (&)

الأمبرساند & هو حرف خاص يشير إلى المحدد الأصل. إنه مفيد بشكل لا يصدق للفئات الزائفة والعناصر الزائفة والمعدلات:

SCSS مع رمز &

.button {
  background: blue;

  &:hover {
    background: darkblue;
  }

  &:focus {
    outline: 2px solid blue;
  }

  &.active {
    background: navy;
  }

  &::before {
    content: "→";
  }
}

ناتج CSS

.button {
  background: blue;
}
.button:hover {
  background: darkblue;
}
.button:focus {
  outline: 2px solid blue;
}
.button.active {
  background: navy;
}
.button::before {
  content: "→";
}
نصيحة: يتم استبدال رمز & بالمحدد الأصل الدقيق أثناء الترجمة. إنه ليس للفئات فقط - يعمل مع أي محدد!

مستويات متعددة من التداخل

SCSS متداخل عميق

.navigation {
  background: #333;

  ul {
    list-style: none;

    li {
      display: inline-block;

      a {
        color: white;
        padding: 10px;

        &:hover {
          color: #3498db;
        }
      }
    }
  }
}

ناتج CSS

.navigation {
  background: #333;
}
.navigation ul {
  list-style: none;
}
.navigation ul li {
  display: inline-block;
}
.navigation ul li a {
  color: white;
  padding: 10px;
}
.navigation ul li a:hover {
  color: #3498db;
}
تحذير: بينما التداخل العميق ممكن، تجنب الذهاب لأكثر من 3-4 مستويات عمقاً. التداخل المفرط ينشئ محددات محددة للغاية يصعب تجاوزها ويمكن أن تؤثر على الأداء.

استخدام المتغيرات الأساسية مع $

المتغيرات في SCSS تبدأ بعلامة الدولار $. تتيح لك تخزين القيم وإعادة استخدامها في جميع أنحاء ملف الأنماط الخاص بك:

تصريح واستخدام المتغيرات

// تصريحات المتغيرات
$primary-color: #3498db;
$font-size-base: 16px;
$spacing-unit: 8px;

// استخدام المتغيرات
body {
  color: $primary-color;
  font-size: $font-size-base;
  padding: $spacing-unit * 2; // المتغيرات تدعم الرياضيات!
}

.header {
  background: $primary-color;
  margin-bottom: $spacing-unit * 3;
}

.button {
  padding: $spacing-unit $spacing-unit * 2;
  font-size: $font-size-base;
}

CSS المترجمة

body {
  color: #3498db;
  font-size: 16px;
  padding: 16px;
}

.header {
  background: #3498db;
  margin-bottom: 24px;
}

.button {
  padding: 8px 16px;
  font-size: 16px;
}

لاحظ كيف يتم استبدال المتغيرات بقيمها الفعلية، ويتم حساب العمليات الرياضية أثناء الترجمة.

نصيحة: يجب أن تكون أسماء المتغيرات وصفية وتتبع اصطلاح kebab-case: $primary-color، وليس $primaryColor أو $primary_color.

إنشاء ملف HTML لاختبار أنماطك

لرؤية CSS المترجمة في العمل، أنشئ ملف HTML بسيط يرتبط بـ CSS المُنشأ:

index.html

<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>مشروع SCSS الأول</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div class="container">
    <h1>مرحباً بك في <span>SCSS</span></h1>

    <p>هذه الصفحة منسقة بـ CSS مترجمة من SCSS!</p>

    <div class="card">
      <div class="card-header">عنوان البطاقة</div>
      <div class="card-body">
        هذا مكون بطاقة منسق بمحددات SCSS متداخلة.
      </div>
      <div class="card-footer">معلومات تذييل البطاقة</div>
    </div>

    <button class="button">زر أساسي</button>
    <button class="button secondary">زر ثانوي</button>
    <button class="button danger">زر خطر</button>
  </div>
</body>
</html>

افتح ملف HTML هذا في متصفحك، وسترى أنماط SCSS المترجمة في العمل!

مراقبة الملفات أثناء التطوير

بدلاً من الترجمة يدوياً بعد كل تغيير، استخدم وضع المراقبة للترجمة التلقائية:

بدء وضع المراقبة

sass --watch styles.scss:styles.css

الآن في كل مرة تحفظ فيها styles.scss، سيتم تحديث ملف CSS تلقائياً. احتفظ بمتصفحك مفتوحاً وقم بالتحديث لرؤية التغييرات على الفور!

نصيحة: اجمع بين وضع مراقبة SASS وإضافة إعادة تحميل المتصفح المباشر (مثل Live Server في VS Code) للحصول على تجربة التطوير المثلى - احفظ SCSS وشاهد التغييرات على الفور في المتصفح دون تحديث يدوي!

الأخطاء الشائعة للمبتدئين لتجنبها

1. نسيان الفواصل المنقوطة

على عكس صيغة .sass المسننة، تتطلب SCSS فواصل منقوطة:

خطأ (سيسبب خطأ)

.button {
  background: blue  // فاصلة منقوطة مفقودة
  color: white
}

صحيح

.button {
  background: blue;
  color: white;
}

2. سوء استخدام رمز &

يجب استخدام & بعناية - إنه يشير إلى المحدد الأصل بأكمله:

استخدام خاطئ

.card {
  & .header {  // ينشئ ".card .header"
    font-size: 20px;
  }
}

// أفضل بدون &:
.card {
  .header {  // ينشئ أيضاً ".card .header"
    font-size: 20px;
  }
}

استخدام صحيح

.button {
  &:hover {     // ينشئ ".button:hover"
  }

  &.active {    // ينشئ ".button.active"
  }

  &-primary {   // ينشئ ".button-primary" (نمط BEM)
  }
}

3. التداخل المفرط

فقط لأنك تستطيع التداخل لا يعني أنه يجب عليك تداخل كل شيء 10 مستويات عمقاً:

متداخل بشكل مفرط (سيء)

.page {
  .container {
    .content {
      .article {
        .heading {
          .title {
            color: blue;
          }
        }
      }
    }
  }
}

// يترجم إلى:
// .page .container .content .article .heading .title { color: blue; }
// محدد جداً جداً!

نهج أفضل

.article {
  .article-title {
    color: blue;
  }
}

// يترجم إلى: .article .article-title { color: blue; }
// أكثر قابلية للصيانة بكثير!

الخلاصة

أنت الآن تفهم الصيغة الأساسية لـ SCSS! لقد تعلمت أن SCSS مجموعة فائقة من CSS، وكيفية استخدام التعليقات، وكيف يعمل التداخل، وكيفية تصريح واستخدام المتغيرات، وكيفية رؤية ناتج CSS المترجم. هذه الأساسيات هي الأساس لجميع الميزات القوية التي سنستكشفها في الدروس القادمة.

في الدرس التالي، سنغوص بعمق في المتغيرات - أنواع البيانات والنطاق واصطلاحات التسمية وتقنيات المتغيرات المتقدمة.

تمرين 1: تحويل CSS إلى SCSS

خذ CSS التالي وحوله إلى SCSS باستخدام التداخل:

.navigation { background: #333; }
.navigation .nav-list { list-style: none; }
.navigation .nav-list .nav-item { display: inline-block; }
.navigation .nav-list .nav-item .nav-link { color: white; }
.navigation .nav-list .nav-item .nav-link:hover { color: #3498db; }

أنشئ ملف SCSS، قم بترجمته، وتحقق من أن الناتج يطابق CSS الأصلي.

تمرين 2: إنشاء مكون منسق

أنشئ ملف SCSS ينسق مكون "بطاقة تسعير":

  1. حدد متغيرات للألوان والمسافات ونصف قطر الحدود
  2. أنشئ فئة .pricing-card مع عناصر متداخلة: .card-header و .card-price و .card-features و .card-button
  3. استخدم محدد & لإضافة تأثير :hover للزر
  4. أنشئ HTML لعرض بطاقتك المنسقة
  5. قم بالترجمة والعرض في المتصفح

تمرين 3: التجربة مع التعليقات

أنشئ ملف SCSS بكلا نوعي التعليقات:

  1. أضف تعليقات سطر واحد (//) تشرح كودك
  2. أضف تعليق متعدد الأسطر (/* */) في الأعلى مع إشعار حقوق النشر
  3. قم بالترجمة إلى CSS وافتح ملف الناتج
  4. لاحظ أي التعليقات تظهر في CSS وأيها لا
  5. حاول الترجمة باستخدام --style=compressed وانظر كيف تؤثر على التعليقات