CSS الحديث: التخطيط، المتغيرات، واستعلامات الحاوية (Container Queries)
تعلم CSS الحديثة من الصفر: Flexbox، وGrid، والخصائص المخصصة (custom properties)، واستعلامات الحاوية (container queries)، و :has()، وطبقات التتالي (cascade layers)، والتداخل (nesting)، وانتقالات العرض (view transitions).
جدول المحتويات
أعيد إنشاؤه: ٢٧ مارس ٢٠٢٦ · آخر تحقق: ٣ نوفمبر ٢٠٢٦.
ملخص
تتمحور لغة CSS الحديثة (٢٠٢٦) حول استعلامات الحاوية (Container Queries)، والمحدد :has()، وطبقات التتالي (Cascade Layers)، والتداخل الأصلي (native nesting). ولا يزال Grid و Flexbox هما أساسيات التخطيط. وتدير الخصائص المخصصة في CSS رموز التصميم (design tokens). يضيف Tailwind CSS 4 التداخل الأصلي وتحسينات في الأداء، ولكن يمكن لـ CSS الخام الآن القيام بالكثير مما يفعله Tailwind.
إذا كانت آخر تعمقة لك في CSS منذ بضع سنوات، فاستعد للمفاجآت. لقد تطورت CSS بشكل كبير. اللغة التي كانت تبدو ذات يوم محدودة—"مجرد تنسيق"—تتعامل الآن مع تعقيدات التخطيط، والمنطق (:has())، ورموز التصميم، والتكيف الاستجابي الذي كان يتطلب سابقاً JavaScript أو أدوات بناء.
يغطي هذا الدليل أساسيات CSS الحديثة لعام ٢٠٢٦: أدوات التخطيط الأساسية التي احتجتها دائماً (Grid, Flexbox)، والميزات الثورية (Container Queries)، وتحسينات الصيغة (native nesting) التي تجعل كتابة CSS أكثر متعة. سواء كنت تبدأ من الصفر أو تحاول مواكبة التطورات، فإن فهم هذه الأساسيات يفتح لك الباب للباقي.
CSS Grid و Flexbox: أساس التخطيط
إن Grid و Flexbox ليسا ميزات متقدمة—بل هما أساسيان. كل تخطيط حديث يستخدم أحدهما أو كليهما.
Flexbox: تخطيط أحادي البعد
يقوم Flexbox بترتيب العناصر في اتجاه واحد (صف أو عمود).
/* Navigation bar: items in a row */
.nav {
display: flex;
gap: 1rem;
justify-content: space-between; /* Space between nav items and logo */
align-items: center; /* Vertically centered */
}
/* Form: items in a column */
.form {
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Responsive: row on desktop, column on mobile */
@media (max-width: 768px) {
.nav {
flex-direction: column;
}
}
الخصائص الرئيسية:
flex-direction: row | columnjustify-content: يتحكم في التباعد على طول المحور الرئيسي (اتجاه الصف/العمود)align-items: يتحكم في المحاذاة العمودية على المحور الرئيسيflex-wrap: التفاف العناصر إلى عدة أسطرgap: المسافة بين العناصر
CSS Grid: تخطيط ثنائي البعد
يقوم Grid بترتيب العناصر في صفوف و أعمدة في آن واحد.
/* Dashboard layout */
.dashboard {
display: grid;
grid-template-columns: 250px 1fr 300px; /* Sidebar, main, aside */
grid-template-rows: auto 1fr auto; /* Header, content, footer */
gap: 1rem;
height: 100vh;
}
.header {
grid-column: 1 / -1; /* Span all columns */
}
.sidebar {
grid-column: 1;
grid-row: 2;
}
.main {
grid-column: 2;
grid-row: 2;
}
.footer {
grid-column: 1 / -1;
}
الفرق: متى تستخدم كل منهما
| التخطيط | Flexbox | Grid |
|---|---|---|
| شريط التنقل (Navigation bar) | ✓ | |
| قائمة منتجات (عمود واحد) | ✓ | |
| مدخلات النماذج (Form inputs) | ✓ | |
| لوحة تحكم (ثنائية الأبعاد) | ✓ | |
| شبكة بطاقات مع subgrid | ✓ | |
| شريط جانبي + محتوى رئيسي | ✓ |
معظم التخطيطات المعقدة تستخدم كليهما:
.dashboard {
display: grid;
grid-template-columns: 250px 1fr;
}
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
}
.card {
display: flex;
flex-direction: column;
}
يتولى Grid هيكل الصفحة، بينما يتولى Flexbox تخطيطات المكونات الفردية.
الخصائص المخصصة في CSS (المتغيرات)
تخزن الخصائص المخصصة قيماً قابلة لإعادة الاستخدام. وهي ديناميكية (يمكن تغييرها أثناء التشغيل) على عكس متغيرات SASS/LESS.
الاستخدام الأساسي
:root {
--color-primary: #0066ff;
--color-text: #333;
--spacing-base: 1rem;
--radius: 0.5rem;
}
button {
background: var(--color-primary);
padding: var(--spacing-base);
border-radius: var(--radius);
color: white;
}
التنسيق الديناميكي (Dynamic Theming)
/* Light theme (default) */
:root {
--bg: #ffffff;
--text: #000000;
}
/* Dark theme */
@media (prefers-color-scheme: dark) {
:root {
--bg: #1a1a1a;
--text: #ffffff;
}
}
/* User-selected dark mode */
body.dark-mode {
--bg: #1a1a1a;
--text: #ffffff;
}
body {
background: var(--bg);
color: var(--text);
}
المتغيرات المحددة النطاق (Scoped Variables)
.card {
--card-bg: #f5f5f5;
--card-padding: 1.5rem;
}
.card-header {
background: var(--card-bg);
padding: var(--card-padding);
}
/* Different card style */
.card.featured {
--card-bg: #ffd700;
--card-padding: 2rem;
/* Header automatically uses new values */
}
استعلامات الحاوية: المكونات تتكيف مع السياق
سابقاً، كانت توجد استعلامات الوسائط (media queries) فقط—وهي تقيس نافذة العرض (viewport). أما استعلامات الحاوية (Container Queries) فتقيس حاوية المكون نفسه. وصلت استعلامات حجم الحاوية إلى حالة "Baseline Newly Available" في فبراير ٢٠٢٣ وحالة "Baseline Widely Available" في أغسطس ٢٠٢٥، لذا فهي آمنة للاستخدام في بيئات الإنتاج اليوم.
/* Define a container context */
.card-container {
container-type: inline-size;
}
/* Query the container's width */
@container (min-width: 400px) {
.card-content {
display: grid;
grid-template-columns: 1fr 1fr;
}
}
@container (max-width: 300px) {
.card-content {
display: block;
}
}
المكون الموجود داخل شريط جانبي بعرض ٢٥٠ بكسل يظهر كعمود واحد. نفس المكون في منطقة رئيسية بعرض ٨٠٠ بكسل يظهر كعمودين. نفس الكود، ولكن بسياقات مختلفة.
هذا أمر ثوري لأن المكونات أصبحت الآن قابلة لإعادة الاستخدام حقاً وواعية بالسياق.
المحدد :has()
يقوم :has() باختيار العناصر بناءً على أبنائها أو العناصر المجاورة لها. إنه "اختيار العنصر الأب"—وهو أمر لم يكن CSS قادراً على فعله من قبل. وصل :has() إلى حالة Baseline Newly Available في ديسمبر ٢٠٢٣ (كان Firefox 121 هو الأخير في الدعم) وهو متاح على نطاق واسع في المتصفحات الحديثة.
/* Select card if it contains an image */
.card:has(img) {
display: grid;
grid-template-columns: 200px 1fr;
}
/* Select form if it has an error */
.form:has(.error) {
border: 2px solid red;
}
/* Select heading followed by text */
h2:has(+ p) {
margin-bottom: 0.5rem;
}
/* Style based on input state */
form:has(input:invalid) {
background: #ffe0e0;
}
/* Dark mode: if user prefers dark, select background */
@media (prefers-color-scheme: dark) {
body:has(.dark-mode-toggle:checked) {
--bg: #1a1a1a;
}
}
يتيح :has() سلوكاً متجاوباً باستخدام CSS فقط دون الحاجة إلى media queries.
طبقات التتالي (Cascade Layers) وتداخل CSS (CSS Nesting)
طبقات التتالي (Cascade Layers)
التحكم في تعارضات التخصيص (specificity) باستخدام الطبقات:
/* Define layer order */
@layer reset, base, theme, components, utilities;
@layer reset {
* { margin: 0; padding: 0; }
}
@layer base {
body { font-family: system-ui; }
}
@layer theme {
:root {
--color-primary: blue;
}
}
@layer components {
.button { background: var(--color-primary); }
}
@layer utilities {
.text-center { text-align: center; }
}
/* Utilities override components override theme—determined by layer order */
تمنع الطبقات حروب التخصيص. فالفئة المساعدة (utility class) في طبقة utilities تتجاوز دائماً المكون الموجود في طبقة components، بغض النظر عن درجة التخصيص.
تداخل CSS الأصلي (Native CSS Nesting)
وصل التداخل الأصلي إلى حالة Baseline Newly Available في ديسمبر ٢٠٢٣ (Chrome 120، Safari 17.2، Firefox 117 — حيث أطلق Chrome 112 و Safari 16.5 صيغة تداخل مبكرة وغير نهائية قبل شهور من استقرار المواصفات). لا مزيد من تكرار المحددات:
/* Before: repetition */
.card { border: 1px solid #ccc; }
.card-header { background: #f5f5f5; }
.card-body { padding: 1rem; }
/* After: native nesting */
.card {
border: 1px solid #ccc;
& .header {
background: #f5f5f5;
}
& .body {
padding: 1rem;
}
/* Hover state */
&:hover {
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
/* Media query inside */
@media (max-width: 600px) {
flex-direction: column;
}
}
يشير المحدد & إلى العنصر الأب. هذه الصيغة أصبحت الآن جزءاً من CSS الأصلي (لا حاجة لـ Sass).
واجهة انتقالات العرض (View Transitions) API
وصلت انتقالات العرض في نفس المستند (Same-document View Transitions) إلى حالة Baseline Newly Available في أكتوبر ٢٠٢٥ بمجرد إطلاق Firefox 144 للدعم، لتنضم إلى Chrome 111+ و Safari 18+. أما الانتقالات عبر المستندات (التطبيقات متعددة الصفحات) فهي تعمل في Chrome 126+ و Safari 18.2+ ولكنها غير مدعومة بعد في Firefox حتى مايو ٢٠٢٦ — استخدم التحسين التدريجي (progressive enhancement).
تحريك الانتقال بين حالات الصفحة:
.modal {
view-transition-name: modal;
}
@supports (view-transition-name: modal) {
::view-transition-new(modal) {
animation: slideUp 0.5s;
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(50px);
}
}
}
عندما تنتقل إلى حالة نافذة منبثقة (modal) جديدة، يقوم المتصفح تلقائياً بتحريك الانتقال بين الحالتين القديمة والجديدة.
document.startViewTransition(() => {
updateDOM(); // Change the DOM
// Browser automatically animates the transition
});
يؤدي هذا إلى إنشاء انتقالات سلسة دون الحاجة إلى منطق تحريك JavaScript يدوي.
Tailwind CSS 4 مقابل Vanilla CSS
تم إطلاق Tailwind CSS v4.0 في ٢٢ يناير ٢٠٢٥؛ وتستمر سلسلة v4.x في التطور (أضاف v4.2 إضافة webpack وأدوات الخصائص المنطقية logical-property في فبراير ٢٠٢٦). توفر بنية v4 ما يلي:
- تداخل CSS أصلي في ملفات المصدر
- خصائص CSS مخصصة لتخصيص السمة (لا تتطلب إعدادات JS)
- محرك Oxide جديد — عمليات بناء كاملة أسرع بما يصل إلى ٥ مرات، وعمليات بناء تزايدية أسرع بأكثر من ١٠٠ مرة (تصل سرعتها إلى ~١٩٢ ميكروثانية)
- إعداد من سطر واحد (
@import "tailwindcss") مع اكتشاف تلقائي للقوالب
متى تستخدم Tailwind:
- النماذج الأولية السريعة (أدوات متجاوبة جاهزة)
- توحيد المعايير للفريق (مسافات وألوان متسقة)
- الاحتياجات المتجاوبة المعقدة (مع دعم Container Queries)
متى يكون Vanilla CSS كافياً:
- المواقع البسيطة والثابتة
- أنظمة التصميم التي نادراً ما تتغير
- عندما تبدو أدوات البناء مبالغاً فيها
- الفرق المتمكنة من CSS
مثال: نفس المكون في Tailwind مقابل vanilla:
Tailwind:
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 p-4">
<div className="border rounded-lg p-4 hover:shadow-lg">
<h3 className="text-lg font-bold mb-2">Title</h3>
<p>Content</p>
</div>
</div>
Vanilla CSS مع الميزات الحديثة:
<div className="card-grid">
<article className="card">
<h3>Title</h3>
<p>Content</p>
</article>
</div>
<style>
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
padding: 1rem;
}
.card {
border: 1px solid #ccc;
border-radius: 0.5rem;
padding: 1rem;
&:hover {
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
}
</style>
كلاهما صحيح. اختر بناءً على احتياجات المشروع، وليس بناءً على الضجة المثارة.
@starting-style للانتقالات
وصل @starting-style إلى حالة Baseline Newly Available في أغسطس ٢٠٢٤. وهو يحدد القيم التي ينتقل العنصر منها عند تصييره لأول مرة (أو عند عودته إلى DOM):
.toast {
opacity: 1;
transform: translateX(0);
transition: opacity 0.3s, transform 0.3s;
}
/* The "from" state — applied only on first render */
@starting-style {
.toast {
opacity: 0;
transform: translateX(-100%);
}
}
عندما يتم إضافة .toast إلى DOM، يطبق المتصفح قيم @starting-style أولاً، ثم ينتقل إلى قيم .toast العادية. وهذا يجعل من الممكن أخيراً تحريك العناصر التي تظهر من display: none دون استخدام حيل JavaScript.
النقاط الرئيسية
يتعامل CSS الحديث (٢٠٢٦) مع ما كان يتطلب سابقاً JavaScript أو أدوات بناء:
- Grid و Flexbox: أتقنهما لأي تخطيط
- الخصائص المخصصة (Custom properties): رموز تصميم ديناميكية ومحددة النطاق
- Container Queries: أنماط مكونات تدرك السياق المحيط بها
- محدد
:has(): منطق يعتمد على CSS فقط بناءً على العناصر الأبناء
لم تعد CSS مجرد تنسيق، بل أصبحت لغة قوية للتخطيط والمنطق والتفاعل. كلما تعلمت المزيد عن CSS الحديثة، قل احتياجك لـ JavaScript في العرض التقديمي.
قراءات ذات صلة
نشرة مجانية
ابقَ على مسار النيرد
رسالة واحدة كلّ أسبوع: عدد الخميس يضمّ شرحًا لمنظومة واحدة، وثلاث إشارات، وتمرينًا واحدًا، ووظيفة واحدة، وخلاصة بالعربية.