مناطق الشبكة المسماة ومناطق القالب
مقدمة الى مناطق قالب الشبكة
يمنحك تخطيط شبكة CSS طريقتين قويتين لوضع العناصر على الشبكة. في الدروس السابقة، تعلمت عن التموضع القائم على الخطوط باستخدام grid-column و grid-row مع ارقام الخطوط. بينما التموضع القائم على الخطوط دقيق ومرن، الا انه قد يصبح صعب التصور والصيانة في التخطيطات المعقدة. هنا ياتي دور grid-template-areas -- فهو يتيح لك تعريف التخطيط بصريا، باستخدام مناطق مسماة تتطابق مباشرة مع بنية صفحتك. بدلا من عد ارقام الخطوط، ترسم حرفيا تخطيطك في CSS باستخدام تمثيل نصي.
خاصية grid-template-areas هي واحدة من اكثر الميزات سهولة وقوة في CSS بالكامل. تسمح لك بتعيين اسماء ذات معنى لمناطق شبكتك، ثم وضع العناصر في تلك المناطق بالاسم. هذا يجعل كود التخطيط موثقا ذاتيا، واسهل في القراءة، واسهل في التغيير، وابسط بكثير لجعله متجاوبا. في هذا الدرس، سنستكشف كل جانب من مناطق الشبكة المسماة، من القواعد الاساسية الى التخطيطات المعقدة في العالم الحقيقي.
تعريف مناطق القالب باستخدام grid-template-areas
يتم تطبيق خاصية grid-template-areas على حاوية الشبكة. كل نص تقدمه يمثل صفا واحدا من الشبكة، وداخل كل نص تستخدم اسماء مفصولة بمسافات لتعيين خلايا الشبكة لمناطق مسماة. الاسماء التي تختارها تعود اليك تماما -- يجب ان تصف المحتوى الذي سيوضع في تلك المنطقة.
مثال: القواعد الاساسية لمناطق القالب
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
grid-template-columns: 200px 1fr 1fr;
grid-template-rows: 80px 1fr 60px;
}
في المثال اعلاه، نعرف شبكة من ثلاثة صفوف وثلاثة اعمدة. الصف الاول مشغول بالكامل بمنطقة مسماة "header" تمتد عبر الاعمدة الثلاثة. الصف الثاني يحتوي على "sidebar" في العمود الاول و "content" يمتد عبر العمودين الثاني والثالث. الصف الثالث هو "footer" بالكامل يمتد عبر الاعمدة الثلاثة. هذا ينشئ تخطيط صفحة كلاسيكي يمكنك قراءته وفهمه بنظرة واحدة.
grid-template-areas على نفس عدد رموز الخلايا. اذا كان الصف الاول يحتوي على ثلاثة اسماء، فكل صف لاحق يجب ان يحتوي ايضا على ثلاثة اسماء بالضبط (او عناصر نائبة بالنقاط). الاعداد غير المتطابقة ستبطل التصريح بالكامل.تعيين العناصر للمناطق المسماة باستخدام grid-area
بمجرد تعريف مناطق القالب على الحاوية، تعين عناصر الشبكة لتلك المناطق باستخدام خاصية grid-area على كل عنصر فرعي. قيمة grid-area يجب ان تتطابق تماما مع احد الاسماء المستخدمة في grid-template-areas.
مثال: وضع العناصر في المناطق المسماة
<div class="container">
<header class="site-header">موقعي</header>
<aside class="site-sidebar">التنقل</aside>
<main class="site-content">المحتوى الرئيسي</main>
<footer class="site-footer">التذييل</footer>
</div>
CSS: تعيين اسماء grid-area
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
grid-template-columns: 250px 1fr 1fr;
grid-template-rows: 80px 1fr 60px;
min-height: 100vh;
}
.site-header { grid-area: header; }
.site-sidebar { grid-area: sidebar; }
.site-content { grid-area: content; }
.site-footer { grid-area: footer; }
لاحظ مدى نظافة وقابلية قراءة هذا. خاصية grid-template-areas تعمل كتمثيل رسومي نصي لتخطيطك. وكل عنصر يعلن ببساطة عن المنطقة المسماة التي ينتمي اليها. ترتيب العناصر في HTML لا يهم -- ستضعها الشبكة وفقا لاسماء المناطق وليس ترتيب المصدر.
grid-template-areas لجعل نمط التخطيط المرئي واضحا. قم بمحاذاة فواصل الاعمدة عموديا بحيث يسهل تحديد كل عمود. هذه الممارسة تحسن القراءة بشكل كبير لك ولفريقك.الخلايا الفارغة باستخدام ترميز النقطة (.)
ليس كل خلية في شبكتك تحتاج الى تعيين لمنطقة مسماة. عندما تريد ان تبقى خلية فارغة -- بدون محتوى موضوع فيها -- تستخدم نقطة (.) كعنصر نائب. يمكنك استخدام نقطة واحدة او عدة نقاط متتالية (مثل ...) لسهولة القراءة. طالما ان النقاط غير مفصولة بمسافات عن نقاط اخرى، فانها تعد كرمز خلية فارغة واحد.
مثال: استخدام النقاط للخلايا الفارغة
.container {
display: grid;
grid-template-areas:
"header header header"
"... content sidebar"
"footer footer footer";
grid-template-columns: 200px 1fr 250px;
grid-template-rows: 80px 1fr 60px;
}
في هذا المثال، الخلية في الصف الثاني والعمود الاول فارغة. لن يوضع اي عنصر شبكة هناك، وستكون ببساطة مساحة فارغة. هذا مفيد لانشاء تخطيطات غير متماثلة او اضافة مساحة تنفس بصرية.
مثال: عدة خلايا فارغة
.gallery-layout {
display: grid;
grid-template-areas:
"img1 img1 . img2"
"img1 img1 img3 img3"
". img4 img3 img3";
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 200px);
gap: 10px;
}
.photo-1 { grid-area: img1; }
.photo-2 { grid-area: img2; }
.photo-3 { grid-area: img3; }
.photo-4 { grid-area: img4; }
هذا ينشئ تخطيط معرض مثير حيث تمتد الصور عبر اعداد مختلفة من الخلايا، مع خليتين فارغتين تنشئان عدم تماثل بصري. هذا النوع من التخطيط سيكون اصعب بكثير في الفهم باستخدام ارقام الخطوط فقط.
قواعد المناطق المسماة الصالحة
هناك قواعد مهمة يجب ان تتبعها قيم grid-template-areas لتكون صالحة:
- اشكال مستطيلة فقط: كل منطقة مسماة يجب ان تشكل مستطيلا. لا يمكنك انشاء مناطق على شكل حرف L او T او اشكال غير مستطيلة اخرى. سيبطل المتصفح التصريح بالكامل اذا لم تشكل المنطقة مستطيلا كاملا.
- اطوال صفوف متسقة: كل نص صف يجب ان يحتوي على نفس عدد رموز الخلايا.
- لا امتداد قطري: لا يمكن للمنطقة المسماة ان تمتد قطريا -- يجب ان تمتد عبر صفوف متجاورة واعمدة متجاورة.
- اسماء المناطق يجب ان تكون معرفات CSS صالحة: لا يمكن ان تبدا برقم، ويجب الا تتعارض مع كلمات CSS المحجوزة. استخدم اسماء وصفية مثل
headerوsidebarوcontentوnavاوbanner.
مثال: منطقة على شكل L غير صالحة (لن تعمل)
/* غير صالح -- "sidebar" تشكل حرف L وليس مستطيلا */
.container {
display: grid;
grid-template-areas:
"sidebar header header"
"sidebar content content"
"sidebar footer sidebar"; /* sidebar تظهر منفصلة! */
}
grid-template-areas مستطيلا متجاورا، فان تصريح grid-template-areas بالكامل يكون غير صالح وسيتجاهله المتصفح. استخدم ادوات المطور في متصفحك للتحقق من التحذيرات اذا لم يعمل تخطيطك كما هو متوقع.الجمع بين مناطق القالب وتحديد حجم المسارات الصريح
خاصية grid-template-areas تحدد شكل واسماء مناطق شبكتك، لكنها لا تحدد احجام الصفوف والاعمدة بذاتها. عادة تجمعها مع grid-template-columns و grid-template-rows لتحديد ابعاد كل مسار. عدد الاعمدة المحددة يجب ان يتطابق مع عدد الاسماء في كل نص صف، وعدد الصفوف المحددة يجب ان يتطابق مع عدد نصوص الصفوف.
مثال: مناطق القالب مع تحديد الحجم المفصل
.page {
display: grid;
grid-template-areas:
"nav nav nav"
"sidebar main aside"
"footer footer footer";
grid-template-columns: 220px 1fr 180px;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
gap: 16px;
padding: 16px;
}
.nav { grid-area: nav; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
هنا، يمتد التنقل عبر الاعمدة الثلاثة ويتحجم وفقا لمحتواه (auto). الصف الاوسط يحتوي على شريط جانبي بعرض ثابت على اليسار (220px)، ومنطقة محتوى رئيسية مرنة (1fr)، وشريط جانبي بعرض ثابت على اليمين (180px). الصف الاوسط يشغل كل المساحة العمودية المتبقية بسبب 1fr. التذييل يتحجم تلقائيا وفقا لمحتواه.
خطوط الشبكة المسماة من مناطق القالب
عندما تعرف مناطق مسماة، ينشئ CSS Grid تلقائيا خطوط شبكة مسماة بناء على اسماء تلك المناطق. لكل منطقة مسماة، ينشئ المتصفح خطوطا مسماة {area-name}-start و {area-name}-end لكل من الصفوف والاعمدة. هذا يعني انه يمكنك الاشارة الى هذه الخطوط المسماة الضمنية في خصائص شبكة اخرى مثل grid-column او grid-row.
مثال: استخدام الخطوط المسماة الضمنية
.container {
display: grid;
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
grid-template-columns: 200px 1fr 1fr;
grid-template-rows: 80px 1fr 60px;
}
/* عنصر اضافي يوضع باستخدام الخطوط المسماة الضمنية */
.overlay {
grid-column: content-start / content-end;
grid-row: header-start / footer-end;
/* هذا العنصر يمتد من بداية عمود المحتوى الى نهايته
ومن اعلى صف الراس الى اسفل صف التذييل */
background: rgba(0, 0, 0, 0.1);
pointer-events: none;
}
هذه الميزة مفيدة للغاية لاضافة عناصر زخرفية او طبقات او محتوى اضافي يحتاج الى المحاذاة مع مناطقك المسماة لكنه لا يتناسب بدقة مع منطقة واحدة محددة. يمكنك المزج والمطابقة بين التموضع بالمنطقة المسماة والتموضع القائم على الخطوط في نفس الشبكة.
التخطيطات المتجاوبة بتغيير مناطق القالب
واحدة من اعظم نقاط قوة grid-template-areas هي مدى سهولة جعل التصميم متجاوبا. بدلا من اعادة ترتيب ارقام خطوط معقدة في استعلامات الوسائط، تعيد ببساطة تعريف نصوص grid-template-areas. نفس عناصر HTML تعيد ترتيب نفسها تلقائيا في مواقعها الجديدة لان اسماء grid-area تبقى كما هي.
مثال: تخطيط متجاوب مع مناطق القالب
/* الهاتف: عمود واحد، تخطيط مكدس */
.page {
display: grid;
grid-template-areas:
"header"
"nav"
"content"
"sidebar"
"footer";
grid-template-columns: 1fr;
grid-template-rows: auto auto 1fr auto auto;
min-height: 100vh;
gap: 16px;
}
/* الجهاز اللوحي: عمودان */
@media (min-width: 768px) {
.page {
grid-template-areas:
"header header"
"nav nav"
"sidebar content"
"footer footer";
grid-template-columns: 250px 1fr;
}
}
/* سطح المكتب: ثلاثة اعمدة */
@media (min-width: 1200px) {
.page {
grid-template-areas:
"header header header"
"nav nav nav"
"sidebar content aside"
"footer footer footer";
grid-template-columns: 250px 1fr 200px;
}
}
.header { grid-area: header; }
.nav { grid-area: nav; }
.content { grid-area: content; }
.sidebar { grid-area: sidebar; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
انظر كم هو نظيف. HTML يبقى كما هو تماما. تعيينات grid-area على العناصر الفرعية لا تتغير ابدا. فقط grid-template-areas و grid-template-columns للحاوية تتغير بين نقاط التوقف. يمكنك حرفيا رؤية تغيير التخطيط بقراءة النصوص الرسومية. لهذا السبب مناطق القالب هي النهج المفضل لتخطيطات مستوى الصفحة في CSS الحديث.
aside على الهاتف)، ببساطة لا تدرجها في مناطق القالب. العنصر ذو grid-area: aside سيظل موجودا في DOM لكنه لن يوضع على الشبكة. يمكنك اخفاؤه باستخدام display: none عند تلك النقطة لمنعه من الظهور خارج الشبكة.تخطيط لوحة تحكم كامل
لنبني تخطيط لوحة تحكم حقيقي باستخدام مناطق الشبكة المسماة. لوحات التحكم عادة تحتوي على شريط تنقل علوي، ولوحة جانبية للتنقل، ومنطقة محتوى رئيسية مع ادوات، وربما شريط حالة في الاسفل.
HTML: بنية لوحة التحكم
<div class="dashboard">
<header class="dash-header">
<h1>لوحة تحكم المدير</h1>
<div class="user-menu">الملف الشخصي</div>
</header>
<nav class="dash-nav">
<ul>
<li>لوحة التحكم</li>
<li>المستخدمون</li>
<li>التقارير</li>
<li>الاعدادات</li>
</ul>
</nav>
<main class="dash-main">
<div class="widget">الايرادات</div>
<div class="widget">المستخدمون</div>
<div class="widget">النشاط</div>
</main>
<aside class="dash-notifications">
<h3>الاشعارات</h3>
</aside>
<footer class="dash-status">
<span>الخادم: متصل</span>
</footer>
</div>
CSS: شبكة لوحة التحكم مع مناطق القالب
.dashboard {
display: grid;
grid-template-areas:
"header header header header"
"nav main main notif"
"nav main main notif"
"status status status status";
grid-template-columns: 220px 1fr 1fr 280px;
grid-template-rows: 64px 1fr 1fr 40px;
min-height: 100vh;
gap: 0;
}
.dash-header { grid-area: header;
background: #1a1a2e;
color: white;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 24px; }
.dash-nav { grid-area: nav;
background: #16213e;
color: white;
padding: 20px; }
.dash-main { grid-area: main;
background: #f0f2f5;
padding: 24px;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
align-content: start; }
.dash-notifications { grid-area: notif;
background: #ffffff;
padding: 20px;
border-left: 1px solid #e0e0e0; }
.dash-status { grid-area: status;
background: #1a1a2e;
color: #aaa;
display: flex;
align-items: center;
padding: 0 24px;
font-size: 0.85rem; }
/* متجاوب: ينطوي على الشاشات الاصغر */
@media (max-width: 1024px) {
.dashboard {
grid-template-areas:
"header header"
"nav main"
"nav main"
"status status";
grid-template-columns: 200px 1fr;
}
.dash-notifications { display: none; }
}
@media (max-width: 640px) {
.dashboard {
grid-template-areas:
"header"
"main"
"status";
grid-template-columns: 1fr;
grid-template-rows: 64px 1fr 40px;
}
.dash-nav { display: none; }
}
لوحة التحكم هذه توضح القوة الكاملة لمناطق القالب. تخطيط سطح المكتب يحتوي على اربعة اعمدة مع راس يمتد عبر الاعلى، وتنقل على اليسار، ومحتوى رئيسي في الوسط، واشعارات على اليمين. على الجهاز اللوحي، ننطوي الى عمودين ونخفي الاشعارات. على الهاتف، ننتقل الى عمود واحد ونخفي التنقل الجانبي تماما. HTML لا يتغير ابدا -- فقط مناطق قالب شبكة CSS يعاد تعريفها.
تخطيط المدونة بمناطق القالب
تخطيطات المدونات غالبا تتطلب قسم مقالة مميزة، وشبكة منشورات، وشريط جانبي بالفئات والمنشورات الشائعة، وتذييل. مناطق القالب تجعل هذه البنية واضحة وقابلة للصيانة.
CSS: تخطيط صفحة المدونة
.blog-page {
display: grid;
grid-template-areas:
"featured featured featured"
"posts posts sidebar"
"posts posts sidebar"
"more more more";
grid-template-columns: 1fr 1fr 300px;
grid-template-rows: 400px auto auto auto;
gap: 24px;
max-width: 1200px;
margin: 0 auto;
padding: 24px;
}
.featured-article { grid-area: featured;
background: linear-gradient(135deg, #667eea, #764ba2);
border-radius: 12px;
color: white;
display: flex;
align-items: flex-end;
padding: 40px; }
.post-grid { grid-area: posts;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px; }
.blog-sidebar { grid-area: sidebar; }
.load-more { grid-area: more;
text-align: center;
padding: 40px; }
@media (max-width: 768px) {
.blog-page {
grid-template-areas:
"featured"
"posts"
"sidebar"
"more";
grid-template-columns: 1fr;
grid-template-rows: 250px auto auto auto;
}
.post-grid {
grid-template-columns: 1fr;
}
}
تخطيط صفحة الهبوط
صفحات الهبوط تحتوي على اقسام مميزة تستفيد بشكل كبير من مناطق القالب. قسم البطل، وابرازات الميزات، والشهادات، ودعوة العمل، والتذييل يمكن تعريفها جميعا بوضوح.
CSS: تخطيط صفحة الهبوط
.landing {
display: grid;
grid-template-areas:
"hero hero"
"feature-l feature-r"
"stats stats"
"cta cta"
"footer footer";
grid-template-columns: 1fr 1fr;
grid-template-rows: 90vh auto auto auto auto;
gap: 0;
}
.hero { grid-area: hero;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: #0f0c29;
color: white;
text-align: center;
padding: 60px 20px; }
.feature-l { grid-area: feature-l;
padding: 80px 40px;
background: #f8f9fa; }
.feature-r { grid-area: feature-r;
padding: 80px 40px;
background: #ffffff; }
.stats { grid-area: stats;
display: grid;
grid-template-columns: repeat(4, 1fr);
text-align: center;
padding: 60px 20px;
background: #1a1a2e;
color: white; }
.cta { grid-area: cta;
text-align: center;
padding: 80px 20px;
background: linear-gradient(135deg, #667eea, #764ba2);
color: white; }
.land-footer { grid-area: footer;
padding: 40px;
background: #0f0c29;
color: #999; }
@media (max-width: 768px) {
.landing {
grid-template-areas:
"hero"
"feature-l"
"feature-r"
"stats"
"cta"
"footer";
grid-template-columns: 1fr;
grid-template-rows: 80vh auto auto auto auto auto;
}
.stats {
grid-template-columns: repeat(2, 1fr);
}
}
الوصولية: الترتيب المرئي مقابل ترتيب DOM
واحدة من اهم الاعتبارات عند استخدام grid-template-areas هي العلاقة بين الترتيب المرئي (ما يراه المستخدم) وترتيب DOM (الترتيب الذي تظهر فيه العناصر في HTML). الشبكة تسمح لك باعادة ترتيب العناصر بصريا بحرية، لكن قارئات الشاشة والتنقل بلوحة المفاتيح يتبعان ترتيب DOM وليس الترتيب المرئي.
هذا يعني انه اذا استخدمت مناطق القالب لوضع عنصر تنقل بصريا اسفل المحتوى الرئيسي، فان مستخدم قارئ الشاشة سيصادف التنقل اولا اذا كان اولا في HTML. هذا قد يكون مفيدا -- التنقل مهم منطقيا ويجب ان يكون متاحا مبكرا. لكنه قد يكون ايضا مشكلة اذا تباعد الترتيب المرئي والمنطقي بشكل كبير، مما يسبب ارتباكا لمستخدمي لوحة المفاتيح الذين يتنقلون بمفتاح Tab عبر العناصر بترتيب DOM بينما يرونها بترتيب مرئي مختلف.
مثال: الحفاظ على ترتيب DOM المنطقي
<!-- جيد: ترتيب DOM منطقي -->
<div class="page">
<header>...</header> <!-- الاول في DOM، يعرض في الاعلى -->
<nav>...</nav> <!-- الثاني في DOM، يعرض كشريط جانبي -->
<main>...</main> <!-- الثالث في DOM، يعرض كمحتوى رئيسي -->
<aside>...</aside> <!-- الرابع في DOM، يعرض كشريط جانبي ايمن -->
<footer>...</footer> <!-- الخامس في DOM، يعرض في الاسفل -->
</div>
<!-- الترتيب المرئي عبر grid-template-areas: -->
<!-- header header header -->
<!-- nav main aside -->
<!-- footer footer footer -->
<!-- هذا جيد لان ترتيب DOM صحيح منطقيا -->
نمط متقدم: شبكات متداخلة مع مناطق القالب
مناطق القالب تعمل بشكل جميل في سياقات الشبكة المتداخلة. عنصر شبكة يوضع في منطقة مسماة يمكن ان يصبح هو نفسه حاوية شبكة بمناطق قالب خاصة به. هذا النمط ضروري للواجهات المعقدة مثل لوحات التحكم حيث كل قسم له تخطيط داخلي خاص به.
مثال: مناطق قالب متداخلة
/* الشبكة الخارجية: تخطيط الصفحة */
.page {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr 50px;
min-height: 100vh;
}
/* الشبكة الداخلية: منطقة المحتوى الرئيسية لها شبكتها الخاصة */
.main-content {
grid-area: main;
display: grid;
grid-template-areas:
"chart chart stats"
"table table table";
grid-template-columns: 1fr 1fr 300px;
grid-template-rows: 350px 1fr;
gap: 20px;
padding: 20px;
}
.chart-section { grid-area: chart; }
.stats-panel { grid-area: stats; }
.data-table { grid-area: table; }
اختصار grid-template
يوفر CSS Grid خاصية مختصرة تسمى grid-template تجمع بين grid-template-rows و grid-template-columns و grid-template-areas في تصريح واحد. بينما هذا اكثر اختصارا، قد يكون اصعب في القراءة للتخطيطات المعقدة.
مثال: استخدام اختصار grid-template
/* النسخة المطولة */
.container {
display: grid;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
grid-template-rows: 80px 1fr 60px;
grid-template-columns: 200px 1fr 200px;
}
/* النسخة المختصرة -- احجام الصفوف تاتي بعد كل نص منطقة */
.container {
display: grid;
grid-template:
"header header header" 80px
"nav main aside" 1fr
"footer footer footer" 60px
/ 200px 1fr 200px;
}
في الاختصار، كل نص صف يتبعه حجم مسار الصف، وبعد الصف الاخير، شرطة مائلة (/) تقدم احجام مسارات الاعمدة. هذا مضغوط لكنه قد يصبح مرهقا مع العديد من الاعمدة.
مثال عملي: تخطيط بنمط المجلة
لنبني تخطيط معقد بنمط المجلة يوضح الامكانات الكاملة لمناطق القالب. هذا التخطيط يحتوي على مقالة بطل كبيرة، وقصص مميزة اصغر، وشريط جانبي، وشبكة محتوى.
CSS: تخطيط المجلة
.magazine {
display: grid;
grid-template-areas:
"hero hero hero promo"
"story1 story2 story3 promo"
"trending trending sidebar sidebar"
"trending trending sidebar sidebar";
grid-template-columns: 1fr 1fr 1fr 300px;
grid-template-rows: 500px 250px auto auto;
gap: 16px;
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
.hero-article { grid-area: hero;
background-size: cover;
background-position: center;
border-radius: 12px;
display: flex;
align-items: flex-end;
padding: 30px; }
.promo-sidebar { grid-area: promo;
background: #f8f9fa;
border-radius: 12px;
padding: 20px; }
.story-1 { grid-area: story1; }
.story-2 { grid-area: story2; }
.story-3 { grid-area: story3; }
.trending { grid-area: trending; }
.sidebar { grid-area: sidebar; }
@media (max-width: 1024px) {
.magazine {
grid-template-areas:
"hero hero"
"story1 story2"
"story3 promo"
"trending trending"
"sidebar sidebar";
grid-template-columns: 1fr 1fr;
grid-template-rows: 350px auto auto auto auto;
}
}
@media (max-width: 640px) {
.magazine {
grid-template-areas:
"hero"
"story1"
"story2"
"story3"
"promo"
"trending"
"sidebar";
grid-template-columns: 1fr;
}
}
اعتبارات الاداء
مناطق الشبكة المسماة ليس لها تاثير كبير على الاداء مقارنة بالتموضع القائم على الخطوط. يحل المتصفح اسماء المناطق الى ارقام خطوط خلال مرحلة حساب التخطيط، والتي تحدث بسرعة فائقة. ومع ذلك، ضع في اعتبارك هذه الممارسات الافضل:
- تجنب الشبكات المتداخلة بعمق مع مناطق القالب الا عند الضرورة. كل شبكة متداخلة تضيف تمريرة حساب تخطيط.
- حافظ على هياكل شبكتك مسطحة قدر الامكان للاداء الامثل.
- عندما تسبب الرسوم المتحركة او الانتقالات تغييرات في التخطيط، تعيد الشبكة الحساب. تحريك الخصائص التي تحفز التخطيط (مثل احجام مسارات الشبكة) قد يكون مكلفا. فضل تحريك التحويلات والشفافية بدلا من ذلك.
- مناطق القالب تحل مرة واحدة خلال التخطيط، لذا تغييرها ديناميكيا عبر JavaScript ليس اكثر تكلفة من تغيير اي خاصية شبكة اخرى.
الاخطاء الشائعة وتصحيح الاخطاء
اليك الاخطاء الاكثر شيوعا التي يرتكبها المطورون مع مناطق القالب وكيفية اصلاحها:
الخطا 1: مناطق غير مستطيلة
/* معطل -- "content" ليست مستطيلة */
grid-template-areas:
"header content"
"sidebar sidebar"
"content footer"; /* "content" تظهر منفصلة! */
/* مصحح -- كل منطقة تشكل مستطيلا */
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
الخطا 2: اسماء grid-area غير متطابقة
/* الحاوية تعرف "nav" */
grid-template-areas:
"header header"
"nav content";
/* معطل -- خطا مطبعي في اسم grid-area */
.navigation { grid-area: navigation; } /* يجب ان يكون "nav" */
/* مصحح */
.navigation { grid-area: nav; }
الخطا 3: اطوال صفوف غير متساوية
/* معطل -- الصف الاول يحتوي على 3 رموز والثاني على 2 */
grid-template-areas:
"header header header"
"sidebar content";
/* مصحح -- كل الصفوف تحتوي على 3 رموز */
grid-template-areas:
"header header header"
"sidebar content content";
تمرين عملي
التمرين 1: انشئ تخطيط صفحة معرض اعمال باستخدام grid-template-areas. التخطيط يجب ان يحتوي على راس يمتد بالعرض الكامل، وقسم بطل يمتد بالعرض الكامل، وقسم بعمودين مع بطاقات المشاريع على اليسار وقسم حول على اليمين، وتذييل يمتد بالعرض الكامل. اجعله متجاوبا: على الهاتف، كل شيء يجب ان يتكدس في عمود واحد.
التمرين 2: ابني تخطيط صفحة منتج تجارة الكترونية. نسخة سطح المكتب يجب ان تحتوي على صورة المنتج على اليسار (تمتد صفين)، وعنوان وسعر المنتج في الاعلى الايمن، ووصف المنتج والمراجعات في الاسفل الايمن، والمنتجات ذات الصلة تمتد بالعرض الكامل في الاسفل. استخدم 3 نقاط توقف على الاقل لجعله متجاوبا بالكامل. اختبر تخطيطك بتغيير حجم المتصفح وتاكد من انه يتكيف بسلاسة.
التمرين 3: خذ تخطيطا موجودا بنيته باستخدام Flexbox او تموضع الشبكة القائم على الخطوط واعد كتابته باستخدام grid-template-areas. قارن قابلية قراءة النهجين. ايهما اسهل في الفهم بنظرة واحدة؟ ايهما اسهل في التعديل لحجم شاشة مختلف؟