Display وأنماط العرض في CSS: دليل شامل للتحكم في سلوك العناصر
دليل تخصصي من علاء عامر – مطور ومصمم مواقع وتطبيقات محترف
فهم خصائص Display أساسي لإتقان تخطيط الصفحات. تعلم كيفية التحكم في سلوك العناصر وإنشاء تصاميم مرنة ومتطورة.
1️⃣ مفهوم Display الأساسي
أنماط العرض الرئيسية
القيمة | السلوك | الاستخدام |
---|---|---|
block | يأخذ كامل العرض | العناوين، الفقرات |
inline | يتدفق مع النص | الروابط، التأكيد |
inline-block | هجين بين الاثنين | الأزرار، البطاقات الصغيرة |
flex | حاوي مرن | التخطيط المرن |
grid | شبكة ثنائية الأبعاد | التخطيطات المعقدة |
none | مخفي تماماً | إخفاء العناصر |
/* أمثلة أساسية على أنماط العرض */
.display-examples {
/* عنصر كتلة - يأخذ كامل العرض */
display: block;
width: 100%;
height: 50px;
background: #007bff;
margin-bottom: 10px;
}
.display-inline {
/* عنصر سطري - يتدفق مع النص */
display: inline;
background: #28a745;
padding: 5px 10px;
/* ملاحظة: width وheight لا يعملان مع inline */
}
.display-inline-block {
/* هجين - يتدفق لكن يقبل الأبعاد */
display: inline-block;
width: 150px;
height: 50px;
background: #dc3545;
margin: 5px;
text-align: center;
line-height: 50px;
}
.display-none {
/* مخفي تماماً - لا يأخذ مساحة */
display: none;
}
.visibility-hidden {
/* مخفي لكن يأخذ مساحة */
visibility: hidden;
}
2️⃣ العناصر الكتلية (Block Elements)
خصائص العناصر الكتلية
/* سلوك العناصر الكتلية الافتراضي */
.block-elements {
/* عناصر كتلية افتراضية */
/* div, p, h1-h6, section, article, header, footer, main, nav */
}
/* تحويل عنصر إلى كتلة */
.make-block {
display: block;
/* خصائص العناصر الكتلية */
width: 100%; /* يأخذ كامل العرض المتاح */
margin: 10px 0; /* يمكن تطبيق جميع أنواع الهوامش */
padding: 20px; /* يمكن تطبيق جميع أنواع الحشو */
border: 2px solid #333; /* يمكن تطبيق الحدود */
/* يبدأ في سطر جديد */
/* العنصر التالي يبدأ في سطر جديد أيضاً */
}
/* أمثلة عملية للعناصر الكتلية */
.card-block {
display: block;
width: 300px;
padding: 20px;
margin: 20px auto;
background: white;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.header-block {
display: block;
width: 100%;
padding: 15px 20px;
background: #007bff;
color: white;
text-align: center;
font-weight: bold;
}
.content-block {
display: block;
max-width: 800px;
margin: 0 auto;
padding: 40px 20px;
line-height: 1.6;
}
تخصيص العناصر الكتلية
/* تخصيص عرض العناصر الكتلية */
.custom-widths {
display: block;
/* عروض مختلفة */
width: 50%; /* نصف العرض */
width: 300px; /* عرض ثابت */
width: auto; /* عرض تلقائي */
width: fit-content; /* عرض المحتوى */
width: min-content; /* أصغر عرض ممكن */
width: max-content; /* أكبر عرض للمحتوى */
}
/* توسيط العناصر الكتلية */
.centered-blocks {
display: block;
width: 60%;
margin: 0 auto; /* توسيط أفقي */
/* أو باستخدام flex للحاوي الأب */
}
.center-container {
display: flex;
justify-content: center;
}
.center-container .centered-child {
display: block;
width: 300px;
}
3️⃣ العناصر السطرية (Inline Elements)
خصائص العناصر السطرية
/* العناصر السطرية الافتراضية */
/* span, a, strong, em, img, input, button */
.inline-elements {
display: inline;
/* خصائص العناصر السطرية */
/* width وheight لا يعملان */
/* width: 200px; ← لن يعمل */
/* height: 50px; ← لن يعمل */
/* الهوامش العمودية لا تعمل بشكل طبيعي */
margin: 0 10px; /* أفقي يعمل، عمودي لا يعمل */
/* الحشو يعمل لكن قد يتداخل */
padding: 5px 10px; /* يعمل لكن بحذر */
/* الحدود تعمل */
border: 1px solid #333;
background: #f8f9fa;
color: #333;
}
/* أمثلة عملية للعناصر السطرية */
.inline-link {
display: inline;
color: #007bff;
text-decoration: none;
padding: 2px 4px;
border-radius: 3px;
transition: background-color 0.3s ease;
}
.inline-link:hover {
background-color: rgba(0, 123, 255, 0.1);
}
.inline-badge {
display: inline;
background: #28a745;
color: white;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.75rem;
font-weight: 600;
}
.inline-code {
display: inline;
background: #f8f9fa;
color: #e83e8c;
padding: 2px 6px;
border-radius: 4px;
font-family: "Courier New", monospace;
font-size: 0.9em;
border: 1px solid #e9ecef;
}
تنسيق النص السطري
/* تنسيق متقدم للعناصر السطرية */
.advanced-inline {
display: inline;
/* تباعد الأحرف والكلمات */
letter-spacing: 1px;
word-spacing: 2px;
/* تحويل النص */
text-transform: uppercase;
/* ظل النص */
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
/* تدرج الخلفية */
background: linear-gradient(135deg, #ff6b6b, #4ecdc4);
color: white;
padding: 4px 8px;
border-radius: 4px;
}
/* عناصر سطرية مع أيقونات */
.icon-text {
display: inline;
vertical-align: middle;
}
.icon-text::before {
content: "📧";
margin-left: 5px;
}
/* تأثيرات تفاعلية للعناصر السطرية */
.interactive-inline {
display: inline;
position: relative;
padding: 2px 0;
color: #007bff;
text-decoration: none;
transition: color 0.3s ease;
}
.interactive-inline::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background: #007bff;
transition: width 0.3s ease;
}
.interactive-inline:hover::after {
width: 100%;
}
4️⃣ Inline-Block: الأفضل من العالمين
مفهوم Inline-Block
/* Inline-block يجمع مزايا النوعين */
.inline-block-demo {
display: inline-block;
/* يقبل الأبعاد مثل block */
width: 200px;
height: 100px;
/* يتدفق أفقياً مثل inline */
margin: 10px;
/* يقبل كامل التنسيق */
padding: 20px;
border: 2px solid #007bff;
border-radius: 8px;
background: #f8f9fa;
text-align: center;
vertical-align: top; /* تحكم في المحاذاة العمودية */
}
/* استخدامات عملية لـ inline-block */
/* شبكة بطاقات بسيطة */
.card-grid {
text-align: center; /* لتوسيط البطاقات */
}
.card-item {
display: inline-block;
width: 250px;
margin: 15px;
padding: 20px;
background: white;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
text-align: right; /* إعادة تعيين النص */
vertical-align: top; /* محاذاة من الأعلى */
transition: transform 0.3s ease;
}
.card-item:hover {
transform: translateY(-5px);
}
/* أزرار متجاورة */
.button-group {
text-align: center;
}
.btn-inline-block {
display: inline-block;
padding: 12px 24px;
margin: 0 5px;
background: #007bff;
color: white;
text-decoration: none;
border-radius: 6px;
border: none;
cursor: pointer;
transition: all 0.3s ease;
}
.btn-inline-block:hover {
background: #0056b3;
transform: translateY(-2px);
}
/* قائمة تنقل أفقية */
.nav-horizontal {
background: #f8f9fa;
padding: 15px;
text-align: center;
border-radius: 8px;
}
.nav-item-inline {
display: inline-block;
margin: 0 10px;
}
.nav-link-inline {
display: inline-block;
padding: 10px 15px;
color: #333;
text-decoration: none;
border-radius: 6px;
transition: all 0.3s ease;
}
.nav-link-inline:hover {
background: #007bff;
color: white;
}
حل مشكلة المسافات البيضاء
/* مشكلة المسافات البيضاء مع inline-block */
.spacing-problem {
/* HTML يضع مسافات بين العناصر inline-block */
}
/* الحلول المختلفة */
/* الحل الأول: إزالة المسافات من HTML */
/* <div class="item">1</div><div class="item">2</div> */
/* الحل الثاني: font-size على الحاوي */
.container-fix {
font-size: 0; /* إزالة المسافات */
}
.container-fix .item {
display: inline-block;
font-size: 16px; /* إعادة تعيين الخط */
}
/* الحل الثالث: استخدام flexbox (الأفضل) */
.flex-solution {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.flex-solution .item {
/* لا حاجة لـ inline-block */
flex: 0 1 auto;
}
/* الحل الرابع: float (قديم) */
.float-solution .item {
float: right;
margin-left: 10px;
}
.float-solution::after {
content: "";
display: table;
clear: both;
}
5️⃣ مقدمة سريعة لـ Flex و Grid
Flexbox الأساسي
/* Flexbox للتخطيط المرن */
.flex-container {
display: flex;
/* اتجاه العناصر */
flex-direction: row; /* أفقي (افتراضي) */
flex-direction: column; /* عمودي */
flex-direction: row-reverse; /* أفقي معكوس */
flex-direction: column-reverse; /* عمودي معكوس */
/* التفاف العناصر */
flex-wrap: nowrap; /* عدم التفاف (افتراضي) */
flex-wrap: wrap; /* التفاف */
flex-wrap: wrap-reverse; /* التفاف معكوس */
/* محاذاة أفقية (المحور الرئيسي) */
justify-content: flex-start; /* البداية */
justify-content: flex-end; /* النهاية */
justify-content: center; /* الوسط */
justify-content: space-between; /* مسافات متساوية */
justify-content: space-around; /* مسافات حول العناصر */
justify-content: space-evenly; /* مسافات متساوية تماماً */
/* محاذاة عمودية (المحور المتقاطع) */
align-items: stretch; /* تمدد (افتراضي) */
align-items: flex-start; /* الأعلى */
align-items: flex-end; /* الأسفل */
align-items: center; /* الوسط */
align-items: baseline; /* خط القاعدة */
}
/* عناصر Flexbox */
.flex-item {
/* نمو العنصر */
flex-grow: 1; /* ينمو ليملأ المساحة */
flex-grow: 0; /* لا ينمو */
flex-grow: 2; /* ينمو بضعف السرعة */
/* تقلص العنصر */
flex-shrink: 1; /* يتقلص عند الحاجة */
flex-shrink: 0; /* لا يتقلص */
/* الحجم الأساسي */
flex-basis: auto; /* تلقائي */
flex-basis: 200px; /* حجم ثابت */
flex-basis: 30%; /* نسبة */
/* اختصار شامل */
flex: 1; /* flex: 1 1 0% */
flex: 0 1 auto; /* القيم الافتراضية */
flex: none; /* flex: 0 0 auto */
}
/* مثال عملي لتخطيط Flexbox */
.layout-flex {
display: flex;
min-height: 100vh;
}
.sidebar {
flex: 0 0 250px; /* عرض ثابت */
background: #f8f9fa;
padding: 20px;
}
.main-content {
flex: 1; /* يأخذ باقي المساحة */
padding: 20px;
}
.footer-flex {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
background: #333;
color: white;
}
CSS Grid الأساسي
/* Grid للتخطيط الشبكي */
.grid-container {
display: grid;
/* تعريف الأعمدة */
grid-template-columns: 200px 1fr 100px; /* ثابت، مرن، ثابت */
grid-template-columns: repeat(3, 1fr); /* 3 أعمدة متساوية */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); /* متجاوب */
/* تعريف الصفوف */
grid-template-rows: auto 1fr auto; /* رأس، محتوى، ذيل */
grid-template-rows: repeat(4, 100px); /* 4 صفوف ثابتة */
/* المسافات بين العناصر */
gap: 20px; /* مسافة شاملة */
grid-gap: 10px 20px; /* صفوف، أعمدة */
row-gap: 10px; /* مسافة الصفوف */
column-gap: 20px; /* مسافة الأعمدة */
/* محاذاة الشبكة */
justify-content: center; /* محاذاة أفقية */
align-content: center; /* محاذاة عمودية */
/* محاذاة العناصر داخل الخلايا */
justify-items: center; /* محاذاة أفقية للعناصر */
align-items: center; /* محاذاة عمودية للعناصر */
}
/* عناصر Grid */
.grid-item {
/* تحديد موضع العنصر */
grid-column: 1 / 3; /* من العمود 1 إلى 3 */
grid-row: 2 / 4; /* من الصف 2 إلى 4 */
/* اختصارات */
grid-column: span 2; /* يمتد عبر عمودين */
grid-row: span 3; /* يمتد عبر 3 صفوف */
/* تحديد المنطقة */
grid-area: header; /* منطقة محددة مسبقاً */
/* محاذاة العنصر الفردي */
justify-self: start; /* محاذاة أفقية */
align-self: end; /* محاذاة عمودية */
}
/* مثال عملي لتخطيط Grid */
.layout-grid {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
grid-template-rows: auto 1fr auto;
grid-template-columns: 200px 1fr 150px;
gap: 20px;
min-height: 100vh;
}
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.aside {
grid-area: aside;
}
.footer {
grid-area: footer;
}
6️⃣ مشروع عملي: نظام تخطيط متعدد الأنماط
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>نظام التخطيط المتعدد</title>
<link rel="stylesheet" href="layout-system.css" />
</head>
<body>
<!-- نظام التبويب لعرض أنماط مختلفة -->
<div class="layout-tabs">
<button class="tab-btn active" data-layout="block">Block Layout</button>
<button class="tab-btn" data-layout="inline">Inline Layout</button>
<button class="tab-btn" data-layout="inline-block">Inline-Block</button>
<button class="tab-btn" data-layout="flex">Flex Layout</button>
<button class="tab-btn" data-layout="grid">Grid Layout</button>
</div>
<!-- تخطيط Block -->
<div class="layout-demo" id="block-layout">
<div class="demo-title">Block Layout Demo</div>
<div class="block-container">
<div class="block-item">عنصر كتلة 1</div>
<div class="block-item">عنصر كتلة 2</div>
<div class="block-item">عنصر كتلة 3</div>
</div>
<div class="demo-description">
العناصر الكتلية تأخذ كامل العرض وتبدأ في أسطر جديدة
</div>
</div>
<!-- تخطيط Inline -->
<div class="layout-demo" id="inline-layout" style="display: none;">
<div class="demo-title">Inline Layout Demo</div>
<div class="inline-container">
هذا نص عادي مع
<span class="inline-item">عنصر سطري 1</span>
و
<span class="inline-item">عنصر سطري 2</span>
و
<span class="inline-item">عنصر سطري 3</span>
في نفس السطر.
</div>
<div class="demo-description">
العناصر السطرية تتدفق مع النص ولا تبدأ أسطراً جديدة
</div>
</div>
<!-- تخطيط Inline-Block -->
<div class="layout-demo" id="inline-block-layout" style="display: none;">
<div class="demo-title">Inline-Block Layout Demo</div>
<div class="inline-block-container">
<div class="inline-block-item">بطاقة 1</div>
<div class="inline-block-item">بطاقة 2</div>
<div class="inline-block-item">بطاقة 3</div>
<div class="inline-block-item">بطاقة 4</div>
</div>
<div class="demo-description">
Inline-block يجمع مزايا النوعين - يتدفق أفقياً ويقبل الأبعاد
</div>
</div>
<!-- تخطيط Flex -->
<div class="layout-demo" id="flex-layout" style="display: none;">
<div class="demo-title">Flex Layout Demo</div>
<div class="flex-container">
<div class="flex-item">عنصر مرن 1</div>
<div class="flex-item">عنصر مرن 2</div>
<div class="flex-item">عنصر مرن 3</div>
</div>
<div class="flex-controls">
<button class="control-btn" data-flex="row">صف</button>
<button class="control-btn" data-flex="column">عمود</button>
<button class="control-btn" data-flex="center">توسيط</button>
<button class="control-btn" data-flex="space-between">توزيع</button>
</div>
<div class="demo-description">
Flexbox يوفر تحكماً مرناً في التخطيط والمحاذاة
</div>
</div>
<!-- تخطيط Grid -->
<div class="layout-demo" id="grid-layout" style="display: none;">
<div class="demo-title">Grid Layout Demo</div>
<div class="grid-container">
<div class="grid-item header">الرأس</div>
<div class="grid-item sidebar">الشريط الجانبي</div>
<div class="grid-item main">المحتوى الرئيسي</div>
<div class="grid-item aside">الشريط الجانبي الثانوي</div>
<div class="grid-item footer">الذيل</div>
</div>
<div class="demo-description">
CSS Grid يوفر تحكماً دقيقاً في التخطيط ثنائي الأبعاد
</div>
</div>
<!-- معلومات إضافية -->
<div class="info-panel">
<h3>معلومات مفيدة:</h3>
<ul>
<li><strong>Block:</strong> مثالي للعناصر الرئيسية والمحتوى</li>
<li><strong>Inline:</strong> مثالي للنص والعناصر الصغيرة</li>
<li><strong>Inline-Block:</strong> مثالي للأزرار والبطاقات الصغيرة</li>
<li><strong>Flex:</strong> مثالي للتخطيط المرن والمحاذاة</li>
<li><strong>Grid:</strong> مثالي للتخطيطات المعقدة والشبكية</li>
</ul>
</div>
<script src="layout-demo.js"></script>
</body>
</html>
/* layout-system.css */
:root {
--primary: #007bff;
--secondary: #6c757d;
--success: #28a745;
--danger: #dc3545;
--warning: #ffc107;
--info: #17a2b8;
--light: #f8f9fa;
--dark: #343a40;
--white: #ffffff;
--border-radius: 8px;
--box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
--transition: all 0.3s ease;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: "Cairo", Arial, sans-serif;
background: linear-gradient(135deg, var(--light), #e3f2fd);
padding: 20px;
color: var(--dark);
}
/* أزرار التبويب */
.layout-tabs {
display: flex;
justify-content: center;
margin-bottom: 30px;
background: var(--white);
border-radius: var(--border-radius);
padding: 10px;
box-shadow: var(--box-shadow);
flex-wrap: wrap;
gap: 10px;
}
.tab-btn {
padding: 12px 20px;
border: none;
background: transparent;
color: var(--secondary);
border-radius: var(--border-radius);
cursor: pointer;
font-weight: 500;
transition: var(--transition);
font-family: inherit;
}
.tab-btn:hover {
background: var(--light);
}
.tab-btn.active {
background: var(--primary);
color: var(--white);
}
/* حاوي العرض التوضيحي */
.layout-demo {
max-width: 1000px;
margin: 0 auto;
background: var(--white);
border-radius: var(--border-radius);
padding: 30px;
box-shadow: var(--box-shadow);
margin-bottom: 20px;
}
.demo-title {
font-size: 1.5rem;
font-weight: 600;
color: var(--primary);
margin-bottom: 20px;
text-align: center;
}
.demo-description {
margin-top: 20px;
padding: 15px;
background: var(--light);
border-radius: var(--border-radius);
color: var(--secondary);
text-align: center;
font-style: italic;
}
/* تخطيط Block */
.block-container {
margin: 20px 0;
}
.block-item {
display: block;
width: 100%;
padding: 15px;
margin-bottom: 10px;
background: linear-gradient(135deg, var(--primary), #0056b3);
color: var(--white);
border-radius: var(--border-radius);
text-align: center;
font-weight: 500;
transition: var(--transition);
}
.block-item:hover {
transform: translateX(10px);
}
/* تخطيط Inline */
.inline-container {
margin: 20px 0;
padding: 20px;
background: var(--light);
border-radius: var(--border-radius);
line-height: 2;
font-size: 1.1rem;
}
.inline-item {
display: inline;
background: var(--success);
color: var(--white);
padding: 5px 10px;
border-radius: 4px;
font-weight: 500;
margin: 0 3px;
}
/* تخطيط Inline-Block */
.inline-block-container {
text-align: center;
margin: 20px 0;
}
.inline-block-item {
display: inline-block;
width: 150px;
height: 100px;
margin: 10px;
padding: 15px;
background: linear-gradient(135deg, var(--warning), #e6a000);
color: var(--dark);
border-radius: var(--border-radius);
text-align: center;
line-height: 70px;
font-weight: 600;
transition: var(--transition);
vertical-align: top;
}
.inline-block-item:hover {
transform: translateY(-5px) rotate(2deg);
}
/* تخطيط Flex */
.flex-container {
display: flex;
margin: 20px 0;
gap: 15px;
min-height: 100px;
}
.flex-item {
flex: 1;
background: linear-gradient(135deg, var(--info), #138496);
color: var(--white);
padding: 20px;
border-radius: var(--border-radius);
text-align: center;
display: flex;
align-items: center;
justify-content: center;
font-weight: 500;
transition: var(--transition);
}
.flex-item:hover {
flex: 1.2;
transform: scale(1.05);
}
.flex-controls {
display: flex;
justify-content: center;
gap: 10px;
margin: 20px 0;
}
.control-btn {
padding: 8px 15px;
border: 2px solid var(--primary);
background: transparent;
color: var(--primary);
border-radius: var(--border-radius);
cursor: pointer;
font-weight: 500;
transition: var(--transition);
font-family: inherit;
}
.control-btn:hover {
background: var(--primary);
color: var(--white);
}
/* تخطيط Grid */
.grid-container {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
grid-template-rows: auto 200px auto;
grid-template-columns: 1fr 2fr 1fr;
gap: 15px;
margin: 20px 0;
}
.grid-item {
padding: 20px;
border-radius: var(--border-radius);
color: var(--white);
text-align: center;
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
transition: var(--transition);
}
.grid-item:hover {
transform: scale(1.02);
}
.grid-item.header {
grid-area: header;
background: linear-gradient(135deg, var(--primary), #0056b3);
}
.grid-item.sidebar {
grid-area: sidebar;
background: linear-gradient(135deg, var(--success), #1e7e34);
}
.grid-item.main {
grid-area: main;
background: linear-gradient(135deg, var(--danger), #bd2130);
}
.grid-item.aside {
grid-area: aside;
background: linear-gradient(135deg, var(--warning), #e6a000);
color: var(--dark);
}
.grid-item.footer {
grid-area: footer;
background: linear-gradient(135deg, var(--secondary), #545b62);
}
/* لوحة المعلومات */
.info-panel {
max-width: 1000px;
margin: 0 auto;
background: var(--white);
border-radius: var(--border-radius);
padding: 30px;
box-shadow: var(--box-shadow);
}
.info-panel h3 {
color: var(--primary);
margin-bottom: 15px;
}
.info-panel ul {
list-style: none;
padding: 0;
}
.info-panel li {
padding: 8px 0;
border-bottom: 1px solid var(--light);
color: var(--dark);
}
.info-panel li:last-child {
border-bottom: none;
}
/* التصميم المتجاوب */
@media (max-width: 768px) {
.layout-tabs {
flex-direction: column;
}
.grid-container {
grid-template-areas:
"header"
"sidebar"
"main"
"aside"
"footer";
grid-template-columns: 1fr;
grid-template-rows: auto auto auto auto auto;
}
.inline-block-item {
width: 120px;
height: 80px;
line-height: 50px;
margin: 5px;
}
.flex-container {
flex-direction: column;
}
}
// layout-demo.js
document.addEventListener("DOMContentLoaded", function () {
// التبديل بين التخطيطات
const tabBtns = document.querySelectorAll(".tab-btn");
const layouts = document.querySelectorAll(".layout-demo");
tabBtns.forEach((btn) => {
btn.addEventListener("click", function () {
const layout = this.getAttribute("data-layout");
// إزالة الفئة النشطة من جميع الأزرار
tabBtns.forEach((b) => b.classList.remove("active"));
this.classList.add("active");
// إخفاء جميع التخطيطات
layouts.forEach((l) => (l.style.display = "none"));
// عرض التخطيط المحدد
document.getElementById(layout + "-layout").style.display = "block";
});
});
// التحكم في Flexbox
const controlBtns = document.querySelectorAll(".control-btn");
const flexContainer = document.querySelector(".flex-container");
controlBtns.forEach((btn) => {
btn.addEventListener("click", function () {
const flexType = this.getAttribute("data-flex");
switch (flexType) {
case "row":
flexContainer.style.flexDirection = "row";
flexContainer.style.justifyContent = "flex-start";
break;
case "column":
flexContainer.style.flexDirection = "column";
flexContainer.style.justifyContent = "flex-start";
break;
case "center":
flexContainer.style.flexDirection = "row";
flexContainer.style.justifyContent = "center";
flexContainer.style.alignItems = "center";
break;
case "space-between":
flexContainer.style.flexDirection = "row";
flexContainer.style.justifyContent = "space-between";
flexContainer.style.alignItems = "stretch";
break;
}
// إظهار التأثير البصري
controlBtns.forEach((b) => (b.style.background = "transparent"));
controlBtns.forEach((b) => (b.style.color = "var(--primary)"));
this.style.background = "var(--primary)";
this.style.color = "var(--white)";
});
});
});
الخلاصة
في هذا الدرس تعلمنا:
✅ مفهوم Display وأنماط العرض الأساسية
✅ العناصر الكتلية (Block) وخصائصها
✅ العناصر السطرية (Inline) وقيودها
✅ Inline-Block كحل هجين مرن
✅ مقدمة سريعة لـ Flexbox و Grid
✅ مشروع تفاعلي يوضح جميع الأنماط
في الدرس القادم سندرس Flexbox بالتفصيل لإتقان التخطيط المرن والمحاذاة المتطورة.