بعد از مدت ها بلاخره فرصتی پیش اومد تا مجددا مقاله ای بنویسم. این بار قصد دارم با مقاله ای در خصوص CSS اما خارج از دنیای طراحی و ساخت آیتم های مختلف در خدمت شما باشم.
شاید تا به حال کمتر نام Combinator ها را در CSS شنیده باشید، اما مطمئنا به وفور از برخی از آن ها استفاده کرده اید. در واقع همانطور که از نام Combinator بر می آید، تنها یک ترکیب کننده است، ترکیب کننده ی چند گزینشگر ساده مثل Tag Selector و یا Class Selector که به عنوان تعیین کننده ی ارتباط بین دو آن ها ایفای نقش می کند. به طور کلی Combinator ها به چهار گروه مختلف تقسیم می شوند که در ادامه به بررسی هر کدام خواهیم پرداخت.
Descendant Selector
از این نوع گزینشگر یکی از پر کاربرد ترین نوع گزینشگر هایی است که بدون شک از آن استفاده کرده اید، کد html زیر را در نظر بگیرید:
1
2
3
4
5
6
7
8
9
|
< ul > < li >Item 1 li > < li > < ol > < li >Sub-item A li > < li >Sub-item B li >
ol >
li >
ul > |
و فرض کنید استایل زیر را به li ها نسبت داده ایم:
1
2
3
4
|
ul li { background-color : Red; } |
همانطور که واضح است کلیه ی li ها به رنگ قرمز در می آیند. این نوع گزینشگر تمام عناصر مورد نظر را در هر عمقی، صرف نظر از عنصر والد آن ها تحت تاثیر قرار می دهد، به همین دلیل به آن Descendant (نوادگان) گفته می شود. در واقع در اینجا ترکیبی از دو Tag Selector را داریم که حد واسط آن ها کاراکتر Space قرار گرفته است. درسته! Space در اینجا یک Combinator محسوب می شود.
حال فرض کنید بخواهیم تنها li های درون ul را انتخاب کنیم، بدیهی است که با Descendant Selector چنین کاری ممکن نیست، به این منظور لازم است از Child Selector استفاده کنیم.
Child Selector
Child Selector یا گزینشگر فرزندی امکان انتخاب فرزندان یک عنصر را در اختیار قرار می دهد، توجه داشته باشید که عناصر فرزند عناصری هستند که مستقیما داخل یک عنصر قرار دارند یا به عبارتی در عمق اول نسبت به عنصر والد خود قرار دارند. در مثال بالا Item 1 فرزند ul محسوب می شود، در حالی که Sub-item A، descendant عنصر ul به حساب می آید. با این تفاسیر برای انتخاب فرزندان از علامت > به عنوان Combinator استفاده می کنیم:
1
2
3
4
|
ul > li { background-color : Red; } |
Adjacent Sibling Selector
این نوع selector که شاید کاربردی کمتر از دو نوع قبل داشته باشد، برای انتخاب عنصر sibling (برادر) یک عنصر کاربرد دارد. در واقع sibling به دو عنصری گفته می شود که دارای parent های یکسان باشند و adjacent به معنی عنصری است که دقیقا بعدا از عنصر مورد نظر به عنوان sibling ظاهر می شود. برای درک بهتر مثال زیر را مشاهده بفرمایید:
1
2
3
|
< h2 >Heading h2 > < p >The selector above matches this paragraph. p > < p >The selector above does not match this paragraph. p > |
1
2
3
4
|
h 2 + p { background-color : Red; } |
دو تگ p به عنوان sibling های عنصر h2 شناخته می شوند، اما رنگ قرمز تنها به تگ p اول نسبت داده خواهد شد، به دلیل اینکه مستقیما پس از h2 قرار گرفته و به عبارتی adjacent محسوب می شود.
General Sibling Selector
این selector بر خلاف نوع قبل کلیه ی sibling های قرار گرفته پس از عنصر مورد نظر را تحت پوشش قرار می دهد و به همین دلیل از آن به عنوان General یاد می شود. Combinator مورد استفاده در این گزینشگر علامت ~ می باشد:
1
2
3
4
|
h 2 ~ p { background-color : Red; } |
با توضیحات داده شده در قسمت قبل فکر نمی کنم نیاز به بیان جزئیات بیشتری باشد، تنها نکته ی قابل ذکر این است که 3 selector ای که پیش تر توضیح داده شد از گزینشگر های موجود در CSS 2.1 بودند در حالی که این گزینشگر در نسخه ی سوم به CSS اضافه شد.
برای استفاده از این ابزار ابتدا آن را از اینجا دانلود کنید: PIE
یکی از فایل های موجود در بسته ی دانلود شده، فایلیست به نام PIE.htc که عمل رندر دستورات css3 را برای اینترنت اکسپلورر انجام می دهد. البته قابل ذکر است که تنها برخی از خصوصیاتی که کاربرد بیشتری دارند توسط pie پشتیبانی می شوند، نه همه خصوصیات css3. خصوصیات پشتیبانی شده به صورت زیر می باشند:
حال استفاده از برخی از خصوصیات را در قالب یک مثال ساده بیان می کنم. فرض کنید خصوصیات زیر را به یک div نسبت داده ایم:
1
2
3
4
5
6
7
8
|
.elm { border : 1px solid #000 ; border-radius: 10px ; width : 200px ; height : 200px ; background-color : #fff ; } |
برای رندر کردن خصوصیت border-radius در ie تنها کافیست خط زیر را به خصوصیات بالا اضافه کنید:
1
2
3
4
5
|
.elm { ... behavior: url ( "PIE.htc" ); } |
1
2
3
4
5
|
.elm { ... box-shadow: 10px 10px 5px #acacac ; } |
1
2
3
4
5
|
.elm { ... -pie- background : url ( "up.png" ) no-repeat center center , linear-gradient( #eee , #ccc ); } |
1
2
|
box-shadow: 10px 10px 0 rgba( 118 , 246 , 211 , 0.4 ); -pie- background : rgba( 118 , 246 , 211 , 0.4 ) url ( "up.png" ) no-repeat center center ; |
1
2
3
4
5
|
.test { background : url ( "up.png" ) no-repeat left top ; border : 1px solid #000 ; } |
1
2
3
4
5
6
7
|
.test { background : url ( "up.png" ) no-repeat left top ; border : 1px solid #000 ; -pie-png-fix: true; behavior: url ( "PIE.htc" ); } |