آکادمی بنو/آموزش CSS

Attribute Selector و ترکیب Selectorها در CSS

بهنام نوبخت · ۱۴۰۵/۶/۲۸

تا اینجا با Selectorهای پایه مانند tag، class و id و همچنین Pseudo-Classها و Pseudo-Elementها آشنا شدیم. اما در پروژه‌های واقعی، گاهی انتخاب یک عنصر فقط بر اساس نام تگ یا کلاس کافی نیست. برای مثال ممکن است بخواهیم فقط فیلدهای ایمیل یک فرم را تغییر دهیم، فقط لینک‌هایی که در تب جدید باز می‌شوند را مشخص کنیم، یا فقط عناصری را انتخاب کنیم که یک Attribute خاص دارند.

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

در این مقاله ابتدا Attribute Selectorها را یاد می‌گیریم و سپس با Combinatorها آشنا می‌شویم تا بتوانیم Selectorهای دقیق‌تر و حرفه‌ای‌تری بنویسیم.

Attribute Selector چیست؟

در HTML، عناصر می‌توانند Attributeهای مختلفی داشته باشند:

<input type="text">
<input type="email" required>
<a href="https://example.com" target="_blank">مشاهده سایت</a>

در CSS می‌توانیم به جای انتخاب عنصر بر اساس class یا id، آن را بر اساس وجود یا مقدار یک Attribute انتخاب کنیم.

ساختار ساده Attribute Selector به شکل زیر است:

[attribute] {
    property: value;
}

مثلاً:

input[required] {
    border: 2px solid red;
}

این Selector تمام inputهایی را انتخاب می‌کند که Attribute به نام required دارند.

Attribute Selectorها می‌توانند بر اساس وجود Attribute، مقدار دقیق آن یا حتی بخشی از مقدار آن عمل کنند.

انتخاب بر اساس وجود Attribute

ساده‌ترین نوع Attribute Selector فقط بررسی می‌کند که یک Attribute وجود داشته باشد.

[required] {
    border-color: red;
}

مثلاً:

<input type="text" required>
<input type="email">
<input type="password" required>

در این مثال، دو فیلد اول و سوم که required دارند انتخاب می‌شوند.

می‌توانیم Selector را محدودتر کنیم:

input[required] {
    border-color: red;
}

در این حالت فقط inputهایی که required دارند انتخاب می‌شوند.

مثال کاربردی

input[disabled] {
    background-color: #eee;
}

این قانون تمام Inputهای غیرفعال را هدف قرار می‌دهد.

انتخاب بر اساس مقدار دقیق Attribute

اگر بخواهیم علاوه بر وجود Attribute، مقدار آن را نیز بررسی کنیم، از = استفاده می‌کنیم:

[attribute="value"] {
    property: value;
}

مثلاً:

input[type="email"] {
    border-color: blue;
}

HTML:

<input type="text">
<input type="email">
<input type="password">

در اینجا فقط Input نوع email انتخاب می‌شود.

مثال‌های کاربردی

input[type="text"] {
    background-color: #f5f5f5;
}
input[type="password"] {
    border-color: purple;
}
button[type="submit"] {
    cursor: pointer;
}

این روش برای فرم‌ها بسیار کاربردی است.

انتخاب لینک‌های خاص

فرض کنید می‌خواهیم فقط لینک‌هایی را انتخاب کنیم که در تب جدید باز می‌شوند:

a[target="_blank"] {
    color: orange;
}

HTML:

<a href="/about">درباره ما</a>

<a href="https://example.com" target="_blank">
    سایت خارجی
</a>

فقط لینک دوم انتخاب خواهد شد.

مثال دیگر:

a[rel="noopener"] {
    font-weight: bold;
}

انتخاب بر اساس ابتدای مقدار Attribute

گاهی مقدار Attribute دقیقاً مشخص نیست، اما می‌دانیم مقدار آن با یک عبارت خاص شروع می‌شود.

برای این کار از ^= استفاده می‌کنیم:

[attribute^="value"] {
    property: value;
}

مثلاً:

a[href^="https://"] {
    color: green;
}

این Selector لینک‌هایی را انتخاب می‌کند که مقدار href آن‌ها با https:// شروع می‌شود.

مثلاً:

<a href="https://example.com">لینک اول</a>
<a href="https://google.com">لینک دوم</a>
<a href="/about">لینک سوم</a>

دو لینک اول انتخاب می‌شوند.

انتخاب بر اساس انتهای مقدار Attribute

برای انتخاب عناصری که مقدار Attribute آن‌ها با یک عبارت مشخص تمام می‌شود، از $= استفاده می‌کنیم:

[attribute$="value"] {
    property: value;
}

مثلاً:

a[href$=".pdf"] {
    color: red;
}

این قانون لینک‌هایی را انتخاب می‌کند که به فایل PDF ختم می‌شوند.

<a href="/files/book.pdf">کتاب PDF</a>
<a href="/files/image.jpg">تصویر</a>
<a href="/files/report.pdf">گزارش PDF</a>

لینک اول و سوم انتخاب می‌شوند.

مثال دیگر:

img[src$=".png"] {
    border-radius: 10px;
}

انتخاب بر اساس وجود یک عبارت در مقدار Attribute

با *= می‌توانیم بررسی کنیم که یک عبارت در هر قسمت از مقدار Attribute وجود داشته باشد.

[attribute*="value"] {
    property: value;
}

مثلاً:

a[href*="google"] {
    color: blue;
}

این Selector لینک‌هایی را انتخاب می‌کند که در مقدار href آن‌ها عبارت google وجود داشته باشد.

مثلاً:

<a href="https://google.com">Google</a>
<a href="https://google.com/search">Search</a>
<a href="https://example.com">Example</a>

دو لینک اول انتخاب می‌شوند.

انتخاب یک کلمه مشخص در Attribute

Selector زیر:

[attribute~="value"]

زمانی استفاده می‌شود که مقدار Attribute شامل یک مقدار جداشده با فاصله باشد.

برای مثال:

<div class="card featured">...</div>
<div class="card">...</div>
<div class="featured-box">...</div>

می‌توان نوشت:

[class~="featured"] {
    border: 2px solid orange;
}

در این حالت عنصری که کلاس‌های card featured دارد انتخاب می‌شود، زیرا featured یکی از کلمات جداشده با فاصله در مقدار class است.

اما:

<div class="featured-box"></div>

با [class~="featured"] انتخاب نمی‌شود.

انتخاب مقدار با پیشوند جداشده توسط خط تیره

نوع دیگری نیز وجود دارد:

[attribute|="value"]

این حالت برای مقداری مناسب است که یا دقیقاً برابر با مقدار موردنظر باشد یا با آن مقدار و سپس یک - شروع شود.

برای مثال:

<div lang="fa"></div>
<div lang="fa-IR"></div>
<div lang="en"></div>

می‌توان نوشت:

[lang|="fa"] {
    font-family: sans-serif;
}

در این حالت fa و fa-IR با Selector مطابقت دارند.

این نوع Selector در بعضی سناریوهای مربوط به کد زبان‌ها کاربرد دارد، اما در پروژه‌های روزمره کمتر از =، ^=، $= و *= استفاده می‌شود.

خلاصه Attribute Selectorها

Selector

مفهوم

[attr]

Attribute وجود داشته باشد

[attr="value"]

مقدار دقیقاً برابر باشد

[attr^="value"]

مقدار با عبارت شروع شود

[attr$="value"]

مقدار با عبارت تمام شود

[attr*="value"]

عبارت در مقدار وجود داشته باشد

[attr~="value"]

یک کلمه مشخص در مقدار وجود داشته باشد

`[attr

="value"]`


ترکیب Attribute Selector با Selectorهای دیگر

یکی از نقاط قوت CSS این است که می‌توانیم Selectorها را با یکدیگر ترکیب کنیم.

مثلاً:

input[type="email"][required] {
    border-color: red;
}

این Selector فقط Inputهایی را انتخاب می‌کند که:

  1. input باشند.

  2. type="email" داشته باشند.

  3. required داشته باشند.

مثلاً:

<input type="email" required>

انتخاب می‌شود.

اما:

<input type="email">

انتخاب نمی‌شود، چون required ندارد.

ترکیب Class و Attribute

می‌توانیم Class و Attribute را نیز با هم ترکیب کنیم:

input.form-control[type="email"] {
    background-color: #f5f5f5;
}

مثلاً:

<input class="form-control" type="email">

انتخاب می‌شود.

اما:

<input class="form-control" type="text">

انتخاب نمی‌شود.

این روش زمانی مفید است که بخواهیم انتخاب خود را دقیق‌تر کنیم.

تفاوت [class="box"] با .box

این نکته بسیار مهم است.

فرض کنید HTML زیر را داریم:

<div class="box">محتوا</div>

هر دو Selector زیر آن را انتخاب می‌کنند:

.box {
    padding: 20px;
}

و:

[class="box"] {
    padding: 20px;
}

اما اگر HTML به شکل زیر تغییر کند:

<div class="box featured">محتوا</div>

Selector زیر همچنان آن را انتخاب می‌کند:

.box {
    padding: 20px;
}

اما این Selector دیگر با مقدار دقیق box مطابقت ندارد:

[class="box"] {
    padding: 20px;
}

بنابراین برای انتخاب یک Class معمولی، بهتر است از:

.box

استفاده کنیم.

و Attribute Selector را زمانی به کار ببریم که واقعاً می‌خواهیم بر اساس Attribute تصمیم بگیریم.

Attribute Selector در فرم‌ها

یکی از بهترین کاربردهای Attribute Selector، فرم‌ها است.

فرض کنید فرم زیر را داریم:

<form>
    <input type="text" name="username" placeholder="نام کاربری">

    <input type="email" name="email" placeholder="ایمیل">

    <input type="password" name="password" placeholder="رمز عبور">

    <input type="number" name="age" placeholder="سن">

    <button type="submit">ثبت نام</button>
</form>

می‌توانیم هر نوع Input را جداگانه طراحی کنیم:

input[type="text"] {
    border-color: blue;
}

input[type="email"] {
    border-color: green;
}

input[type="password"] {
    border-color: purple;
}

input[type="number"] {
    border-color: orange;
}

همچنین:

input[required] {
    background-color: #fff8f8;
}

این قانون فقط فیلدهای دارای required را هدف قرار می‌دهد.

ترکیب Selectorها و روابط بین عناصر

تا اینجا Selectorها را بر اساس خود عنصر یا Attribute آن انتخاب کردیم.

اما گاهی لازم است بر اساس موقعیت یک عنصر نسبت به عنصر دیگر انتخاب کنیم.

برای این کار از Combinator استفاده می‌کنیم.

Combinatorها به ما اجازه می‌دهند بر اساس رابطه عناصر در ساختار HTML انتخاب دقیق‌تری داشته باشیم.

چهار مورد مهم برای این مرحله عبارت‌اند از:

  • فاصله یا Descendant

  • > یا Child

  • + یا Next Sibling

  • ~ یا Subsequent Sibling

Descendant Combinator

ساده‌ترین نوع، فاصله است:

.parent .child

یعنی عنصر دوم باید درون عنصر اول قرار داشته باشد؛ مهم نیست چند سطح پایین‌تر باشد.

مثلاً:

<div class="card">
    <h2>عنوان</h2>

    <div>
        <p>متن اول</p>
    </div>
</div>

می‌توان نوشت:

.card p {
    color: blue;
}

در این حالت p داخل .card انتخاب می‌شود، حتی اگر مستقیماً فرزند .card نباشد.

Descendant Selector می‌تواند عناصر موجود در هر سطح پایین‌تر از عنصر والد را انتخاب کند.

Child Combinator

اگر فقط فرزند مستقیم را بخواهیم، از > استفاده می‌کنیم:

.parent > .child

مثلاً:

<div class="card">
    <p>متن اول</p>

    <div>
        <p>متن دوم</p>
    </div>
</div>

اگر بنویسیم:

.card > p {
    color: red;
}

فقط p اول انتخاب می‌شود.

چرا؟

چون:

<div class="card">
    <p>متن اول</p>
</div>

p فرزند مستقیم .card است.

اما p دوم داخل یک div دیگر قرار دارد:

<div class="card">
    <div>
        <p>متن دوم</p>
    </div>
</div>

بنابراین فرزند مستقیم .card نیست.

تفاوت مهم:

.card p

یعنی:

هر p درون .card

اما:

.card > p

یعنی:

فقط pهایی که مستقیماً فرزند .card هستند.

Next Sibling Combinator

با + می‌توانیم عنصر بعدی و بلافاصله مجاور را انتخاب کنیم.

.element1 + .element2

مثلاً:

<h2>عنوان</h2>
<p>پاراگراف اول</p>
<p>پاراگراف دوم</p>

اگر بنویسیم:

h2 + p {
    color: red;
}

فقط پاراگراف اول انتخاب می‌شود.

زیرا بلافاصله بعد از h2 قرار دارد.

اما پاراگراف دوم انتخاب نمی‌شود.

Next Sibling فقط عنصر بعدیِ بلافاصله مجاور را هدف قرار می‌دهد و دو عنصر باید یک والد مشترک داشته باشند.

Subsequent Sibling Combinator

اگر بخواهیم تمام عناصر هم‌سطحی را که بعد از یک عنصر قرار دارند انتخاب کنیم، از ~ استفاده می‌کنیم:

.element1 ~ .element2

مثلاً:

<h2>عنوان</h2>

<p>پاراگراف اول</p>

<div>یک بخش دیگر</div>

<p>پاراگراف دوم</p>

حالا:

h2 ~ p {
    color: green;
}

هر دو p انتخاب می‌شوند.

چون هر دو:

  • بعد از h2 قرار دارند.

  • با h2 والد مشترک دارند.

برخلاف +، لازم نیست p بلافاصله بعد از h2 قرار گرفته باشد.

تفاوت چهار Combinator مهم

Selector

مفهوم

.box p

هر p درون .box

.box > p

فقط فرزند مستقیم .box

h2 + p

اولین p بلافاصله بعد از h2

h2 ~ p

تمام pهای بعد از h2 با همان والد

برای درک بهتر، این ساختار را ببینید:

<section class="content">

    <h2>عنوان</h2>

    <p>پاراگراف اول</p>

    <div>
        <p>پاراگراف دوم</p>
    </div>

    <p>پاراگراف سوم</p>

</section>

Selector اول

.content p

هر سه p انتخاب می‌شوند.

Selector دوم

.content > p

پاراگراف اول و سوم انتخاب می‌شوند.

پاراگراف دوم چون داخل div است، فرزند مستقیم .content نیست.

Selector سوم

h2 + p

فقط پاراگراف اول انتخاب می‌شود.

Selector چهارم

h2 ~ p

پاراگراف اول و سوم انتخاب می‌شوند، چون هر دو بعد از h2 و دارای والد مشترک هستند.

ترکیب Attribute Selector و Combinator

حالا می‌توانیم چند مفهوم را با هم ترکیب کنیم.

فرض کنید:

<nav class="menu">
    <a href="/">خانه</a>
    <a href="/products">محصولات</a>
    <a href="https://example.com" target="_blank">سایت خارجی</a>
</nav>

می‌توانیم فقط لینک‌های خارجی را انتخاب کنیم:

.menu a[target="_blank"] {
    color: orange;
}

در این Selector:

.menu

بخش والد است.

a

عنصر موردنظر است.

[target="_blank"]

شرط Attribute است.

مثال ترکیبی دیگر

فرض کنید:

<form class="register-form">

    <div class="field">
        <label>نام</label>
        <input type="text" required>
    </div>

    <div class="field">
        <label>ایمیل</label>
        <input type="email" required>
    </div>

</form>

می‌توانیم فقط Inputهای ایمیل را انتخاب کنیم:

.register-form input[type="email"] {
    border-color: green;
}

و فقط Inputهای اجباری را:

.register-form input[required] {
    background-color: #fff8f8;
}

یا حتی:

.register-form > .field {
    margin-bottom: 20px;
}

در اینجا .fieldها باید فرزند مستقیم .register-form باشند.

یک پروژه عملی کوچک

حالا یک فرم و منوی ساده طراحی کنیم که از Attribute Selector و Combinator استفاده کند.

HTML

<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Attribute Selector</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>

    <nav class="menu">
        <a href="/">خانه</a>
        <a href="/courses">دوره‌ها</a>
        <a href="/contact">تماس با ما</a>
        <a href="https://example.com" target="_blank">سایت خارجی</a>
    </nav>

    <main class="container">

        <h1>ثبت نام</h1>

        <p>لطفاً اطلاعات خود را وارد کنید.</p>

        <form class="register-form">

            <div class="field">
                <label for="username">نام کاربری</label>
                <input
                    id="username"
                    type="text"
                    name="username"
                    required
                >
            </div>

            <div class="field">
                <label for="email">ایمیل</label>
                <input
                    id="email"
                    type="email"
                    name="email"
                    required
                >
            </div>

            <div class="field">
                <label for="password">رمز عبور</label>
                <input
                    id="password"
                    type="password"
                    name="password"
                    required
                >
            </div>

            <button type="submit">
                ثبت نام
            </button>

        </form>

    </main>

</body>
</html>

CSS

* {
    box-sizing: border-box;
}

body {
    margin: 0;
    font-family: sans-serif;
    background-color: #f5f5f5;
}

.menu {
    padding: 20px;
    background-color: #222;
}

.menu a {
    margin-left: 20px;
    color: white;
    text-decoration: none;
}

.menu a[target="_blank"] {
    color: orange;
}

.container {
    width: 90%;
    max-width: 600px;
    margin: 40px auto;
}

.container > h1 {
    margin-bottom: 10px;
}

h1 + p {
    color: #666;
    margin-bottom: 30px;
}

.register-form {
    padding: 25px;
    background-color: white;
    border-radius: 12px;
}

.register-form > .field {
    margin-bottom: 20px;
}

.field label {
    display: block;
    margin-bottom: 8px;
}

.field input {
    width: 100%;
    padding: 12px;
    border: 1px solid #ccc;
    border-radius: 8px;
}

.field input[required] {
    background-color: #fffaf0;
}

.field input[type="email"] {
    border-color: #28a745;
}

.field input[type="password"] {
    border-color: #6f42c1;
}

.register-form button[type="submit"] {
    width: 100%;
    padding: 12px;
    border: none;
    border-radius: 8px;
    cursor: pointer;
}

در این مثال چند نوع Selector را همزمان استفاده کردیم:

.menu a

برای انتخاب لینک‌های داخل منو.

.menu a[target="_blank"]

برای انتخاب لینک‌های خارجی.

.container > h1

برای انتخاب عنوانی که فرزند مستقیم container است.

h1 + p

برای انتخاب پاراگراف بلافاصله بعد از عنوان.

.field input[required]

برای انتخاب Inputهای دارای required.

.field input[type="email"]

برای انتخاب Inputهای ایمیل.

این دقیقاً همان چیزی است که Selectorهای ترکیبی را قدرتمند می‌کند: می‌توانیم انتخاب خود را مرحله‌به‌مرحله دقیق‌تر کنیم.

آیا باید Selectorهای بسیار پیچیده بنویسیم؟

خیر.

مثلاً این Selector:

main.container form.register-form div.field input.form-control[type="email"][required]

ممکن است کار کند، اما بیش از حد پیچیده است.

در بسیاری از موارد می‌توانیم آن را ساده‌تر بنویسیم:

input[type="email"][required] {
    ...
}

یا:

.register-form input[type="email"] {
    ...
}

هدف Selector این نیست که هرچه طولانی‌تر باشد؛ هدف این است که به اندازه کافی دقیق و قابل نگهداری باشد.

اشتباه رایج: فاصله در Selector

این دو Selector کاملاً متفاوت هستند:

.card .title

و:

.card.title

اولی یعنی:

عنصری با کلاس title که داخل عنصری با کلاس card قرار دارد.

دومی یعنی:

یک عنصر که همزمان کلاس card و title را دارد.

مثلاً:

<div class="card">
    <h2 class="title">عنوان</h2>
</div>

با این Selector انتخاب می‌شود:

.card .title

اما با این Selector انتخاب نمی‌شود:

.card.title

چون card و title روی یک عنصر نیستند.

اشتباه رایج: اشتباه گرفتن + و ~

این:

h2 + p

فقط p بلافاصله بعد از h2 را انتخاب می‌کند.

اما:

h2 ~ p

تمام pهای بعد از h2 را که با آن والد مشترک دارند انتخاب می‌کند.

پس:

+  → فقط همسایه بعدی
~  → تمام همسایه‌های بعدی

اشتباه رایج: استفاده نادرست از >

این:

.card > p

فقط فرزند مستقیم را انتخاب می‌کند.

اگر HTML این باشد:

<div class="card">
    <div>
        <p>متن</p>
    </div>
</div>

p توسط این Selector انتخاب نمی‌شود:

.card > p

اما با این انتخاب می‌شود:

.card p

چون p در نهایت داخل .card قرار دارد.

اشتباه رایج: استفاده از [class="..."] برای Classهای معمولی

اگر می‌خواهیم عناصر دارای یک کلاس خاص را انتخاب کنیم، معمولاً بهتر است بنویسیم:

.card

نه:

[class="card"]

چون یک عنصر ممکن است چند Class داشته باشد:

<div class="card featured large">

در چنین شرایطی:

.card

همچنان درست عمل می‌کند.

Attribute Selector یا Class؟

سؤال مهمی که ممکن است پیش بیاید این است:

چه زمانی از Attribute Selector استفاده کنیم و چه زمانی Class؟

هر دو ابزار مفید هستند، اما کاربردشان متفاوت است.

Class

برای طراحی و ایجاد نقش بصری یا ساختاری بسیار مناسب است:

<div class="card"></div>
.card {
    padding: 20px;
}

Attribute Selector

زمانی بسیار مفید است که بخواهیم بر اساس یک ویژگی واقعی عنصر تصمیم بگیریم:

input[type="email"] {
    ...
}

در اینجا type="email" واقعاً بخشی از معنای HTML عنصر است.

پس معمولاً بهتر است:

input[type="email"]

را برای انتخاب Inputهای ایمیل استفاده کنیم، به جای اینکه فقط برای CSS یک کلاس اضافی مانند:

<input class="email-input" type="email">

اضافه کنیم.

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

استفاده از Data Attribute

در HTML می‌توان Attributeهایی با نام data-* ایجاد کرد:

<div data-category="course">
    دوره طراحی وب
</div>

<div data-category="product">
    محصول
</div>

بعد در CSS می‌توانیم آن‌ها را انتخاب کنیم:

[data-category="course"] {
    border: 2px solid blue;
}

[data-category="product"] {
    border: 2px solid green;
}

Data Attributeها در HTML برای نگهداری داده‌های سفارشی کاربرد دارند و CSS نیز می‌تواند بر اساس آن‌ها عناصر را انتخاب کند.

نکته مهم درباره پیچیدگی Selectorها

با یادگیری Selectorهای بیشتر، ممکن است وسوسه شویم همه آن‌ها را با هم ترکیب کنیم.

مثلاً:

main > section.card[data-type="course"] article:first-child p strong {
    ...
}

اما همیشه Selector پیچیده بهتر نیست.

یک Selector خوب باید:

  • قابل فهم باشد.

  • هدف مشخصی داشته باشد.

  • بیش از حد به ساختار HTML وابسته نباشد.

  • نگهداری آن ساده باشد.

  • فقط به اندازه لازم دقیق باشد.

این موضوع در پروژه‌های بزرگ اهمیت بسیار بیشتری پیدا می‌کند.

تمرین‌های مقاله

تمرین ۱ — Attribute Selector

HTML زیر را در نظر بگیرید:

<input type="text">
<input type="email">
<input type="password">
<input type="number">

یک Selector بنویسید که فقط Inputهای email را انتخاب کند.

تمرین ۲ — Required

برای HTML زیر:

<input type="text" required>
<input type="email">
<input type="password" required>

یک Selector بنویسید که تمام Inputهای دارای required را انتخاب کند.

تمرین ۳ — لینک‌های خارجی

HTML:

<a href="/about">درباره ما</a>
<a href="https://example.com" target="_blank">سایت خارجی</a>
<a href="/contact">تماس</a>

فقط لینک دارای target="_blank" را با رنگ نارنجی نمایش دهید.

تمرین ۴ — Descendant

HTML زیر را در نظر بگیرید:

<div class="box">
    <p>متن اول</p>

    <div>
        <p>متن دوم</p>
    </div>
</div>

یک Selector بنویسید که هر دو p را انتخاب کند.

تمرین ۵ — Child

با همان HTML، Selectorی بنویسید که فقط p اول را انتخاب کند.

تمرین ۶ — Sibling

HTML:

<h2>عنوان</h2>
<p>پاراگراف اول</p>
<div>بخش دیگر</div>
<p>پاراگراف دوم</p>

دو Selector بنویسید:

  1. فقط پاراگراف اول.

  2. هر دو پاراگراف.

جمع‌بندی

در این مقاله یاد گرفتیم که CSS فقط به Selectorهای ساده‌ای مانند class و id محدود نمی‌شود. با Attribute Selectorها می‌توانیم عناصر را بر اساس Attribute و مقدار آن‌ها انتخاب کنیم؛ برای مثال فقط Inputهای ایمیل، لینک‌های دارای target="_blank" یا عناصر دارای required.

همچنین با Combinatorها یاد گرفتیم که می‌توانیم عناصر را بر اساس رابطه آن‌ها در ساختار HTML انتخاب کنیم. فاصله برای انتخاب عناصر داخلی، > برای فرزند مستقیم، + برای عنصر بلافاصله بعدی و ~ برای عناصر هم‌سطح بعدی استفاده می‌شود.

این ابزارها به ما اجازه می‌دهند بدون اضافه کردن Classهای غیرضروری، انتخاب‌های دقیق‌تری در CSS داشته باشیم. البته قدرت بیشتر به معنی Selectorهای پیچیده‌تر نیست؛ در یک پروژه حرفه‌ای باید همیشه بین دقت، خوانایی و قابلیت نگهداری تعادل برقرار کنیم.

تا اینجا تقریباً تمام ابزارهای مهم برای انتخاب عناصر را بررسی کرده‌ایم. در مقاله بعدی وارد یکی از مهم‌ترین مباحث CSS می‌شویم: اینکه وقتی چند قانون CSS همزمان روی یک عنصر اعمال می‌شوند، کدام قانون برنده می‌شود؟

۰۰

نظرات

کد در دسترس نیست

هنوز نظری ثبت نشده است.