هدف قرار دادن حالتهای فرم: Form-related Selectors
در درس Pseudo-class بهطور خلاصه با :checked، :disabled و :enabled آشنا شدیم. حالا وقتشه یه فصل مستقل بهشون اختصاص بدیم و همراهشون خانواده کامل Selectorهایی رو ببینیم که مخصوص عناصر فرم طراحی شدن؛ Selectorهایی که کار استایلدهی و نمایش وضعیت اعتبارسنجی فرمها رو بدون نیاز به جاوااسکریپت ممکن میکنن.
چرا این Selectorها اهمیت دارن؟
فرمها یکی از تعاملیترین بخشهای هر صفحه وب هستن. کاربر باید بفهمه کدوم فیلد پر شده، کدوم اجباریه، کدوم غیرفعاله و کدوم مقدار نامعتبری داره. CSS با یه سری Pseudo-class اختصاصی، اجازه میده همه این حالتها رو کاملاً بصری نشون بدیم، بدون اینکه لازم باشه با جاوااسکریپت کلاس اضافه یا حذف کنیم.
checked: وضعیت انتخابشده
input:checked {
accent-color: seagreen;
}
input:checked + label {
font-weight: bold;
color: seagreen;
}
<input type="checkbox" id="agree">
<label for="agree">موافقم</label>
در این مثال، وقتی چکباکس تیک بخوره، هم رنگ خود چکباکس عوض میشه و هم، با کمک Next-sibling Combinator که در فصل قبل دیدیم، متن label کناری Bold و رنگی میشه. این ترکیب، یکی از رایجترین تکنیکهای استایلدهی به چکباکس و رادیو باتنهای سفارشیه.
disabled و enabled: فعال یا غیرفعال بودن
input:disabled {
background-color: #f0f0f0;
color: #999;
cursor: not-allowed;
}
input:enabled {
background-color: #ffffff;
}
<input type="text" disabled>
<input type="text">
:disabled عناصری رو هدف میگیره که ویژگی disabled دارن؛ :enabled دقیقاً برعکسش، یعنی هر عنصر فرم فعالی که این ویژگی رو نداره.
required و optional: اجباری یا اختیاری بودن
input:required {
border-left: 3px solid crimson;
}
input:optional {
border-left: 3px solid lightgray;
}
<input type="text" required>
<input type="text">
:required فقط فیلدهایی رو انتخاب میکنه که ویژگی required دارن؛ :optional برعکسش، فیلدهای بدون این ویژگی رو هدف میگیره. این روش بصری، به کاربر کمک میکنه بدون خوندن متن اضافه، بفهمه کدوم فیلدها اجباریان.
valid و invalid: نتیجه اعتبارسنجی
input:valid {
border-color: green;
}
input:invalid {
border-color: red;
}
<input type="email" required>
این دو Pseudo-class بر اساس اعتبارسنجی داخلی مرورگر عمل میکنن (مثلاً بررسی فرمت صحیح یک ایمیل، یا برآورده شدن ویژگی required). وقتی مقدار واردشده با قوانین اعتبارسنجی HTML مطابقت داشته باشه، :valid فعال میشه؛ در غیر این صورت، :invalid.
نکته مهم: این Selectorها معمولاً حتی روی فیلد خالی هم بلافاصله فعال میشن (مثلاً یک input خالی با required، از همون ابتدا :invalid محسوب میشه)؛ این رفتار میتونه تجربه کاربری بدی ایجاد کنه، چون قبل از اینکه کاربر حتی شروع به تایپ کنه، حاشیه قرمز نشون داده میشه. برای حل این مشکل، معمولاً از Pseudo-class بعدی استفاده میشه.
placeholder-shown: نمایش placeholder
input:placeholder-shown {
border-color: lightgray;
}
:placeholder-shown فقط زمانی فعاله که input هنوز خالیه و متن placeholderش نمایش داده میشه. این Pseudo-class معمولاً در ترکیب با :invalid استفاده میشه تا فقط بعد از اینکه کاربر واقعاً چیزی تایپ کرد (و دیگه placeholder دیده نمیشه)، حالت خطا نمایش داده بشه:
input:not(:placeholder-shown):invalid {
border-color: red;
}
این Selector میگه: «فقط وقتی input دیگه placeholderش نمایش داده نمیشه (یعنی کاربر چیزی تایپ کرده) و در عین حال مقدارش نامعتبره، حاشیه قرمز نشون بده». تابع :not() که در درس بعدی همین فصل کامل بررسیش میکنیم، اینجا برای معکوس کردن شرط استفاده شده.
focus: تمرکز روی یک فیلد
input:focus {
border-color: royalblue;
box-shadow: 0 0 0 3px rgba(65, 105, 225, 0.2);
}
همونطور که در درس Pseudo-class دیدیم، این حالت وقتی فعاله که کاربر روی فیلد کلیک کرده یا با Tab بهش رسیده. این Pseudo-class برای دسترسیپذیری فرمها حیاتیه.
یک مثال ترکیبی کامل
input {
border: 2px solid #ccc;
padding: 8px;
transition: border-color 0.2s;
}
input:focus {
border-color: royalblue;
}
input:required {
border-left-width: 4px;
}
input:not(:placeholder-shown):invalid {
border-color: crimson;
}
input:not(:placeholder-shown):valid {
border-color: seagreen;
}
input:disabled {
background-color: #f5f5f5;
cursor: not-allowed;
}
<input type="email" placeholder="ایمیل خود را وارد کنید" required>
<input type="text" placeholder="کد تخفیف (اختیاری)">
<input type="text" placeholder="غیرفعال" disabled>
در این مثال، رفتار کامل یک فرم واقعی شبیهسازی شده: فیلدها هنگام فوکوس آبی میشن، فیلد اجباری حاشیه ضخیمتری داره، و رنگ سبز یا قرمز فقط بعد از شروع تایپ کاربر نمایش داده میشه، نه از همون ابتدای بارگذاری صفحه.
جدول جمعبندی
| Selector | عملکرد |
|---|---|
:checked |
چکباکس یا رادیوی انتخابشده |
:disabled / :enabled |
عنصر غیرفعال / فعال |
:required / :optional |
فیلد اجباری / اختیاری |
:valid / :invalid |
نتیجه اعتبارسنجی مقدار واردشده |
:placeholder-shown |
زمانی که placeholder هنوز نمایش داده میشود |
:focus |
عنصر در حال حاضر فوکوسشده است |
نکات مهم
- این Selectorها امکان نمایش وضعیت فرم رو کاملاً با CSS خالص فراهم میکنن، بدون نیاز به جاوااسکریپت.
:invalidمعمولاً از همون ابتدای بارگذاری صفحه روی فیلدهای اجباری خالی فعاله؛ ترکیب با:not(:placeholder-shown)این مشکل رو حل میکنه.- این Selectorها بهطور مستقیم به ویژگیهای HTML مثل
required،disabledو نوع input وابستهان.
اشتباهات رایج
- نمایش فوری حالت قرمز
:invalidحتی قبل از اینکه کاربر شروع به تایپ کنه، که تجربه کاربری آزاردهندهای ایجاد میکنه. - فراموش کردن استایل
:focus، که مستقیماً روی دسترسیپذیری فرم برای کاربران صفحهکلید اثر منفی میذاره. - تکیه کامل به رنگ (مثلاً فقط قرمز و سبز) برای نشان دادن اعتبار، بدون هیچ نشانه یا متن اضافهای؛ این موضوع برای کاربران کمبینا یا دارای کوررنگی مشکلساز است.
جمعبندی
Form-related Selectors مجموعهای از Pseudo-classهای اختصاصی هستن که وضعیتهای مختلف عناصر فرم (انتخابشده، غیرفعال، اجباری، معتبر، در حال فوکوس) رو، بدون نیاز به جاوااسکریپت، قابل استایلدهی میکنن. ترکیب هوشمندانه این Selectorها، مثل استفاده از :not(:placeholder-shown) در کنار :invalid، امکان ساخت تجربههای کاربری بسیار روانتری رو در فرمها فراهم میکنه.
