CSS хаки. Особенности кроссбраузерной верстки.

Кроссбраузерность кода – основное требование для верстальщика практически в любой web-студии. Для достижения этой задачи есть масса способов. Главный из которых – тщательно продуманная структура документа. Однако, если структура html страницы сложна, или придумать структуру так, чтобы она одинаково отображалась во всех браузерах, не удалось, на помощь верстальщику приходят всевозможные css-хаки. Не претендую на оригинальность или уникальность подборки трюков в этой статье, но постараюсь описать как можно больше способов и инструкций по достижению кроссбраузерности.

Основная головная боль верстальщика в 99,99% связана с браузерами от Microsoft, т.е. с Internet Explorer. Сайт, одинаково хорошо интерпретируемый Opera, Mozilla, Safari и Chrome, может выглядеть совершенно по-разному в Internet Explorer 8, Internet Explorer 7,  не говоря уже о более ранних версиях.

Наиболее красивое решение для обеспечения кроссбраузерности с Internet Explorer — использовать условные комментарии в HTML коде. Суть в том, что для каждой версии браузера создается свой CSS файл, в котором проблемные свойства определенным образом перезаписываются:

Будет работать только в IE6 и ниже:

<!—[if lt IE 6]> <link rel=»stylesheet» type=»text/css» href=»ie6.css» /> <![endif]—>

Условие может быть таким: IE – для любой версии IE

lt IE v – (less than) для всех браузеров IE, версия которых меньше чем v

lte IE v – (less than or equal) для всех браузеров IE, версия которых меньше чем v, или такая же

gte IE v – (greater than or equal) – для IE, версия которых больше или равна v

gt IE v – (greater than) – для IE, версия которых больше v.

Иногда ради того, чтобы переписать одно свойство, подключать новый CSS файл слишком громоздко. Для этого есть специальные CSS-хаки.

CSS хаки для Internet Explorer

* html .class{background:red}  /* В случае если у html-страницы есть доктайп,
этот хак работает только для IE6. В случае quirks-mode, хак работает в IE6 и IE7 */

*+html .class{background:red} /*В случае, если у html-страницы есть доктайп,
этот хак работает в IE7, может понять Opera 9 и ниже */

*:first-child+html .class{background:red} /*В случае, если у html-страницы есть доктайп,
этот хак работает в IE7: */

html>body {} /*Все кроме IE6 */

div, #ie#fix  /* все кроме IE8 */

div+span {...}   /* IE6 и ниже проигнорирует это правило */

div>span {...} /* IE6 и ниже проигнорирует это правило */

.myClass {
color:red\0/; /* только IE8*/
}

.myClass {
color:red\9; /* только IE9*/
}

*:lang(ru) #lightMOD { display: block }
/* Хитрый селектор — все современные браузеры — не IE6 или IE7 */

html>/**/body #lightMOD { display: block }
/* Вживленный комментарий — все современные браузеры — не IE6 или IE7 */

c\olor red; /* IE 6 не работает перед буквами a, b, c, d, e, f */

.ie7b {#color:#00FF00;} /* Хак только для IE7,6 */

 

Если перед свойством в css поставить подчеркивание “_”, или дефис “-“, то эти свойства будут восприниматься только IE версии 6 и ниже.

Если перед свойством в css поставить звездочку ”*”, то эти свойства будут восприниматься только IE версии 7 и ниже.

>body {} выбирает элемент body только в IE7.

html* {} выделяет все элементы внутри элемента html. Только для IE7 и ниже а также Chrome и Safari.

Если после значения свойства поставить !ie, то свойство применится только в браузерах IE.

CSS хаки для Mozilla Firefox

С Mozilla Firefox проблем обычно не бывает. Но тем не менее хаки и для этого браузера могут оказаться полезными:

html:root ваш_элемент {...} /* этот работает ещё и для Safari и chrome*/

ваш_элемент, x:-moz-any-link {...}

ваш_элемент, x:-moz-any-link, x:default { display: block } /* только FF 3.0 */

 

CSS хаки для Opera

@media all and (min-width: 0) {
.class { color: #368EF1; } /* для Opera */
}

html:first-child .class { color: #368EF1; } /* для Opera */

CSS хаки для Safari

html[xmlns*=""] body:last-child .class { color: #368EF1; }
/* для Safari < 4.0 */

body:last-child:not(:root:root) .style { background: #F00; }
/* для Safari < 4.0 */

@media screen and (-webkit-min-device-pixel-ratio:0) {.myClass {...}}
/* для Safari < 4.0 и Chrome */

CSS хаки для Chrome

body:nth-of-type(1) .style{

}