Display وأنماط العرض في CSS: دليل شامل للتحكم في سلوك العناصر
Display وأنماط العرض في CSS: دليل شامل للتحكم في سلوك العناصر
دليل تخصصي من علاء عامر – مطور ومصمم مواقع وتطبيقات محترف
فهم خصائص Display أساسي لإتقان تخطيط الصفحات. تعلم كيفية التحكم في سلوك العناصر وإنشاء تصاميم مرنة ومتطورة.
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;
}
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;
}
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 بالتفصيل لإتقان التخطيط المرن والمحاذاة المتطورة.
قسم المقالة
Display وأنماط العرض في CSS: دليل شامل للتحكم في سلوك العناصر
إتقان خصائص Display في CSS - فهم block، inline، flex، grid والمزيد. تعلم كيفية التحكم في سلوك العناصر وتخطيط الصفحات بمهارة.
التواصل والاستشارة
تواصل مباشر عبر الواتساب أو الهاتف لفهم احتياجات مشروعك بدقة.
التخطيط والجدولة
وضع خطة عمل واضحة مع جدول زمني محدد لكل مرحلة من المشروع.
البرمجة والتطوير
تطوير المشروع بأحدث التقنيات لضمان الأداء والأمان العاليين.
المراجعة والتسليم
ختبار شامل ومراجعة دقيقة قبل التسليم النهائي للمشروع.