شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

سلکتور آی دی (ID) و کلاس (Class) در CSS

css-style-id-class

در آموزش قبل اشاره شد که CSS به خودی خود کاربرد خاصی ندارد و در کنار تگ های HTML است که معنی و کاربرد پیدا می کند، در واقع CSS صرفا برای تعریف استایل تگ های مختلف HTML به وجود آمده است، اما CSS چگونه این تگ ها را در صفحات وب شناسایی می کند؟ به طور مثال اگر بخواهیم از بین دهها تگ div موجود در صفحه div مربوط به یک مطلب مشخص را استایل دهی کنیم، CSS چه راه حلی برای این موضوع در نظر گرفته است؟ پاسخ این نوع سوالات عبارت سلکتور (Selector) است، سلکتور راهکاری در CSS است که با آن عنصر هدف در HTML برای استایل دهی مشخص می شود، تعداد سلکتورها نسبتا زیاد است، در این آموزش به دو مورد از مهم ترین و پرکاربردترین ها یعنی آی دی (ID) و کلاس (Class) خواهیم پرداخت که درک و تسلط بر نحوه کاربرد آنها در روند فراگیری CSS اهمیت زیادی دارد، در کنار این دو سلکتور پر کاربرد گذری خواهیم داشت بر مبحث قانون اولویت بندی سلکتورها در CSS که درک آن نیز برای مراحل بعدی و آموزش های پیشرفته تر ضرورت دارد.

معنی سلکتور (Selector) در CSS


همان طور که گفتیم سلکتور (Selector) در واقع راهکاری در CSS است که با آن عنصر هدف در HTML برای استایل دهی مشخص می شود، سلکتورها الگوهای تعریف شده (Pattern) در CSS هستند که با آنها عنصر یا عناصری که می خواهیم استایل بر آنها تاثیر داشته باشد را انتخاب (Select) می کنیم لذا می توانیم در ترجمه تحت الفظی این عبارت به آن انتخابگر نیز بگوییم، برای مثال سلکتور p در CSS استایل را به تمام تگ های p موجود در کدنویسی HTML صفحه نسبت می دهد یا به عبارتی دیگر تمام تگ های p در صفحه را جهت اعمال استایل CSS مد نظر انتخاب می کند:
<style type="text/css">
p {
    font-size:16px;
    color:#818181;
}
</style>
<p>پاراگراف اول</p>
<p>پاراگراف دوم</p>
<p>پاراگراف سوم</p>
در مثال بالا استایل CSS به تمام تگ های p نسبت داده می شود، اما اگر بخواهیم فقط یک تگ p خاص را انتخاب کنیم باید به یکی از روش های تعریف آی دی (ID) یا کلاس (Class) در CSS مانند نمونه کد زیر عمل کنیم:
<style type="text/css">
.color-text {
    font-size:16px;
    color:#818181;
}
</style>
<p>پاراگراف اول</p>
<p class="color-text">پاراگراف دوم</p>
<p>پاراگراف سوم</p>
در نمونه کد بالا از سلکتور Class در CSS برای انتخاب یک پاراگراف خاص (تگ p دوم) استفاده شده و استایل صرفا به این تگ اعمال می شود.

نحوه تعریف آی دی (ID) و کلاس (Class) در CSS


گفتیم که سلکتورها الگوهای تعریف شده (Pattern) در CSS هستند، منظور از این عبارت قراردادی بودن نحوه تعریف سلکتورها در CSS با قواعد خاص خود است، آی دی (ID) و کلاس (Class) جزء پرکاربردترین سلکتورها هستند که بر اساس قانون الگو با علائم خاصی در کدهای CSS تعریف می شوند، برای تعریف آی دی از علامت # و برای کلاس از علامت نقطه در ابتدای الگو استفاده می کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | آی دی و کلاس در CSS</title>
<!-- Webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
#main{
    display:block;
    background-color:#069;
}
.text{
    color:#FFF;
}
</style>
</head>
<body>
<div id="main" class="text">
این یک متن در آی دی main و کلاس text است.
</div>
</body>
</html>
پیش نمایش
همان طور که در کد بالا مشخص است یک تگ HTML می تواند از چند سلکتور مختلف در CSS استایل دهی شود، در اینجا برخی خصوصیات تگ div از سلکتور آی دی و برخی موارد دیگر از سلکتور کلاس به آن نسبت داده شده اند.

کجا از آی دی (ID) و کی از کلاس (Class) استفاده کنیم؟


شاید با دیدن و بررسی این نمونه کدها این سوال به ذهنمان خطور کند که کجا باید از آی دی (ID) و کی از کلاس (Class) استفاده کنیم؟ در پاسخ باید گفت که هر سلکتوری در CSS با هدف خاصی ایجاد شده که در ارتباط مستقیم با کدنویسی HTML است، در HTML برای شناسایی تگ های مختلف از هم از ID استفاده می شود، به طور مثال:
<div id="id-1"></div>
<div id="id-2"></div>
<div id="id-3"></div>
هر تگ در HTML صرفا می تواند یک ID داشته باشد به عبارتی ID ها همیشه یکتا هستند و اگر در یک صفحه از یک ID در چند مورد استفاده شود، آن صفحه از لحاظ استاندارد کدنویسی معتبر (Valid) نیست، در مقابل اگر بخواهیم یک استایل CSS را به دفعات و برای تگ های مختلف HTML استفاده کنیم، از Class استفاده می کنیم، کلاس ها می توانند به هر تعداد در صفحه تکرار شوند، در واقع هدف از ایجاد این سلکتور تعریف یک استایل و استفاده از آن به دفعات متعدد در صفحه است، به مثال زیر توجه کنید:
<div id="id-1" class="class-1"></div>
<div id="id-2" class="class-1"></div>
<div id="id-3" class="class-1"></div>
همان طور که در تکه کد HTML بالا مشخص است آی دی ها یکتا هستند اما کلاس بین همه تگ ها مشترک است و چند تگ مختلف از یک کلاس مشترک استایل دهی شده اند.

تعریف ویژگی، بدون آی دی و کلاس در CSS


علاوه بر کلاس و آی دی، برخی از موارد در CSS به صورت سلکتورهای کلی قابل تعریف شدن هستند، به طور مثال سلکتور body استایل خود را در حالت پیش فرض به تگ body و زیر مجموعه آن اختصاص می دهد یا سلکتور p به تمام عناصر پاراگرافی (تگ های p) موجود در صفحه وب استایل خود را اختصاص می دهد:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | استایل دهی بدون آی دی و کلاس</title>
<!-- Webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
    direction:rtl;
}
p,div{
    border:#CCC 1px solid;
    padding:4px;
    color:#000;
}
#main{
    display:block;
    background-color:#069;
}
.text{
    color:#FFF;
}
</style>
</head>
<body>
<div id="main">
<p class="text">
این یک متن در آی دی main و کلاس text است، برخی ویژگی های کلی از سلکتور div و p تاثیر می پذیرند.
</p>
</div>
</body>
</html>
پیش نمایش
در مثال بالا علاوه بر استفاده از آی دی main و کلاس text به عنوان سلکتورهای اصلی، به صورت کلی نیز استایلی را برای تگ های div و p موجود در صفحه اختصاص داده ایم، با این کار تمام عناصر پاراگراف و بلاک های div آن ویژگی را خواهند داشت، دقت کنیم که در CSS قوانینی برای اولویت بندی سلکتورها وجود دارد، به طور مثال اگر دو ویژگی مشترک (به فرض color) هم در سلکتور p و هم در کلاس تعریف شده باشند، CSS اولویت را به کلاس می دهد و color موجود در سلکتور p را که به صورت کلی تعریف شده نادیده می گیرد، در نمونه کد بالا color برای سلکتور p به صورت مقدار کد هگز 000 (رنگ مشکی) در نظر گرفته شده، اما در کلاس text این مقدار FFF (رنگ سفید) است، در نتیجه رنگ متن تگ های p که کلاس text داشته باشند سفید خواهد بود، برای آشنایی بیشتر با این موضوع در ادامه به طور مختصر به مسئله قانون اولویت بندی سلکتورها در CSS می پردازیم.

قانون اولویت بندی سلکتورها در CSS


در آموزش قبل در خصوص عبارت Cascading یا آبشاری بودن CSS توضیحاتی ارائه شد، گفتیم که منظور از این عبارت پیروی سلسه مراتبی مرورگر از استایل های CSS موجود در صفحه است، یعنی اگر دو استایل مشترک در صفحه وجود داشته باشند، خاصیتی غالب می شود که در پائین ترین سطح درج شده باشد، به طور مثال در استایل های زیر ویژگی دوم غالب می شود چون در سطح پائین تری در صفحه درج شده:
<style type="text/css">
p.text{
    font-size:16px;
}
</style>
<style type="text/css">
p.text{
    font-size:12px;
}
</style>
<p class="text">پاراگراف</p>
اما تداخل همیشه بین استایل های صفحه نیست، همواره این امکان وجود دارد که خاصیت های مختلف CSS از چند سلکتور متفاوت بر روی یک تگ HTML تاثیر مشترک داشته و بین سلکتورها به اصطلاح تداخل ایجاد شود، به طور مثال در نمونه کد زیر بین سلکتور p و p.text تداخل وجود دارد:
<style type="text/css">
p{
    font-size:12px;
    color:#D3181B;
}
p.text{
    font-size:16px;
    color:#1740DD;
}
</style>
<p>پاراگراف اول</p>
<p class="text">پاراگراف دوم</p>
اگر استایل بالا را در یک صفحه HTML قرار داده و آن را اجرا کنیم، خواهیم دید که CSS در حالتی که برای تگ p کلاس در نظر گرفته شده (p.text یعنی تگ های p در صفحه که کلاس text داشته باشند)، خاصیت ها را به جای تگ p از کلاس دریافت می کند، این رفتار بر اساس قانون اولویت بندی سلکتورها در CSS صورت می گیرد که در ادامه به اختصار در مورد آن خواهیم گفت.
بر اساس قانون اولویت، هر سلکتور CSS را می توان در چهار رده 
A, B, C, D
جای داد و با اعداد 0، 1 و... تعداد تکرار آنها را محاسبه کرد (این حروف و اعداد الگویی فرضی و قراردادی هستند و صرفا جهت درک بهتر و به حافظه سپردن موضوع استفاده می شوند)، در اولین رده این ساختار، استایل خطی یا Inline Style جای دارد که حرف متناظر آن A و عدد متناظر آن
1, 0, 0, 0
است، رده دوم مربوط به ID است که با حرف B و عدد متناظر
0, 1, 0, 0
مشخص می شود، در رده سوم اولویت Class قرار دارد که با حرف C و عدد متناظر
0, 0, 1, 0
متمایز می گردد، در آخرین رده سلکتور تگ یا Element قرار دارد که با حرف D و عدد متناظر
0, 0, 0, 1
مشخص می شود، به طور خلاصه و با مثال:
A - Inline Style => 1000 => <div style=""></div>
B - ID => 0100 => <style type="text/css">#your-id {}</style>
C - Class => 0010 => <style type="text/css">.your-class {}</style>
D - Element => 0001 => <style type="text/css">div {}</style>
چند مثال کاربردی از قانون اولویت بندی سلکتورها در CSS:
<style type="text/css">
p{
    font-size:12px;
    color:#D3181B;
}
</style>
<p style="font-size:24px;">پاراگراف</p>
در مثال بالا بین استایل خطی (خاصیت font-size) با سلکتور p یا Element تداخل وجود دارد، در این حالت استایل خطی برتری دارد (اندازه فونت 24 پیکسل خواهد بود) چون درجه آن A است و عدد متناظر آن
1, 0, 0, 0
تعریف می شود که از عدد
0, 0, 0, 1
بزرگتر است!
<style type="text/css">
div p.text{
    font-size:16px;
    text-decoration:underline;
}
#main p{
    font-size: 12px;
    text-decoration:overline;
}
</style>
<div id="main">
<p class="text">پاراگراف</p>
</div>
در مثال بالا سلکتور دوم ارجحیت دارد چرا که عدد متناظر آن به صورت
0, 1, 0, 1
محاسبه می شود (آی دی main به تعداد 1 مورد در رده B و تگ p به تعداد 1 مورد در جایگاه D که در نهایت عدد آن به صورت 0101 می شود) که از عدد 
0, 0, 1, 2
سلکتور اول بزرگتر است! (عدد 2 در این محاسبه یعنی 2 عنصر تگ یا Element در سلکتور وجود دارد لذا نمره متناظر آن 2 و در جایگاه D است، عدد 1 نیز به دلیل وجود یک کلاس در الگو است که جایگاه آن حرف C است).
با فهم این الگوها می توانیم درک روشنی از قوانین اولیت بندی در CSS داشته باشیم تا از سردرگمی و تعریف استایل های مبهم اجتناب کنیم.
دسته بندی: آموزش مقدماتی » CSS
related مطالب بیشتر:
خاصیت Background و ویژگی های آن در CSS
ویژگی های Font و Text در CSS
کار با border و outline در CSS
کاربرد ویژگی position و float در CSS
نحوه تنظیم لیست با تگ ul li در CSS
دیدگاه
more ۵۴ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
داوود
۲۲:۰۵ ۱۳۹۴/۰۵/۲۷
سلام
شما یه نمونه کد در پاسخ آقا علیرضا مبنی بر تغییر صفت مربوط به تگ title تو این لینک
http://jsfiddle.net/tDQWN
گذاشته بودین که من سعی کردم بدون نگاه کردن به کد شما اون رو انجام بدم.
بعد از اینکه یه خورده کارهاشو کردم و به مشکل برای اجرای صحیح و دقیق مثل کد شما برخورد کردم اومدم و اصل کد رو نگاه کردم. یکی دو مورد برام جالب اومد که گفتم اگه اشکال نداشته باشه ازتون بپرسم.
الف) کار خاصیت گزینه after رو که بعد از hover در انتخاب گر
a[title]:hover:after
گذاشتین رو میشه توضیح بدین؟
ب) همچنین
content: attr(title);
یعنی در واقع داره میگه اگه محتوای property صفت برابر با title بود بیا و این کار رو انجام بده؟؟ این خط از دستور رو میشه بفرمایین دقیقا چیکار میکنه؟؟ همون کلمه attr و content بیشتر مد نظرم هست.
ج) الان وقتی که ما postion مربوط به گزینشگر
a[title]:hover:after
رو absolute دادیم، دیدم که شما به left اون خاصیت صفر دادین، در واقع اینجا وقتی که خاصیت absolute رو میگیره ، مگه نمیاد و از Body پیروی کنه و خودش رو از عنصر والد جدا کنه در خصوص موقعیت قرار گیری؟؟ یا نسبت به عنصر والد میاد و موقعیت میگیره؟؟
مرسی و ممنونم ازتون.
- کد مربوطه توسط ما نوشته نشده، صرفا لینک آن برای کاربر درج شده است!
- after هم یک Selector در CSS است، با این تفاوت که حالت دستوری دارد، این دستور محتوای متنی یا تغییر خاصی را بعد از عنصر انتخاب شده اعمال می کند.
- دستور after با پارامتر content تکمیل می شود که خود می تواند در برگیرنده یک متن ساده یا یک تابع در CSS باشد.
- attr مخفف attribute یک تابع در CSS است که یک صفت از عنصر (در اینجا title) را برای اعمال دستور انتخاب می کند.
- عنصر absolute زمانی که زیرمجموعه عنصر relative (نسبی) باشد، از همان پیروی می کند، در اینجا a:hover به صورت relative است!
داوود
۰۸:۲۵ ۱۳۹۴/۰۵/۲۶
سلام و عرض صبح بخیر خدمت شما؛
آقای مهندس من چند روز قبل یه سوال ارسال کرده بودم در خصوص کدی که برای آقا علیرضا گذاشته بودین (تغییر رنگ title) و در اون در خصوص خاصیت after بعد از clear و همچنین کار تگ attr پرسیده بودم. شما هم محبت کردین و پاسخ دادین ولی چون اوایل بامداد بود گفتم صبح بیام و جواب رو کاملتر بخونم. البته همون لحظه هم تشکر خودم رو براتون فرستادم.
حالا که دارم دنبال میگردم راستش رو بخواین نه سوال قبلیم هستش و نه پیام تشکرم. میخواستم ببینم امکانش هست دوباره پاسخ رو برام بزارین؟؟ آخه احساس می کنم حذف شده. نمیدونم خودتون یادتون هست کدوم سوال رو میگم یا نه. ممنون میشم اگه پیگیری کنید چون اگه حذف بشه خیلی ناجور میشه ! ایکاش همون لحظه کپی میکردم صفحه رو.
اگه ممکنه یه رونوشت هم به ایمیلم بزنید که اگه اینجا حذف بشه دوباره تو اونجا بتونم بخونم جوابتون رو.
متاسفانه هنوز مشکلات سرور سایت به طور کامل بر طرف نشده و هر از چندگاهی شرکت هاستینگ بدون هماهنگی ما اقدام به رستور دیتابیس ها می کند که این باعث حذف پیام های بک آپ گرفته نشده همان روز رستور می شود! پیام شما نیز شامل همین قضیه شده، چند روز صبر کنید، پیام به همراه پاسخ جدید در همین قسمت منتشر خواهد شد!
داوود
۰۸:۱۴ ۱۳۹۴/۰۴/۱۸
سلام آقای مهندس،صبحتون بخیر و خوشی انشاالله؛
آقای مهندس این طور که نوشتم معنیش این میشه دیگه درسته؟
ابتدا کد رو ببینید:
#mybox#test{
border:2px solid #00FF99;
width:100px;
height:100px;
background:yellow;
}
اگه الان اینجا به جای # (ID) از . (class) استفاده می کردم یعنی اینکه تگی رو تحت تاثیر قرار بده که دارای کلاسهای mybox و test باشه.
حالا که از # استفاده می کنم چرا این قضیه صدق نمیکنه؟ الان معنی عبارت کد من این نمیشه؟
تگهایی رو تحت تاثیر قرار بده که دارای ID های mybox و test هستش (بطور همزمان)؛ یعنی اینجوری:
<div id="mybox test">the title for test</div>
ممنونم ازتون.
این حالت صحیح نیست، چون هدف از ID بر خلاف Class وجود پارامتر شناسایی یکتا است و لذا تگ های HTML نمی توانند چند ID هم زمان داشته باشند!، همچنین نمی توان یک ID را (در یک صفحه) به چند تگ نسبت داد، هر ID مخصوص یک تگ است.
داوود
۰۴:۲۲ ۱۳۹۴/۰۴/۱۲
با سلام؛ در این لحظات معنوی و زیبا از ماه مبارک رمضان؛ از خداوند بهترینها رو برای شما و سایر خوانندگان عزیز سایت خوبمون خواستارم. خدا خیرتون بده که همیشه پاسخگوی ما بودین بدون هیچ گونه کم و کاستی.
داوود
۱۰:۴۰ ۱۳۹۴/۰۴/۱۱
سلام و وقت بخیر آقای مهندس؛
استاد وقتی که با دستور import یک فایلی رو به فایل css خودمون الحاق میکنیم، اولویتها چجوری میشه؟
الف) مثلا در فایل style.css ما دو تا فایل رو به ترتیب با نامهای test1 و test2 الحاق می کنیم! حالا در زمان اجرا فکر کنم اول بیاد و attribute های test1 رو اعمال کنه، بعدش test2 و در انتها style رو. یعنی اولویت style از دو تای دیگه بالاتر و ارجح تر هستش. درست میگم؟؟
ب) حالا اگه تو یکی از این فایلها که اولویت پایین تری داره (منظورم این هستش که پس از بقیه اعمال میشه مثل test2)، ما از import! استفاده کنیم، این رو که دیگه تحت تاثیر اولویتهای بالاتر قرار نمیده، مگه نه؟؟ مثلا در همین مثال بالا اولویت test 2 بنظرم از test1 و style پایینتره.
@import url('test1.css');
@import url('test2.css');
ج) اینکه میگن نباید زیاد از این روش استفاده کنیم، چون باعث کاهش Load صفحه میشه درسته؟؟ یا اینکه در حد یکی دو تا اشکال نداره؟؟ چون با اینکار نظم صفحه بیشتر میشه فکر کنم.
- اولویت در این حالت هم مشابه حالت معمول است، به عبارتی با فرض یکی بودن کدها باید اولویت آنها را مشخص کنید یعنی از هر کجا که فایل، import شده، در واقع کدهای آن از همانجا وارد استایل موجود می شود، لذا استایل نهایی شما که توسط مرورگر پردازش می شود در واقع ماحصل فایل هایتان و محل درج آنها است، به طور خلاصه هرچقدر هم که فایل import کنید، در نهایت مرورگر یک استایل واحد را پردازش خواهد کرد و لذا بحث ارجحیت مانند یک استایل واحد است (با رعایت اینکه هر فایل در هر کجا import شود، کدهای آن از همانجا با استایل موجود mix می شود!)
- استفاده از import در وب امر متداولی نیست (به جزء در موارد خاص مانند استفاده از media@ برای استایل دهی برای چاپ و...) و به جای آن از link استفاده می شود، دلیل این موضوع هم بحث سرعت بارگذاری link و بارگذاری چندگانه آن است، یعنی چندین فایل css. در یک زمان قابل بارگذاری است، اما در مورد import اینگونه نیست و مرورگر فایل به فایل منتظر بارگذاری می ماند، همچنین مطلب زیر را مطالعه کنید:
http://www.stevesouders.com/blog/2009/04/09/dont-use-import/
داوود
۰۹:۵۹ ۱۳۹۴/۰۴/۰۶
سلامی دوباره آقای مهندس؛
آقای مهندس طبق توضیحاتی که بهم دادین و اینجور که فهمیدم برای اینکه نتیجه مشابه div بگیرم اومدم و برای تگ div اینجوری تعریف کردم و درست شد. خیلی جالب شد. ممنونم ازتون.
div{
display:inline-block;
}
در واقع الان به کمد داریم میگیم تو هم بیا و inline-block شو! البته در اینجا کمد همون div هستش ها.
بله! مثال کمد صرفا جهت تفهیم موضوع بود، در سایر موارد خیلی ارتباط دقیقی بین کمد و div وجود ندارد! :-)
داوود
۰۹:۰۰ ۱۳۹۴/۰۴/۰۶
سلام آقای مهندس
دست گلتون واقعا درد نکنه استاد عزیز و ارجمندم.
این رو اصلا نمیدونستم. یعنی در واقع با اینکار مثل این هستش که ما بگیریم یه شیئی رو که داخل کمد گذاشتیم، (حالا بهر وسیله ای) بزرگتر از کمدش کنیم که در این حالت کمد در حالت اولیه خودش درمیاد. اونوقت این قضیه همیشگی هستش؟؟ یعنی ما در هر تگی که این کار رو انجام بدیم در خصوص inline و بلاک بودنش، رو تگهای ماقبل که نگهدارنده اون هستن، تاثیر میذاره؟؟
بازهم ممنونم ازتون و دستتون درد نکنه. مرسی و متشکرم.
خیر! تگ درونی نمی تواند روی تگ ماقبل خود اثر بگذارد، در واقع منظور ما این بود که شما استایل در نظر گرفته شده برای div را حذف می کنید و استایل p را جایگزین می کنید در کدهای CSS و به این خاطر تگ div بدون استایل به حالت پیش فرض یعنی block بر می گردد.
داوود
۱۰:۴۲ ۱۳۹۴/۰۴/۰۴
سلام و عرض صبح بخیر و احترام؛
ممنونم که دیشب وقت گذاشته و پاسخ رو دادین. اگه ایرادی نداشته باشه روی همون کد چند تا سوال دیگه رو به ترتیب می پرسم.
ببینید اینکه میگم چرا کد مدرس از نظر من ممکنه بهتر شده باشه برای این بود که:
الان کاربر روی هر گزینه ای که بره توضیحات بیشتر همون گزینه، در پایین همون گزینه قابل مشاهده ست.
(برای راحتی کار و اینکه کمتر وقت شما رو بگیرم و اصلا زحمت copy و paste رو نکشین تو این لینک کد اولیه رو گذاشتم:
http://www.cssdesk.com/AxH3u
)
خوب حالا من میخوام یه تغییر کوچولو تو نحوه نمایش توضیحات گزینه ها بدم و اونهم اینه که به جای اینکه در پایین هر گزینه توضیحات رو نشون بده بیاد و در روبروش نشون بده. برای اینکار اومدم و در کد مدرس این تغییر رو اعمال کردم و درست شد؛ ببینید:
کد شماره یک:
ul.accardion li:hover div{
display:inline-block;
}
حالا همین تغییر رو به کد خودم دادم و درست نشد: ببینید:
کد شماره 2:
ul.accardion li:hover p{
display:inline-block;
}
و باز هم توضیحات رو در پایین هر گزینه نشون میداد؛ سوالم اینه که آیا عدم تغییر نحوه نمایش در این حالت بخاطر متفاوت بودن تعاریف پیش فرض p و div هستش؟؟ آخه هر دوتاشون که از نوع block هستن!
پاورقی:
مشاهده نتیجه تصویر در حالت کد شماره یک:
http://jsfiddle.net/hh2x3za6/
مشاهده نتیجه تصویر در حالت کد شماره 2:
http://jsfiddle.net/hh2x3za6/1/
امیدوارم منظورم رو واضح رسونده باشم خدمتتون.
این موضوع به بهتر و بدتر بودن کدها مربوط نیست، علت این است زمانی که تگ p به صورت inline-block تغییر می کند، بلاک div لفاف آن استایل خود را از دست می دهد (استایل div را با ویرایش خود حذف می کنید!) و به صورت پیش فرض (block) می شود، در این حالت مرورگر تگ p را به صورت خطی پردازش می کند منتها درون تگ div، که خود تگ div به صورت block و غیر خطی است!
در تفسیر کدهای CSS نباید صرفا به تگ آخر توجه کرد، شبیه چیدمان دلخواه لوازم (تگ های آخر) در یک کمد (تگ لفاف) است که این کمد می تواند در هرکجای خانه (صفحه وب) قرار داده شود! در واقع همان طور که قبلا گفتیم، کدنویسی لایه لایه و تو در تو به علت کنترل بیشتر در هنگام سفارشی سازی است که اغلب درک آن با کسب تجربه و کار عملی به مرور به دست می آید، نکته دیگر رعایت بحث HTML Semantic (ِیعنی هر تگ HTML باید برای منظور مورد نظر خودش استفاده شود، به فرض تگ p باید با هدف نمایش یک پاراگراف استفاده شود و...) است که اهمیت دارد.
داوود
۱۲:۳۱ ۱۳۹۴/۰۴/۰۳
سلام
آقای مهندس آموزش یه کد آکاردئونی بود که خودم میخواستم انجام بدم و بعد به سورسش نگاه کنم. بعدش که انجام دادم برام چند تا سوال پیش اومد که هر روز یک بخشش رو می پرسم ازتون.
ببینید کل کدی که در نهایت از طرف مدرس نوشته شده بود بدین شرحه:
<style type="text/css">
*{
margin:0;
padding:0;
}
ul.accardion{
background-color:#9900FF;
min-height:100px;
width:400px;
}
ul.accardion li div{
color:yellow;
display:none;
}
ul.accardion li:hover span{
color:#00FF00;
}

ul.accardion li:hover div{
display:block;
}
</style>
</head>
<body>
<ul class="accardion">
<li>
<span>html</span>
<div><p>content 1</p></div>
</li>
<li>
<span>CSS</span>
<div><p>Contetn 2</p></div>
</li>
<li>
<span>java</span>
<div><p>Content 3</p></div>
</li>
</ul>
</body>
حالا ولی من 2 تا از سلکتورها رو رو اینجوری نوشته بودم و جواب هم میداد؛ میشه ملاحظه بفرمایین:
اولی :
ul.accardion li p{
color:yellow;
display:none;
}
و دومی:
ul.accardion li:hover p{
display:block;
}
ببنید الان به درستی و خوبی داره مثل کد مدرس جواب میده، در صورتی که میدونم روشی که من نوشتم درست و اصولی نیست و روش مدرس استاندارد تره! چون از یه جایی فهمیدم که تو سوال بعدیم ازتون می پرسم که از کجا فهمیدم.
حالا میخوام ببینم چرا مثلا کد اون بهتر از من شده؟؟ چرا من که p رو هدف قرار گرفتم اون اینکار رو نکرده و div رو هدف قرار داده؟؟ مگه نباید تقریبا به آخرین هدف property های خودمون رو اعمال کنیم؟
امکانش هست در این خصوص یه توضیح مبسوطی (مثل همیشه) بهم بدین؟؟ بازم ببخشید.
- منظورتان از بهتر شدن کدها مشخص نیست! در کدنویسی معمولا دو نکته اهمیت دارد:
مورد اول رعایت استاندار HTML یا HTML Semantic در نگارش کدهای HTML است و نکته دوم استفاده از CSS با توجه به نیاز و هدف، به طور مثال اگر با تگ P نیاز و استاندارد معمول طراحی برآورده می شود، استفاده از تگ اضافه ضرورتی ندارد، اما در برخی شرایط جهت اعمال کنترل بیشتر و سفارشی سازی ممکن است صرف یک تگ مناسب نباشد و نیاز به اعمال برخی خاصیت ها در تگ والد آن باشد.
مورد دوم اینکه هیچ الزامی به هدف قرار دادن تگ آخر وجود ندارد! همه چیز به شرایط، نیاز و هدف طراحی استایل صفحه وب برمی گردد.
داوود
۰۹:۲۳ ۱۳۹۴/۰۴/۰۳
سلام و صبح بخیر آقای مهندس؛
ممنونم بخاطر پاسخگویی شب گذشته تون. دستتون درد نکنه.
خوب ببینید آقای مهندس طبق توضیحات حضرتعالی پس یک سری property ها وجود داره که خود تگ ها بطور پیش فرض اونها رو اعمال می کنن.
حالا من اومدم و این چند خط کد رو گذاشتم؛ الان دیگه خروجی هر دو کد فوق با این چند خط یکسان شد.
*
{
margin:0;
padding:0;
}
البته به body هم یه padding دادم که بیشتر قضیه رو لمس کنم:
body{
padding:30px;
}
پس میشه گفت که css reset خیلی واجب و مثمر ثمر میتونه باشه؟؟ چون الان اگه اونو نمیذاشتیم میدیدم که خروجی ها ممکنه متفاوت باشه و این میتونه گاها باعث سردرگمی کاربران بشه.
در واقع میشه اینجور گفت که گذاشتن css reset باعث میشه خروجی هایی از نوع 2 کد فوق (علیرغم تفاوت در ظاهر کد ولی باطنا یکی هستن) دارای خروجی های یکسانی بشن؟؟!!
مرسی و متشکرم دوست عزیزم.
استفاده از این حالت بستگی به نیاز و تا حدودی سلیقه دارد، برخی طراحان ترجیح می دهند ویژگی های پیش فرض را در کلاس مربوط به همان عنصر تغییر دهند و برخی نیز به صورت کلی این ویژگی های را Reset می کنند! در کل با کسب مهارت و تجربه این موضوع خیلی طراحان را به دردسر نمی اندازد.
داوود
۱۳:۴۶ ۱۳۹۴/۰۴/۰۲
سلام آقای مهندس، ظهرتون بخیر و خوشی انشالله؛
ببخشید که مزاحم شدم.
چند خط کد بدین نحو داریم؛ که شما نمیخواد خودتون رو درگیر دیدن همه ش بکنید؛ فقط من جای اصلی رو ازتون میپرسم.
کد الف:
<style type="text/css">
ul .accardion{
background-color:#9900FF;
}
</style>
</head>

<body>
<ul>
<div class="accardion">
<li>
<span>html</span>
<div><p>content 1</p></div>
</li>
<li>
<span>CSS</span>
<div><p>content 1</p></div>
</li>
<li>
<span>java</span>
<div><p>content 1</p></div>
</li>
<li>
<span>PHP</span>
<div><p>content 1</p></div>
</li>
</div>
</ul>
</body>
و حالا کد ب با تغییر خیلی جزئی:
<style type="text/css">
ul.accardion{
background-color:#9900FF;
}
</style>
</head>

<body>

<ul class="accardion">
<li>
<span>html</span>
<div><p>content 1</p></div>
</li>
<li>
<span>CSS</span>
<div><p>content 1</p></div>
</li>
<li>
<span>java</span>
<div><p>content 1</p></div>
</li>
<li>
<span>PHP</span>
<div><p>content 1</p></div>
</li>
</ul>
</body>
ببینید الان از نظر منطقی تغییر خاصی صورت نگرفته جز در اینکه در اولی ul .accardion بود و در دومی ul.accardion . میخواستم ببینم چرا خروجی این دو تا با همدیگه تفاوت داره ؟؟!! اگه اشکالی نداره بعد از پاسخ به این سوال یه قسمت دیگه هم مونده که تو سوال بعدیم ازتون میپرسم.
عذر میخوام ازتون.
تگ های HTML در CSS یک استایل پیش فرض دارند، به طور مثال تگ ul (مخفف unordered list) برای ایجاد لفاف یا Container تگ li (مخفف list item) استفاده می شود و به صورت پیش فرض کمی padding آن از li بیشتر است، این تغییرات جزئی به همین دلایل است، در واقع زمانی که به div استایل اختصاص می دهید، استایل ul در حالت پیش فرض است (منتها چون رنگ پس زمینه ندارد، متوجه آن نمی شوید!)
داوود
۰۳:۲۳ ۱۳۹۴/۰۴/۰۲
با سلا مجدد؛
بازم ازتون ممنون و سپاسگزارم دوست و استاد عزیزم. انشاالله در این ساعات عزیز و مقدس؛ از خداوند هر چی آرزو دارین بهش برسین.
بازهم سپاس و تشکر. مرسی
داوود
۰۹:۵۶ ۱۳۹۴/۰۴/۰۱
سلام؛
آقای مهندس تو همین شبه کد:
div .list span{
display:list-item;
color:#F90004;
}
چرا حتما باید کلاس list به یه تگ html اختصاص داده بشه؟؟ آخه از نظر منطقی چرا نباید این خط جواب بده: (صرفنظر از اینکه اصلا لیست رو برای ایجاد لیستها میخوایم)
ببینید اینجوری:
<div class="list">
<span>first list</span>
<span>first list</span>
<span>first list</span>
<span>first list</span>
</div>
قاعدتا برای هدف قرار دادن یک عنصر خاص قوانینی در CSS تعریف شده که چرایی موضوع به آن بر می گردد، برای هدف شما باید استایل را به شیوه زیر تعریف کرد:
.list span{
display:list-item;
color:#F90004;
}
از نظر منطقی هم استایل شما به این صورت تفسیر می شود:
- تگ div در بالاترین سطح، تگی با کلاس list به عنوان فرزند div، تگ span درون تگ div و کلاس list.
داوود
۰۸:۵۳ ۱۳۹۴/۰۴/۰۱
سلام و صبح بخیر؛ ممنونم ازتون آقای مهندس عزیز. دستتون واقعا درد نکنه؛ فقط مهندس جان امکانش هست همون دو خطی رو که نوشته بودم برام تعریف کنید: یعنی میخوام ببینم آیا تعریفی که خودم کردم درسته یا نه!
همین دو تا خط رو میشه برام تعریف کنید:
div.list span
و
div .list span

منظورم اینه که مثلا بگید span هایی که داخل کلاس لیست هستن و باز اینها خودشون داخل div هستن! اینجوری تقریبا (ببخشید سوالم اگه بی معنیه)
- حالت اول یعنی تگ div ای که کلاس list داشته باشد، تگ span (که درون این div باشد).
- حالت دوم یعنی تگ div، کلاس list (درون div)، تگ span (درون div و کلاس list).
نکته: در هر دو حالت استایل به آخرین عنصر (یعنی span) تعلق می گیرد.
davood
۰۰:۵۳ ۱۳۹۴/۰۴/۰۱
با سلام؛ بامدادتون بخیر و خوشی انشاالله؛ ممنونم که هر شب پاسخم رو میدین؛ یکی از دلخوشی هام دیدن پاسخهای خوب شما در انتهای هرشب است و از اینکه بهتون زحمت میدم عذرخواهم. هر زمان خسته شدین بفرمایین تا کمتر مزاحم بشم دوست عزیز.
نظر لطفا شما است، خیر، تا زمانی که این سایت برپاست پاسخگویی متداول جزء خدمات آن خواهد بود! :-)
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
1 × 7
20 × 20
=