FA-TOOLS — Header Component
آموزش استفاده از CSS Subgrid برای تراز کردن فرم‌ها و کامپوننت‌های پیچیده

آموزش استفاده از CSS Subgrid برای تراز کردن فرم‌ها و کامپوننت‌های پیچیده

🗺️ نقشه راه: Subgrid در یک نگاه

رفیق برنامه‌نویس، آماده‌ای تا چیدمان‌های پیچیده‌ات رو متحول کنی؟ Subgrid یه ابزار فوق‌العاده‌ست که اومده تا دردسرهای تراز کردن عناصر داخلیِ گرید رو تموم کنه. بیا ببینیم قراره چی یاد بگیریم:


  • Subgrid چیه؟ – معرفی این رفیق جدیدمون و اینکه چرا بهش نیاز داریم.
  • 💡
    چطور کار می‌کنه؟ – قوانین بازی و سینتکس (Syntax) ساده‌اش.
  • 🚀
    کاربردها: – تراز کردن فرم‌ها و کامپوننت‌های تو در تو (Nested) بدون عرق ریختن!
  • 🛠️
    مثال‌های عملی: – از صفر تا صد با کدنویسی، از HTML تا CSS.

  • عیب‌یابی: – راه حل مشکلات رایج و چالش‌ها.

با این نقشه راه، قراره از یه چیدمان بهم ریخته به یه طراحی تمیز و دقیق برسیم. بزن بریم!

سلام رفیق برنامه‌نویس! اگه تا حالا با CSS Grid کار کرده باشی، می‌دونی چقدر قدرتمنده. می‌تونه چیدمان‌های پیچیده رو برات مثل آب خوردن بسازه. اما حتماً با این مشکل هم برخورد کردی که وقتی یه عنصر رو داخل یه سلول Grid قرار می‌دی و اون عنصر خودش یه Grid جداگانه داره، دیگه نمی‌تونی آیتم‌های داخلی اون رو با Grid اصلی تراز کنی. اینجا بود که دغدغه‌ای بزرگ برای توسعه‌دهنده‌ها شکل گرفت! همین الان می‌تونی برای ابزارهای حرفه‌ای‌تر برنامه‌نویسی و کدهای آماده جذاب، یه سر به فروشگاه ابزارهای ما بزنی و از کلی اسنیپت و سورس مفید بهره‌مند بشی.

Subgrid اومده تا این مشکل رو برای همیشه حل کنه. با Subgrid، یه عنصر گرید شده می‌تونه ردیف‌ها و ستون‌های گرید والدش رو به ارث ببره و آیتم‌های داخلی خودش رو دقیقاً با همون خطوط تراز کنه. یعنی دیگه لازم نیست برای هر لایه، محاسبات جداگانه و پیچیده انجام بدی. این یعنی طراحی‌های رسپانسیو (Responsive) و تمیز، بدون نیاز به کلی کد اضافی و هک‌های CSS. این قابلیت مخصوصاً وقتی به کار می‌اد که داری روی فرم‌های طولانی، کامپوننت‌های کارتی (Card Components) تو در تو یا داشبوردهای شلوغ کار می‌کنی. آماده‌ای که وارد دنیای هیجان‌انگیز Subgrid بشیم و چیدمان‌هات رو یک پله ارتقا بدی؟

Subgrid چیه و چرا باید ازش استفاده کنیم؟

آموزش استفاده از CSS Subgrid برای تراز کردن فرم‌ها و کامپوننت‌های پیچیده — تصویر 2

قبل از Subgrid، اگه یه عنصر رو display: grid; می‌کردیم، می‌تونستیم اون رو توی یکی از سلول‌های گرید والدش قرار بدیم. اما اگه اون عنصر خودش هم یه گرید داخلی داشت، آیتم‌های داخلش فقط نسبت به خودش تراز می‌شدن. یعنی خطوط گرید داخلی و خارجی کاملاً مستقل از هم بودن. این وضعیت باعث می‌شد برای تراز کردن دقیق عناصر در سطوح مختلف، مجبور به استفاده از مارجین‌های منفی، پوزیشن‌های مطلق، یا حتی محاسبات جاوااسکریپتی بشیم که همه اینا کد رو پیچیده و نگهداریش رو سخت‌تر می‌کرد.

🧐 مشکل قبل از Subgrid

تصور کن یه کانتینر (Container) اصلی داری که با Grid چند ستونه چیده شده. حالا داخل یکی از ستون‌های این کانتینر، یه کامپوننت کارت (Card Component) داری که اون هم خودش باید محتواش رو به صورت Grid چیدمان کنه (مثلاً عکس، عنوان، متن و دکمه). بدون Subgrid، ستون‌های داخلی کارت نمی‌تونن با ستون‌های گرید اصلی کانتینر هم‌تراز بشن. این یعنی اگه بخوای مثلاً عنوان همه کارت‌ها در یک خط عمودی قرار بگیره، کارت‌هایی که داخل ستون‌های مختلف Grid اصلی هستن، دیگه با هم تراز نیستن.

Subgrid دقیقاً اینجا وارد بازی می‌شه. وقتی به یه گرید داخلی می‌گی grid-template-columns: subgrid; یا grid-template-rows: subgrid;، اون گرید دیگه برای خودش خطوط جدیدی ایجاد نمی‌کنه، بلکه از خطوط گرید والدش برای تراز کردن آیتم‌های خودش استفاده می‌کنه. به این ترتیب، می‌تونی یه هماهنگی بی‌نظیر بین لایه‌های مختلف چیدمانت ایجاد کنی. این قابلیت خصوصاً برای چیدمان‌های ماژولار و سیستمی فوق‌العاده کاربردیه.

چطور با Subgrid کار کنیم؟ سینتکس و مفهوم پایه

آموزش استفاده از CSS Subgrid برای تراز کردن فرم‌ها و کامپوننت‌های پیچیده — تصویر 3

استفاده از Subgrid خیلی هم سخت نیست و بیشتر شبیه به فعال کردن یه ویژگی جدیده. بیا باهم قدم به قدم پیش بریم.

۱. گرید والد (Parent Grid) رو بساز

اول از همه، یه کانتینر اصلی نیاز داری که display: grid; باشه و خطوط (Tracks) خودش رو تعریف کرده باشه. این خطوط، همون خطوطی هستن که Subgrid قراره ازشون به ارث ببره.

⚡ مثال HTML برای گرید والد

[Click to Copy]
<div class="parent-grid">
    <div class="grid-item">
        <!-- اینجا Subgrid ما قرار می‌گیره -->
        <div class="subgrid-container">
            <div class="subgrid-item">عنوان ۱</div>
            <div class="subgrid-item">متن ۱</div>
            <div class="subgrid-item">دکمه ۱</div>
        </div>
    </div>
    <div class="grid-item">
        <div class="subgrid-container">
            <div class="subgrid-item">عنوان ۲</div>
            <div class="subgrid-item">متن ۲</div>
            <div class="subgrid-item">دکمه ۲</div>
        </div>
    </div>
    <div class="grid-item">
        <div class="subgrid-container">
            <div class="subgrid-item">عنوان ۳</div>
            <div class="subgrid-item">متن ۳ طولانی‌تر</div>
            <div class="subgrid-item">دکمه ۳</div>
        </div>
    </div>
</div>

⚡ مثال CSS برای گرید والد

[Click to Copy]
.parent-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr); /* 3 ستون با عرض یکسان */
    gap: 20px; /* فاصله بین آیتم‌های گرید */
    padding: 20px;
    border: 2px solid #3498db;
    background-color: #ecf0f1;
}

.grid-item {
    background-color: #ffffff;
    border: 1px solid #ccc;
    padding: 15px;
    border-radius: 5px;
    /* این آیتم، خودش یه کانتینر Subgrid خواهد بود */
}

۲. گرید فرزند رو به Subgrid تبدیل کن

حالا نوبت اون عنصریه که داخل یکی از سلول‌های گرید والد قرار گرفته و می‌خوایم خودش هم یه گرید باشه، اما از خطوط والدش استفاده کنه. این عنصر رو display: grid; می‌کنی و بعد به جای تعریف ردیف‌ها یا ستون‌ها با fr یا px، از کلمه کلیدی subgrid استفاده می‌کنی.

⚡ مثال CSS برای Subgrid

در این مثال، .subgrid-container که داخل .grid-item (آیتم گرید والد) قرار گرفته، خودش یه گرید می‌شه و ستون‌های گرید والد رو به ارث می‌بره.

[Click to Copy]
.subgrid-container {
    display: grid;
    /* اینجاست که جادو اتفاق می‌افته! */
    grid-template-columns: subgrid; 
    /* اگر گرید والدت دارای ردیف هم هست، می‌تونی از 'grid-template-rows: subgrid;' هم استفاده کنی. */
    grid-column: 1 / span 3; /* یا هر تعداد ستونی که آیتم والد اشغال کرده */
    /* اینجا می‌گیم این Subgrid، سه ستون از گرید والدش رو اشغال کنه */
    
    gap: 5px; /* می‌تونی برای Subgrid هم گپ (gap) جداگانه داشته باشی */
    border: 1px dashed #6c757d;
    padding: 10px;
    margin-top: 10px;
}

.subgrid-item {
    background-color: #e0f2f7;
    padding: 8px;
    border: 1px solid #b3e5fc;
    border-radius: 3px;
    text-align: center;
    font-size: 0.9em;
}

نکته مهم: grid-column یا grid-row روی عنصر .subgrid-container، باید مشخص کنه که اون عنصر چه تعداد ستون (یا ردیف) از گرید والد رو اشغال کرده. این کار به Subgrid می‌فهمونه که قراره از کدوم بخش خطوط گرید والد استفاده کنه.

کاربردهای طلایی Subgrid: فرم‌ها و کامپوننت‌های تو در تو

حالا که با مفهوم Subgrid آشنا شدی، بیا ببینیم کجاها می‌تونه حسابی کارمون رو راحت کنه و چیدمان‌های پیچیده رو برامون شیرین‌تر کنه.

۱. تراز کردن فرم‌های پیچیده

فرم‌ها یکی از بهترین سناریوها برای Subgrid هستن. فرض کن یه فرم چند ستونه داری که هر سطرش شامل لیبل و اینپوت‌های مختلفه. اگه بخوای لیبل‌ها همه در یک ستون و اینپوت‌ها همه در ستون بعدی باشن، ولی هر گروه از لیبل و اینپوت خودشون داخل یه فیلدست (Fieldset) یا یه div جداگانه باشن، Subgrid معجزه می‌کنه.

🛠️ مثال: فرم با لیبل‌ها و اینپوت‌های هم‌تراز

[Click to Copy]
<form class="form-grid">
    <div class="form-group">
        <label for="name">نام:</label>
        <input type="text" id="name" placeholder="نام خود را وارد کنید">
    </div>
    <div class="form-group">
        <label for="email">ایمیل:</label>
        <input type="email" id="email" placeholder="ایمیل شما">
    </div>
    <div class="form-group">
        <label for="address">آدرس:</label>
        <input type="text" id="address" placeholder="آدرس پستی">
    </div>
    <button type="submit">ارسال فرم</button>
</form>

[Click to Copy]
.form-grid {
    display: grid;
    /* دو ستون برای کل فرم: یکی برای لیبل‌ها، یکی برای اینپوت‌ها */
    grid-template-columns: auto 1fr; 
    gap: 15px 10px; /* فاصله عمودی و افقی */
    max-width: 600px;
    margin: 30px auto;
    padding: 25px;
    border: 1px solid #b0c4de;
    border-radius: 8px;
    background-color: #e6eef6;
    box-shadow: 0 2px 10px rgba(0,0,0,0.08);
}

.form-group {
    display: grid; /* اینجا تبدیل به گرید داخلی میشه */
    grid-column: 1 / span 2; /* کل دو ستون گرید والد رو اشغال می‌کنه */
    grid-template-columns: subgrid; /* و خطوط گرید والد رو به ارث می‌بره */
    /* gap: 10px; نیازی به گپ داخلی نیست چون لیبل و اینپوت مستقیماً با گرید اصلی تراز میشن */
}

.form-group label {
    grid-column: 1; /* لیبل در ستون اول گرید والد قرار می‌گیره */
    font-weight: bold;
    color: #444;
    align-self: center; /* تراز عمودی در مرکز سلول */
}

.form-group input {
    grid-column: 2; /* اینپوت در ستون دوم گرید والد قرار می‌گیره */
    width: 100%;
    padding: 8px 12px;
    border: 1px solid #ccc;
    border-radius: 4px;
    font-size: 1em;
}

.form-grid button {
    grid-column: 2; /* دکمه در ستون دوم قرار می‌گیره */
    justify-self: end; /* تراز به سمت راست */
    padding: 10px 20px;
    background-color: #28a745;
    color: white;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    font-size: 1.1em;
    transition: background-color 0.3s ease;
}

.form-grid button:hover {
    background-color: #218838;
}

تو این مثال، هر .form-group خودش یه گرید هست و grid-template-columns: subgrid; باعث می‌شه لیبل‌ها و اینپوت‌ها در تمام سطرها دقیقاً با خطوط گرید والد (.form-grid) هم‌تراز بشن. دیگه لازم نیست نگران طول لیبل‌ها یا بهم ریختگی چیدمان باشی.

برای دیدن نمونه‌های بیشتری از اسنیپت‌های CSS کاربردی، می‌تونی سری به اینجا بزنی.

۲. کامپوننت‌های کارتی (Card Components) و داشبوردها

تصور کن یه داشبورد داری با چند ردیف کارت اطلاعاتی. هر کارت خودش شامل تصویر، عنوان، توضیحات و چند دکمه عملگره. اگه بخوای عنوان همه کارت‌ها، توضیحات همه کارت‌ها و دکمه‌ها در یک راستا باشن (حتی اگه کارت‌ها در ستون‌های مختلف گرید اصلی باشن)، Subgrid بهترین راه حله.

🛠️ مثال: کارت‌های هم‌تراز

[Click to Copy]
<div class="dashboard">
    <div class="card">
        <img src="https://via.placeholder.com/150" alt="Card Image 1" class="card-image">
        <div class="card-content">
            <h3>عنوان کارت ۱</h3>
            <p>متن کوتاه برای توضیحات این کارت جذاب.</p>
            <a href="#" class="card-button">بیشتر بدانید</a>
        </div>
    </div>
    <div class="card">
        <img src="https://via.placeholder.com/150" alt="Card Image 2" class="card-image">
        <div class="card-content">
            <h3>عنوان کارت دوم با متن طولانی‌تر</h3>
            <p>اینجا توضیحات بیشتری داریم برای این کارت که ببینیم چطور Subgrid کمک می‌کنه.</p>
            <a href="#" class="card-button">دیدن جزئیات</a>
        </div>
    </div>
    <div class="card">
        <img src="https://via.placeholder.com/150" alt="Card Image 3" class="card-image">
        <div class="card-content">
            <h3>کارت ۳</h3>
            <p>متن خیلی کوتاهی برای تست تراز بندی. عالیه نه؟</p>
            <a href="#" class="card-button">برو بریم</a>
        </div>
    </div>
</div>

[Click to Copy]
.dashboard {
    display: grid;
    grid-template-columns: repeat(3, 1fr); /* سه ستون برای داشبورد اصلی */
    grid-template-rows: auto auto auto; /* سه ردیف برای محتوای کارت‌ها (عنوان، متن، دکمه) */
    gap: 20px;
    padding: 30px;
    background-color: #f9f9f9;
    border-radius: 10px;
    box-shadow: 0 4px 15px rgba(0,0,0,0.05);
}

.card {
    background-color: #ffffff;
    border: 1px solid #e0e0e0;
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0,0,0,0.05);
    display: grid; /* هر کارت خودش یه گرید میشه */
    grid-column: span 1; /* یک ستون از گرید والد رو اشغال می‌کنه */
    grid-row: span 3; /* تمام ردیف‌های مربوط به محتوای کارت رو اشغال می‌کنه */
    grid-template-rows: subgrid; /* ردیف‌های گرید والد رو به ارث می‌بره */
    padding-bottom: 15px; /* کمی فضای خالی پایین کارت */
}

.card-image {
    width: 100%;
    height: 150px;
    object-fit: cover;
    grid-row: 1; /* تصویر در ردیف اول گرید اصلی قرار می‌گیره */
}

.card-content {
    padding: 0 20px; /* پدینگ برای محتوا داخل کارت */
    display: contents; /* مهم: این عنصر خودش محتوای گرید نیست، بلکه فرزندانش هستند */
}

.card-content h3 {
    grid-row: 2; /* عنوان در ردیف دوم گرید اصلی */
    margin-top: 15px;
    margin-bottom: 10px;
    font-size: 1.3em;
    color: #333;
}

.card-content p {
    grid-row: 3; /* متن در ردیف سوم گرید اصلی */
    margin-bottom: 15px;
    color: #555;
    font-size: 0.95em;
    line-height: 1.6;
}

.card-content .card-button {
    grid-row: 4; /* دکمه در ردیف چهارم گرید اصلی */
    display: inline-block;
    padding: 8px 15px;
    background-color: #007bff;
    color: white;
    text-decoration: none;
    border-radius: 5px;
    font-size: 0.9em;
    transition: background-color 0.3s ease;
    justify-self: start; /* تراز به سمت چپ */
    margin-left: 20px;
}

.card-content .card-button:hover {
    background-color: #0056b3;
}

تو این سناریو، .dashboard گرید اصلی ماست که سه ردیف و سه ستون رو تعریف کرده. هر .card خودش یه گرید هست که از ردیف‌های گرید والد با grid-template-rows: subgrid; استفاده می‌کنه. با این کار، عنوان، توضیحات و دکمه‌های هر سه کارت دقیقاً با هم در یک خط افقی قرار می‌گیرن، حتی اگه محتواشون اندازه‌های مختلفی داشته باشه.

اگه علاقه‌مند به یادگیری بیشتر در زمینه اسنیپت‌های HTML هستی، می‌تونی سری به این بخش بزنی.

جدول: مقایسه Grid معمولی و Subgrid

برای اینکه تفاوت رو بهتر لمس کنی، بیا یه مقایسه سریع داشته باشیم:

ویژگی CSS Grid (معمولی)
تعریف خطوط گرید داخلی هر گرید داخلی، خطوط (Tracks) خودش رو به صورت مستقل تعریف می‌کنه.
تراز با گرید والد آیتم‌های گرید داخلی، نمی‌تونن با خطوط گرید والد تراز بشن.
پیچیدگی چیدمان چندلایه برای تراز کردن عناصر در سطوح مختلف، نیاز به محاسبات دستی، margin/positionhack، یا جاوااسکریپت.
مدیریت چیدمان مدیریت سخت‌تر در چیدمان‌های پیچیده و رسپانسیو.

✨ جدول: مزایای Subgrid

این قابلیت جدید، همزمان با Grid معمولی مورد استفاده قرار می‌گیره تا قدرتش رو دو چندان کنه:

ویژگی CSS Subgrid
تعریف خطوط گرید داخلی خطوط گرید والد رو به ارث می‌بره و از اون‌ها برای تراز کردن آیتم‌هاش استفاده می‌کنه.
تراز با گرید والد آیتم‌های گرید داخلی، مستقیماً با خطوط گرید والد تراز میشن.
پیچیدگی چیدمان چندلایه سادگی بی‌نظیر در چیدمان‌های پیچیده و حفظ هم‌ترازی در تمام سطوح.
مدیریت چیدمان کد تمیزتر، نگهداری آسان‌تر و رسپانسیو بهتر.

نکات مهم و بهترین شیوه‌ها (Best Practices)

مثل هر قابلیت جدیدی، Subgrid هم نکات و بهترین شیوه‌های خودشو داره که بهتره حواسمون بهشون باشه:

۱. پشتیبانی مرورگرها

پشتیبانی از Subgrid در مرورگرها روز به روز بهتر می‌شه. فایرفاکس (Firefox) مدت‌هاست که ازش پشتیبانی می‌کنه و کروم (Chrome) و سافاری (Safari) هم به تازگی به جمع پشتیبانی‌کننده‌ها پیوستن. با این حال، همیشه خوبه که قبل از استفاده در پروژه‌های بزرگ و تولیدی، سایت Can I use… رو بررسی کنی تا مطمئن بشی مرورگرهای هدف پروژت این قابلیت رو پشتیبانی می‌کنن. برای مرورگرهایی که هنوز از Subgrid پشتیبانی نمی‌کنن، باید یه فال‌بک (Fallback) مناسب با استفاده از Grid عادی یا فلکس‌باکس (Flexbox) در نظر بگیری.

۲. استفاده هوشمندانه از Subgrid

Subgrid برای حل مشکلات تراز کردن در لایه‌های تو در تو طراحی شده. ازش در مواقعی استفاده کن که واقعاً به هم‌ترازی دقیق آیتم‌های داخلی با خطوط گرید والد نیاز داری. برای چیدمان‌های ساده‌تر که نیاز به این سطح از هماهنگی ندارن، گرید معمولی یا حتی فلکس‌باکس هنوز هم انتخاب‌های خوبی هستن. تمرکز روی کدهای آماده و اسنیپت‌های مناسب برای هر موقعیت می‌تونه سرعتت رو بالا ببره.

۳. ترکیب با Grid Areas

می‌تونی Subgrid رو با grid-template-areas ترکیب کنی تا چیدمان‌های خواناتر و قابل نگهداری‌تری بسازی. اینجوری می‌تونی برای هر بخش از گریدت یه اسم بذاری و با Subgrid، آیتم‌های داخلی اون بخش رو هم راحت‌تر تراز کنی. مثلاً در طراحی یک وبسایت، هدر و فوتر و سایدبار و صفحه اصلی همگی می‌توانند از این قاعده پیروی کنند.

عیب‌یابی سریع (Troubleshooting)

هیچ کاری بدون چالش نیست! اگه توی مسیر استفاده از Subgrid به مشکل خوردی، این بخش رو بخون.

⚠️ مشکل: Subgrid کار نمی‌کنه!


  • راه حل ۱: مطمئن شو مرورگرت از Subgrid پشتیبانی می‌کنه. DevTools رو باز کن و ببین آیا خاصیت subgrid شناسایی شده یا نه.

  • راه حل ۲: عنصر والد display: grid; هست؟ Subgrid فقط روی آیتم‌های گرید کار می‌کنه که خودشون در یک گرید والد قرار گرفتن.

  • راه حل ۳: آیا grid-column یا grid-row روی عنصر Subgrid اعمال شده؟ باید مشخص کنی Subgrid از کدوم خطوط گرید والد استفاده کنه.

  • راه حل ۴: تعداد خطوطی که Subgrid از والد به ارث می‌بره رو درست مشخص کردی؟ مثلاً اگه grid-column: 1 / span 3; رو روی آیتم گرید والد (که خودش Subgrid هست) اعمال می‌کنی، Subgrid دقیقاً سه خط رو از والدش به ارث می‌بره.

💡 نکته: برای دیباگ بهتر از DevTools استفاده کن

مرورگرهای مدرن مثل کروم و فایرفاکس، ابزارهای دیباگ فوق‌العاده‌ای برای CSS Grid دارن. می‌تونی خطوط گرید رو ببینی، نام مناطق گرید رو نمایش بدی و دقیقاً متوجه بشی Subgrid داره چطور کار می‌کنه و آیا خطوط رو به درستی به ارث برده یا نه. این قابلیت‌ها بهت کمک می‌کنه سریع‌تر مشکلت رو پیدا و حل کنی. همین‌طور می‌تونی برای کارهای جاوااسکریپت و اسنیپت‌های مربوط به اون، به این بخش و برای وردپرس به این صفحه مراجعه کنی. اگه به اسنیپت‌های پایتون هم نیاز داشتی، اینجا منتظرته.

حرف آخر

خب، رفیق برنامه‌نویس! دیدی که Subgrid چقدر می‌تونه چیدمان‌های پیچیده، مخصوصاً فرم‌ها و کامپوننت‌های تو در تو رو آسون کنه. این قابلیت، یکی از بزرگترین پیشرفت‌ها در زمینه CSS Layout بعد از Grid اولیه هستش و بهت اجازه می‌ده طراحی‌های هم‌تراز، ماژولار و بسیار تمیزتری داشته باشی. دیگه لازم نیست برای هم‌ترازی آیتم‌های داخلی گرید با گرید اصلی، کلی کد اضافی بنویسی یا خودتو اذیت کنی.

با تمرین و استفاده از مثال‌هایی که دیدیم، خیلی زود به Subgrid مسلط می‌شی و می‌تونی اون رو توی پروژه‌هات به کار ببری. فراموش نکن که همیشه از اسنیپت‌ها و کدهای آماده استفاده کنی تا سرعت توسعه‌ات بیشتر بشه و کد باکیفیت‌تری بنویسی. دنیای CSS هر روز داره پیشرفت می‌کنه و Subgrid یه قدم بزرگ در این راهه. پس ازش نهایت استفاده رو ببر و چیدمان‌های فوق‌العاده‌ای بساز!

اگه سوالی داری یا نیاز به راهنمایی بیشتری داری، همین الان می‌تونی با ما تماس بگیری: 09202232789.

پرسش‌های متداول (FAQ)

❓ Subgrid دقیقاً چیه؟

Subgrid قابلیتی در CSS Grid است که به یک آیتم گرید اجازه می‌دهد خطوط (Tracks) گرید والد خودش را به ارث ببرد و آیتم‌های داخلی خودش را با آن خطوط تراز کند. این کار به هم‌ترازی دقیق عناصر در چیدمان‌های چندلایه کمک می‌کند.

❓ چه زمانی باید از Subgrid استفاده کنم؟

وقتی که نیاز داری آیتم‌های داخلی یک کامپوننت (مثلاً عناصر داخل یک کارت یا فیلدهای یک فرم) با خطوط گرید اصلی و بیرونی هم‌تراز شوند. برای مثال، تراز کردن لیبل‌ها و اینپوت‌ها در فرم‌های پیچیده یا محتوای کارت‌ها در یک داشبورد.

❓ آیا Subgrid جایگزین CSS Grid معمولی است؟

خیر، Subgrid یک مکمل برای CSS Grid است. شما همچنان از display: grid; برای تعریف گرید استفاده می‌کنید، و سپس از grid-template-columns: subgrid; یا grid-template-rows: subgrid; برای به ارث بردن خطوط گرید والد استفاده می‌کنید.

❓ چطور مطمئن شوم مرورگر از Subgrid پشتیبانی می‌کند؟

می‌توانید به وب‌سایت caniuse.com مراجعه کرده و وضعیت پشتیبانی Subgrid در مرورگرهای مختلف را بررسی کنید. همچنین با ابزارهای توسعه‌دهنده (DevTools) مرورگر خود می‌توانید ویژگی‌های CSS را بازرسی کنید.

آموزش استفاده از CSS Subgrid برای تراز کردن فرم‌ها و کامپوننت‌های پیچیده

طراحی فرم‌های چندستونه و کامپوننت‌های کارت‌شکلِ هماهنگ، همیشه یکی از بزرگ‌ترین چالش‌های طراحان فرانت‌اند بوده است. حتماً برای شما هم پیش آمده که بخواهید برچسب‌ها (Labels) و فیلدهای ورودی در ردیف‌های مختلف یک فرم، کاملاً در یک راستا تراز شوند، اما به دلیل تفاوت در طول متنِ برچسب‌ها، همه‌چیز به‌هم‌ریخته است. در گذشته برای حل این مشکل مجبور بودیم از پهنای ثابت (Fixed Width) یا کدهای پیچیده جاوااسکریپت استفاده کنیم. اما حالا با معرفی CSS Subgrid، این کابوس برای همیشه به پایان رسیده است. در این مقاله به صورت کاملاً عملی و کاربردی یاد می‌گیریم چطور از این ابزار قدرتمند برای ساخت رابط‌های کاربری بی‌نقص استفاده کنیم.

خلاصه پاسخ: CSS Subgrid چیست و چه کاربردی دارد؟

ویژگی CSS Subgrid به عناصر فرزند در یک سیستم گرید اجازه می‌دهد تا از ساختار ستون‌ها و ردیف‌های والد خود استفاده کنند. این قابلیت باعث می‌شود تا ترازنبدی عناصر فرزند (مانند برچسب‌ها و دکمه‌ها در ردیف‌های مختلف) به صورت کاملاً خودکار و هماهنگ با بقیه بخش‌های صفحه انجام شود، بدون اینکه نیاز به تعریف ساختار گرید جداگانه برای هر بخش باشد.

تصویر ذهنی: گرید معمولی در مقابل Subgrid

CSS Grid معمولی (مستقل)

در گرید معمولی، هر کارت یا ردیف فرم، یک گرید مستقل دارد. اگر متن یکی از برچسب‌ها طولانی‌تر شود، فقط همان کارت تغییر سایز می‌دهد و هماهنگی با کارت‌های مجاور از بین می‌رود.

عدم تراز افقی آیتم‌ها

CSS Subgrid (یکپارچه)

با فعال‌سازی ساب‌گرید، فرزندانِ فرزندِ گرید اصلی نیز از خطوط شبکه والد پیروی می‌کنند. تغییر سایز یک متن، بلافاصله تمام ردیف‌های مشابه در دیگر ستون‌ها را تراز می‌کند.

ترازنبدی کاملاً همزمان و پویا

۱. چرا به CSS Subgrid نیاز داریم؟ (مشکل فرم‌های سنتی)

در طراحی وب مدرن، فرم‌ها دیگر ستون‌های ساده و عمودی پشت‌سرهم نیستند. ما اغلب نیاز داریم فرم‌های چندستونه طراحی کنیم که در هر ستون، چندین فیلد ورودی به همراه برچسب‌ها و متون راهنما قرار دارند. اگر تا به حال تلاش کرده باشید چنین طرحی را با کدهای CSS استاندارد پیاده کنید، حتماً با مشکل تراز نبودن المان‌ها برخورد کرده‌اید.

زمانی که از ساختارهای تو در تو (Nested HTML) استفاده می‌کنید، هر گروه از المان‌ها (مانند یک ردیف فرم یا یک فیلد گروهی) به عنوان یک گرید کاملاً مستقل عمل می‌کند. این استقلال به این معنی است که ارتفاع یا عرضِ عناصر داخل گروه «الف» هیچ تاثیری بر اندازه عناصر داخل گروه «ب» ندارد. اینجاست که برای ایجاد تراز یکنواخت، کار سخت می‌شود. برای داشتن یک معماری تمیز، یادگیری ساختارهای مادر در تگ‌های HTML اولین قدم است تا بدانیم چگونه فرزندان را سازماندهی کنیم.

۲. مفهوم و نحوه کارکرد Subgrid به زبان ساده

به زبان بسیار ساده، Subgrid به شما اجازه می‌دهد ارزش‌های grid-template-columns یا grid-template-rows یک گرید فرزند را برابر با کلمه کلیدی subgrid قرار دهید. با این کار، گرید فرزند به جای ایجاد یک شبکه جدید، مستقیماً به شبکه والد خود متصل می‌شود و از ردیف‌ها یا ستون‌های آن استفاد می‌کند.

این ویژگی فوق‌العاده کاربردی به طراح این امکان را می‌دهد که ساختار تو در توی HTML خود را حفظ کند (که برای دسترسی‌پذیری یا Accessibility عالی است) و در عین حال، کنترل بصری کاملی روی هم‌ترازی تمام اجزا در سراسر صفحه داشته باشد.

۳. آموزش گام‌به‌گام طراحی یک فرم پیچیده با Subgrid

بیایید با یک مثال عملی پیش برویم. فرض کنید می‌خواهیم فرم ثبت‌نامی طراحی کنیم که شامل سه ستون بزرگ در دسکتاپ است. هر ستون شامل یک برچسب، یک فیلد ورودی و یک متن توضیحات کوتاه است. می‌خواهیم تمام برچسب‌ها با وجود طول متفاوت، دقیقاً ارتفاع یکسانی داشته باشند و ورودی‌ها کاملاً روبروی هم قرار بگیرند.

گام اول: ایجاد ساختار HTML

ابتدا کد HTML زیر را می‌نویسیم. توجه کنید که هر فیلد درون یک تگ wrapper با کلاس .form-group قرار گرفته است تا ساختار معنایی حفظ شود. برای دیدن ابزارهای آنلاین بیشتر می‌توانید به بخش تکه‌کدهای برنامه‌نویسی مراجعه کنید.

<div class="form-container">
  <!-- ستون اول -->
  <div class="form-group">
    <label>نام و نام خانوادگی کامل کاربر:</label>
    <input type="text" placeholder="مثال: علی رضایی" />
    <span class="help-text">نام باید مطابق با شناسنامه باشد.</span>
  </div>

  <!-- ستون دوم -->
  <div class="form-group">
    <label>ایمیل:</label>
    <input type="email" placeholder="email@example.com" />
    <span class="help-text">برای ارسال تاییدیه.</span>
  </div>

  <!-- ستون سوم -->
  <div class="form-group">
    <label>شماره تماس همراه برای هماهنگی بیشتر:</label>
    <input type="tel" placeholder="09123456789" />
    <span class="help-text">کد تایید پیامک خواهد شد.</span>
  </div>
</div>

گام دوم: تعریف گرید اصلی (Parent Grid)

حالا باید والد اصلی یعنی .form-container را به عنوان یک گرید سه ستونه تعریف کنیم. همچنین مشخص می‌کنیم که ردیف‌های ما به صورت ساب‌گرید رفتار کنند:

.form-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
  background-color: #ffffff;
  padding: 24px;
  border-radius: 12px;
}

گام سوم: فعال کردن Subgrid روی فرزندان

اکنون بخش جادویی کار فرا می‌رسد. هر کدام از کلاس‌های .form-group قرار است در یک ستون گرید والد قرار بگیرند، اما خودشان به صورت داخلی باید ردیف‌های خود را تراز کنند. برای این کار کدهای زیر را به استایل خود اضافه می‌کنیم:

.form-group {
  display: grid;
  /* اختصاص دادن این آیتم به ۳ ردیف گرید اصلی */
  grid-row: span 3;
  /* فعال‌سازی ساب‌گرید برای ردیف‌ها */
  grid-template-rows: subgrid;
  gap: 8px;
}

با نوشتن کد بالا، مرورگر متوجه می‌شود که هر .form-group سه ردیف از گرید اصلی را اشغال می‌کند. از آنجایی که مقدار grid-template-rows برابر subgrid قرار گرفته، المان‌های داخلی آن (یعنی label، input و span) دقیقاً روی ردیف‌های تعریف‌شده در والد اصلی تراز خواهند شد. دیگر فرقی نمی‌کند که طول متن برچسب یک خط باشد یا دو خط؛ همه آن‌ها در ردیف اول، ورودی‌ها در ردیف دوم و توضیحات در ردیف سوم به طور کاملاً هماهنگ قرار می‌گیرند.

۴. مقایسه روش‌های هم‌ترازی (جدول کاربردی)

برای اینکه درک بهتری از ارزش فنی CSS Subgrid پیدا کنید، در جدول زیر روش‌های مختلف ترازنبدی را با هم مقایسه کرده‌ایم تا به سادگی بهترین گزینه را انتخاب کنید:

روش ترازنبدی توضیحات و میزان کارایی
پایداری عرض/ارتفاع ثابت (Fixed-size) ساده‌ترین راه اما کاملاً غیراستاندارد. در صورت تغییر زبان سایت یا تغییر محتوای پویا، قالب کاملاً به هم می‌ریزد و برای موبایل مناسب نیست.
کدهای جاوااسکریپت (JS Calculations) محاسبه مداوم ارتفاع المان‌ها و اعمال بزرگترین ارتفاع. این روش علاوه بر کاهش کارایی وب‌سایت، باعث ایجاد پرش تصویر (Layout Shift) می‌شود که برای سئو مضر است. برای مدیریت بهتر کدهای داینامیک می‌توانید از راهنمای کدهای جاوا اسکریپت کمک بگیرید.
CSS Subgrid بهترین گزینه مدرن. کاملاً بومی، به شدت بهینه، ریسپانسیو و بدون نیاز به کوچکترین فریم‌ورک یا کد اضافی. ساختار درختی HTML دست‌نخورده باقی می‌ماند.

۵. تراز کردن کارت‌های محتوایی پیچیده

یکی دیگر از بخش‌هایی که ساب‌گرید در آن معجزه می‌کند، طراحی کارت‌های فروشگاهی یا وبلاگی است. تصور کنید کارت‌هایی دارید که شامل عنوان، تصویر شاخص، متن خلاصه و دکمه خرید هستند. اگر مایل به پیاده‌سازی این سیستم‌ها در وردپرس هستید، استفاده از پتانسیل‌های موجود در توسعه وردپرس به همراه تم‌های مدرن بلاک بسیار سودمند خواهد بود.

وقتی این کارت‌ها را در کنار هم در یک ردیف قرار می‌دهید، به صورت عادی هیچ دکمه‌ای با دکمه کارت کناری هم‌تراز نمی‌شود مگر اینکه متن خلاصه تمام کارت‌ها دقیقاً به یک اندازه باشد! اما با Subgrid می‌توانید به راحتی بگویید که دکمه‌های انتهای کارت همیشه در یک راستای افقی بی‌نظیر قرار بگیرند.

/* استایل کارت‌های محتوایی هم‌تراز */
.cards-wrapper {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  grid-template-rows: auto auto auto; /* سه بخش: هدر، بدنه، دکمه */
  gap: 30px;
}

.card-item {
  display: grid;
  grid-row: span 3;
  grid-template-rows: subgrid;
  background: #f8fafc;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  padding: 16px;
}

۶. سازگاری با مرورگرها و کدهای جایگزین (Fallback)

خوشبختانه امروزه تمامی مرورگرهای مدرن از جمله کروم، فایرفاکس، سافاری و اج به صورت کامل و ۱۰۰ درصدی از CSS Subgrid پشتیبانی می‌کنند. بنابراین با خیال راحت می‌توانید از آن در پروژه‌های صنعتی و تجاری خود استفاده کنید.

با این حال، برای اطمینان بیشتر و پشتیبانی از مرورگرهای فوق‌العاده قدیمی، می‌توانید از دستور @supports استفاده کنید تا در صورت عدم پشتیبانی، استایل‌های جایگزین به صورت خودکار اعمال شوند:

/* استایل پیش‌فرض برای مرورگرهای بسیار قدیمی */
.form-group {
  display: flex;
  flex-direction: column;
}

/* اعمال ساب‌گرید در صورت پشتیبانی مرورگر کاربر */
@supports (grid-template-rows: subgrid) {
  .form-group {
    display: grid;
    grid-row: span 3;
    grid-template-rows: subgrid;
  }
}

۷. عیب‌یابی سریع و رفع مشکلات رایج

حتی حرفه‌ای‌ترین طراحان هم در ابتدا ممکن است با چالش‌هایی روبرو شوند. در ادامه سه مشکل رایج در پیاده‌سازی ساب‌گرید و نحوه رفع سریع آن‌ها را آورده‌ایم:

مشکل ۱: ساب‌گرید کار نمی‌کند و چیدمان به هم ریخته است!

علت و راه‌حل: مطمئن شوید که والد مستقیم عنصری که ساب‌گرید گرفته است، خود عضوی از گرید اصلی باشد. همچنین حتماً باید مقدار grid-row یا grid-column آن را به تعداد اسپان‌های مشخصی (مثلاً span 3) محدود کرده باشید. بدون مشخص کردن تعداد ردیف‌ها، مرورگر نمی‌داند فرزند باید چند ردیف از گرید والد را در اختیار بگیرد.

مشکل ۲: فاصله‌ها (Gaps) با گرید اصلی هماهنگ نیستند

علت و راه‌حل: ساب‌گرید به طور خودکار مقدار gap گرید والد را به ارث می‌برد. اگر می‌خواهید فاصله فرزندان اختصاصی باشد، می‌توانید ویژگی gap را درون کلاس فرزند اورراید (Override) کنید، اما مراقب ترازنبدی کلی ساختار باشید.

مشکل ۳: مارجین‌ها و پدینگ‌ها ظاهر را زشت کرده‌اند

علت و راه‌حل: اضافه کردن پدینگ‌های ضخیم به عناصر ساب‌گرید ممکن است روی لبه‌های هم‌ترازی تأثیر بگذارد. پیشنهاد می‌شود پدینگ‌ها را تا حد امکان ساده نگه دارید و برای فضاسازی بزرگتر از تنظیمات grid-template-rows گرید اصلی استفاده نمایید.

۸. سوالات متداول (FAQ)

آیا تفاوت زیادی بین گرید تو در تو (Nested Grid) و ساب‌گرید وجود دارد؟

بله، تفاوت اصلی در این است که گرید تو در تو کاملاً از شبکه گرید والد خود بی‌خبر است و مستقل عمل می‌کند؛ در حالی که ساب‌گرید مستقیماً به ردیف‌ها و ستون‌های والد متصل شده و رفتاری کاملاً همزمان و هماهنگ دارد.

آیا ساب‌گرید بر سئو و دسترسی‌پذیری تاثیر منفی دارد؟

خیر، برعکس! این تکنولوژی به شما اجازه می‌دهد ساختار نشانه‌گذاری HTML خود را بسیار تمیز و معنایی نگه دارید بدون اینکه مجبور شوید برای حل مشکلات بصری، تگ‌های اضافی و بیهوده اضافه کنید. این موضوع برای موتورهای جستجو و ابزارهای صفحه‌خوان نابینایان بسیار عالی است.

چطور برای پروژه‌های پایتون یا فریم‌ورک‌های بک‌اند قالب‌های ساب‌گرید بنویسیم؟

فرانت‌اند کامپوننت‌های شما مستقل از بک‌اند اجرا می‌شود. شما می‌توانید خروجی HTML کدهای جنگو یا فلسک خود را دقیقاً با همین روش استایل‌دهی کنید. برای تسریع کار در بک‌اند، آشنایی با کدهای پایتون به شما در تولید تگ‌های داینامیک کمک شایانی خواهد کرد.

استفاده از CSS Subgrid یکی از بهترین تصمیات فنی است که می‌توانید برای پروژه‌های طراحی وب جدید خود بگیرید. این ویژگی کنترل بی‌سابقه‌ای بر ترازنبدی، زیبایی و انعطاف‌پذیری رابط‌های کاربری پیچیده به شما می‌دهد. همین امروز این کدها را روی فرم‌های خود اعمال کنید و از هماهنگی بی‌نظیر ستون‌ها و ردیف‌ها لذت ببرید!

Table of Contents

آخرین نوشته‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *