আগের পর্বে আমরা Flexbox দিয়ে বাস্তব layout বানানো শিখেছি। আজকে শিখবো CSS Grid — আরেকটা শক্তিশালী layout system, যেটা Flexbox থেকে একটা গুরুত্বপূর্ণ জায়গায় আলাদা।
Grid vs Flexbox — পার্থক্যটা কোথায়
Flexbox মূলত এক-মাত্রিক (1D) — মানে একবারে হয় একটা সারি, নাহয় একটা কলাম নিয়ে কাজ করে। কিন্তু Grid হলো দ্বি-মাত্রিক (2D) — একসাথে সারি ও কলাম দুটোই নিয়ন্ত্রণ করা যায়। তাই যখনই পেজে সত্যিকারের একটা "গ্রিড" বা টেবিলের মতো লেআউট দরকার হয় (যেমন ফটো গ্যালারি, ড্যাশবোর্ড), তখন Grid বেশি উপযোগী।
| Flexbox | Grid | |
|---|---|---|
| মাত্রা | ১D (সারি অথবা কলাম) | 2D (সারি ও কলাম একসাথে) |
| সবচেয়ে ভালো যেখানে | Navbar, একসারি কার্ড, centering | ফটো গ্যালারি, ড্যাশবোর্ড, পুরো পেজ লেআউট |
এই দুইটা একে অপরের প্রতিদ্বন্দ্বী না — বাস্তব প্রজেক্টে দুটোই একসাথে ব্যবহার হয়, যেখানে যেটা উপযুক্ত।
Grid শুরু করা
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 16px;
}
grid-template-columns দিয়ে বলা হয় কয়টা কলাম হবে আর প্রতিটার width কেমন হবে। fr মানে "fraction" — উপলব্ধ জায়গার একটা ভাগ। 1fr 1fr 1fr মানে তিনটা কলাম, প্রতিটা সমান সাইজের।
৬টা আইটেম, ৩ কলামের গ্রিডে — নিজে থেকেই ২ সারিতে ভাগ হয়ে গেছে
fr দিয়ে অসম কলাম বানানো
fr ভ্যালু বদলে অসমান-সাইজের কলামও বানানো যায়:
.layout {
display: grid;
grid-template-columns: 1fr 3fr; /* প্রথমটা ১ ভাগ, দ্বিতীয়টা ৩ ভাগ */
gap: 16px;
}
এখানে সাইডবার মোট জায়গার ১/৪ অংশ, আর মূল কন্টেন্ট ৩/৪ অংশ নিচ্ছে — এটা sidebar layout বানানোর আরেকটা কমন উপায় (আগের পর্বে আমরা এটা Flexbox দিয়েও করেছিলাম)।
repeat() দিয়ে কোড ছোট করা
একই সাইজের অনেকগুলো কলাম বারবার লেখার বদলে repeat() ব্যবহার করা যায়:
.container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 1fr 1fr 1fr এর সমান */
}
Responsive Grid — auto-fit ও minmax()
Grid-এর সবচেয়ে চমৎকার অংশ হলো — মিডিয়া কুয়েরি ছাড়াই responsive card গ্রিড বানানো সম্ভব:
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 16px;
}
এই একটা লাইন কী করছে তা ভেঙে বলি:
minmax(150px, 1fr)— প্রতিটা কলাম কমপক্ষে ১৫০px, সর্বোচ্চ যতটুকু জায়গা পাওয়া যায় ততটুকুauto-fit— যতগুলো কলাম স্ক্রিনে আঁটবে ততগুলোই বসাও, বাকিগুলো পরের সারিতে যাবে
ফলাফল — বড় স্ক্রিনে বেশি কলাম দেখাবে, ছোট স্ক্রিনে কম কলাম দেখাবে, স্বয়ংক্রিয়ভাবে — কোনো @media কুয়েরি ছাড়াই। পরের পর্বে যখন আমরা Media Query শিখবো, তখন এই পার্থক্যটা আরও পরিষ্কার হবে।
grid-template-rows
কলামের মতোই সারির উচ্চতাও নিয়ন্ত্রণ করা যায়:
.page {
display: grid;
grid-template-rows: 80px 1fr 60px; /* হেডার, মেইন, ফুটার */
height: 100vh;
}
এটা দিয়ে একটা পুরো পেজের কাঠামো বানানো যায় — হেডার সবসময় ৮০px, ফুটার সবসময় ৬০px, আর মাঝখানের মূল কন্টেন্ট বাকি সব জায়গা নিয়ে নেবে।
একটা সম্পূর্ণ উদাহরণ
<!DOCTYPE html>
<html lang="bn">
<head>
<meta charset="UTF-8">
<title>CSS Grid উদাহরণ</title>
<style>
.page {
display: grid;
grid-template-columns: 200px 1fr;
gap: 16px;
}
.sidebar {
background: #ede7f6;
padding: 16px;
}
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 12px;
}
.photo {
background: #b39ddb;
padding: 20px;
text-align: center;
border-radius: 6px;
}
</style>
</head>
<body>
<div class="page">
<div class="sidebar">সাইডবার</div>
<div class="gallery">
<div class="photo">১</div>
<div class="photo">২</div>
<div class="photo">৩</div>
<div class="photo">৪</div>
</div>
</div>
</body>
</html>
নিজে চেষ্টা করো
Exercise:
- একটা ৩-কলামের গ্রিড বানাও ৬টা আইটেম দিয়ে,
repeat()ব্যবহার করে auto-fitওminmax()দিয়ে একটা responsive photo gallery বানাও, তারপর ব্রাউজার উইন্ডো ছোট-বড় করে দেখো কী হয়grid-template-columns: 1fr 3frদিয়ে একটা sidebar layout বানাও
পরের পর্বে যা থাকছে
পর্ব ৯-এ আমরা শিখবো Media Query ও Responsive Design — mobile-first approach দিয়ে কীভাবে একটা পেজকে সব স্ক্রিন সাইজে সুন্দর দেখানো যায়, উদাহরণসহ।