امتحان CSS 3: التخطيط المتقدم والمستوى المتوسط (تمارين مركبة)
امتحان CSS 3: التخطيط المتقدم والمستوى المتوسط
يتكون هذا الامتحان من 13 تمرين شامل. كل تمرين يحتوي على عدة مطالب (أسئلة) يجب تنفيذها معاً في كود واحد.
التمارين 1-10: المستوى الأساسي |
التمارين 11-13: المستوى المتوسط
تمرين 1
أساسيات الشبكة (CSS Grid Basics)
أنشئ شبكة (Grid) بالمواصفات التالية:
- اجعل الحاوية (.grid-container) تعرض كشبكة (display: grid).
- قسم الشبكة إلى 3 أعمدة متساوية العرض (1fr 1fr 1fr).
- أضف فجوة (gap) بمقدار 20px بين الأعمدة والصفوف.
الحل
.grid-container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* أو repeat(3, 1fr) */
gap: 20px;
}
تمرين 2
تموضع عناصر الشبكة (Grid Placement)
تحكم في مكان عنصر داخل الشبكة:
- اجعل العنصر (.item1) يمتد من العمود الأول إلى العمود الثالث (يأخذ عمودين).
- اجعل العنصر (.item2) يمتد على صفين كاملين.
الحل
.item1 {
grid-column: 1 / 3; /* أو span 2 */
}
.item2 {
grid-row: span 2;
}
تمرين 3
مناطق الشبكة (Grid Areas)
استخدم `grid-template-areas` لتخطيط صفحة:
- عرف المناطق التالية: header, sidebar, main, footer.
- اجعل الـ header والـ footer يمتدان على كامل العرض.
- اجعل الـ sidebar على اليسار والـ main على اليمين.
الحل
.container {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
تمرين 4
استعلامات الوسائط (Media Queries)
اجعل التصميم متجاوباً:
- بشكل افتراضي، خلفية الصفحة بيضاء.
- عندما يكون عرض الشاشة أقل من 768px (موبايل)، اجعل الخلفية زرقاء فاتحة.
- عندما يكون عرض الشاشة أكبر من 1200px (شاشة كبيرة)، اجعل حجم الخط 20px.
الحل
body {
background-color: white;
}
@media (max-width: 768px) {
body {
background-color: lightblue;
}
}
@media (min-width: 1200px) {
body {
font-size: 20px;
}
}
تمرين 5
Flexbox المتقدم (Order & Grow)
تحكم في ترتيب وحجم عناصر Flex:
- اجعل العنصر (.item-last) يظهر في البداية (تغيير الترتيب البصري).
- اجعل العنصر (.item-grow) يملأ المساحة المتبقية في الحاوية (flex-grow: 1).
الحل
.item-last {
order: -1;
}
.item-grow {
flex-grow: 1;
}
تمرين 6
الصور المتجاوبة (Responsive Images)
اجعل الصورة تتكيف مع الحاوية:
- اجعل أقصى عرض للصورة 100% (max-width) لكي لا تخرج عن الحاوية.
- اجعل الارتفاع تلقائياً (height: auto) للحفاظ على الأبعاد.
- استخدم `object-fit: cover` لملء مربع الصورة دون تشويهها (مع تحديد أبعاد ثابتة للصورة).
الحل
img {
max-width: 100%;
height: auto;
}
.profile-pic {
width: 200px;
height: 200px;
object-fit: cover;
}
تمرين 7
تخطيط البطاقات (Card Layout)
أنشئ تخطيطاً لشبكة بطاقات متجاوبة:
- استخدم Grid لإنشاء أعمدة تتكرر تلقائياً (auto-fit).
- اجعل الحد الأدنى لعرض العمود 250px والحد الأقصى 1fr (minmax).
- هذا يضمن أن البطاقات ستلتف تلقائياً بناءً على حجم الشاشة.
الحل
.cards-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
تمرين 8
إخفاء العناصر بشكل متجاوب
تحكم في ظهور العناصر حسب الجهاز:
- أخفِ القائمة الجانبية (.sidebar) في شاشات الموبايل (أقل من 600px).
- أظهر زر القائمة (.menu-btn) فقط في شاشات الموبايل (أخفه في الشاشات الكبيرة).
الحل
/* إخفاء السايدبار في الموبايل */
@media (max-width: 600px) {
.sidebar { display: none; }
}
/* إخفاء زر القائمة في الشاشات الكبيرة */
.menu-btn { display: none; }
/* إظهار زر القائمة في الموبايل */
@media (max-width: 600px) {
.menu-btn { display: block; }
}
تمرين 9
محاذاة الشبكة (Grid Alignment)
قم بمحاذاة محتوى الشبكة:
- حاذِ محتوى الشبكة أفقياً في الوسط (justify-content: center).
- حاذِ العناصر داخل خلاياها عمودياً في الوسط (align-items: center).
الحل
.grid-container {
display: grid;
justify-content: center; /* محاذاة الشبكة نفسها */
align-items: center; /* محاذاة العناصر داخل الخلايا */
}
تمرين 10
التخطيط المختلط (Flex inside Grid)
ادمج بين التقنيتين:
- لديك بطاقة (.card) هي عنصر داخل شبكة (Grid Item).
- اجعل محتوى البطاقة نفسها يستخدم Flexbox لتوزيع العنوان والزر متباعدين (space-between) وعمودياً (column).
الحل
.card {
/* هذا العنصر هو ابن لشبكة، لكنه أب لمحتواه */
display: flex;
flex-direction: column;
justify-content: space-between;
height: 100%;
}
تمرين 11
مرشحات CSS (CSS Filters)
متوسط
استخدم مرشحات CSS لتأثيرات بصرية:
- أضف تأثير ضبابية (blur) بمقدار 5px للصورة.
- اجعل الصورة بالأبيض والأسود (grayscale) بنسبة 100%.
- أضف سطوع (brightness) بنسبة 150% عند hover.
- اجمع عدة فلاتر معاً (blur + brightness + contrast).
الحل
/* تأثير ضبابية */
.blur-image {
filter: blur(5px);
}
/* أبيض وأسود */
.grayscale-image {
filter: grayscale(100%);
}
/* سطوع عند hover */
.bright-on-hover {
transition: filter 0.3s ease;
}
.bright-on-hover:hover {
filter: brightness(150%);
}
/* جمع عدة فلاتر */
.multi-filter {
filter: blur(2px) brightness(120%) contrast(110%);
}
/* مثال متقدم: تأثير sepia */
.vintage-photo {
filter: sepia(80%) contrast(120%) brightness(90%);
}
تمرين 12
قص الأشكال (Clip-path)
متوسط
استخدم clip-path لإنشاء أشكال مخصصة:
- اقطع صورة على شكل دائرة (circle).
- اقطع عنصر على شكل مثلث باستخدام polygon.
- أنشئ شكل سداسي (hexagon) باستخدام clip-path.
- أضف تأثير انتقال (transition) عند تغيير الشكل.
الحل
/* دائرة */
.circle-clip {
clip-path: circle(50%);
}
/* مثلث */
.triangle-clip {
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
}
/* سداسي */
.hexagon-clip {
clip-path: polygon(
50% 0%,
100% 25%,
100% 75%,
50% 100%,
0% 75%,
0% 25%
);
}
/* تأثير انتقال */
.shape-morph {
clip-path: circle(30%);
transition: clip-path 0.5s ease;
}
.shape-morph:hover {
clip-path: circle(50%);
}
/* أشكال إضافية */
.star-clip {
clip-path: polygon(
50% 0%,
61% 35%,
98% 35%,
68% 57%,
79% 91%,
50% 70%,
21% 91%,
32% 57%,
2% 35%,
39% 35%
);
}
تمرين 13
الخصائص المخصصة المتقدمة (Advanced CSS Variables)
متوسط
استخدم CSS Variables بشكل متقدم:
- أنشئ نظام ألوان كامل باستخدام متغيرات في :root.
- أنشئ متغيرات للمسافات (spacing scale) مثل --space-xs, --space-sm, --space-md.
- استخدم calc() مع المتغيرات لإنشاء قيم ديناميكية.
- أنشئ theme switcher بتغيير قيم المتغيرات في class مختلف.
الحل
/* نظام الألوان */
:root {
/* Colors */
--color-primary: #007bff;
--color-secondary: #6c757d;
--color-success: #28a745;
--color-danger: #dc3545;
--color-bg: #ffffff;
--color-text: #212529;
/* Spacing Scale */
--space-xs: 0.25rem; /* 4px */
--space-sm: 0.5rem; /* 8px */
--space-md: 1rem; /* 16px */
--space-lg: 1.5rem; /* 24px */
--space-xl: 2rem; /* 32px */
/* Typography */
--font-size-base: 16px;
--font-size-lg: calc(var(--font-size-base) * 1.25);
--font-size-xl: calc(var(--font-size-base) * 1.5);
}
/* استخدام المتغيرات */
.button {
background-color: var(--color-primary);
padding: var(--space-md) var(--space-lg);
font-size: var(--font-size-base);
}
/* Dark Theme */
.dark-theme {
--color-bg: #1a1a1a;
--color-text: #ffffff;
--color-primary: #4dabf7;
}
/* استخدام calc مع المتغيرات */
.container {
padding: calc(var(--space-md) * 2);
margin-bottom: calc(var(--space-lg) + var(--space-sm));
}
/* نظام Grid باستخدام المتغيرات */
:root {
--grid-columns: 12;
--grid-gap: var(--space-md);
}
.grid {
display: grid;
grid-template-columns: repeat(var(--grid-columns), 1fr);
gap: var(--grid-gap);
}