CSS хаки
Браузеры и стандарты. Вечная погоня. Из-за несоответствий стандартам, из-за разных способов рендеринга страниц большая часть времени веб-дизайнера уходит на то, чтобы загладить эти несоответствия (использовать хаки). В итоге, вместо эффективной работы, дизайнер вступает в противоестественные отношения с браузерами, теряя драгоценное время.
Css Хак — специальная CSS конструкция, которую понимают одни браузеры и игнорируют другие. Использование хаков часто говорит о непрофессиональности верстальщика. Но встречаются случаи, когда хак — единственный способ решения проблемы (например общеизвестные баги браузеров (см «Глюки браузеров»)). Не стоит так же забывать, что в наше время спешка — обычное явление. Посему сроками «на вчера» — никого не удивишь. Вот и нет времени разбираться почему не выходит так как хочется.
Плюс css хаков
Это быстрое решение проблемы. Прописали дополнительных строчек и все отлично, верстаем дальше.
Недостатки css хаков
- Нет уверенности как поведет себя сайт с выходом новых версий браузеров. Например, написали код с хаком для Firefox, через месяц выходит новая версия Safari и оказывается она тоже воспринимает этот хак! Приходится переделывать.
- Многие хаки не проходят валидацию — опасность этого описана в предыдущем пункте.
По возможности старайтесь избегать использования хаков. Для исправления ошибок IE используйте отдельный CSS-файл, котjрый подключается с помощью условных комментариев.
Глоссарий
Кросс-браузерность — свойство сайта отображаться и работать во всех популярных браузерах идентично.
Хак — исправление ошибки или добавление новой функции посредством использования другой недокументированной или некорректно реализованной особенности.
Грязный хак — это быстрое решение какой-либо проблемы, в основном в краткосрочной перспективе, лишающее сущность код внутренней красоты и дисгармонирующее с её внутренним устройством.
CSS-хаки для браузера Internet Explorer
ZOOM:1 :Хак, предназначенный для определения hasLayout
* { zoom : 1 ; }
PNG в IE6 :
Для IE6 подключается htc-файл iepngfix.htc, для правильной работы фоновых изображений формата PNG для всех элeментов, в файле cssf-ie6.css. Используется IE PNG Fix v1.0 RC4 последней версии.
* { behavior : url ( "css/iepngfix.htc" ); }
Если важны байты есть пример использования фильтра для IE:
.class { background : none ; filter : progid : DXImageTransform.Microsoft.AlphaImageLoader ( src= '/images/png-image.png' , sizingMethod= 'scale' ); }
Отделение стилей от IE6 :
html>body .class { }head+body .class { }html:first-child .class { }
Отделение стилей от IE6 и IE7 :
html>/**/body { }
Отделение стилей от IE6 — IE8 :
*|html .class { }html:not([lang*=""]) .class { }
Conditional comments в IE :
Условные комментарии работают только в IE под Windows, для других браузеров они являются обычными комментариями, поэтому их можно безболезненно использовать. Синтаксис такой:
<!--[if условие]> <link href= "styles.css" rel= "stylesheet" media= "all" /> <![endif]--><!--[if !условие]> <link href= "styles.css" rel= "stylesheet" media= "all" /> <![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. */
Conditional comments в IE6, IE7, IE8 :
<!--[if IE 6]> <link href= "ie6.css" rel= "stylesheet" media= "all" /> <![endif]-->/* Таблица стилей для IE6 */
<!--[if IE 7]> <link href= "ie7.css" rel= "stylesheet" media= "all" /> <![endif]-->/* Таблица стилей для IE7 */
<!--[if IE 8]> <link href= "ie8.css" rel= "stylesheet" media= "all" /> <![endif]-->/* Таблица стилей для IE8 */
Box Model хак :
В IE существуют глюки, когда border и padding включаются в ширину элемента. Box Model хак фиксит их.
.class { padding : 4em ; border : 1em solid red ; width : 30em; width /**/ : /**/ 25em ; } /* Для IE ширина блока меньше на величину padding + border */
Min-width и max-width в IE :
IE не понимает эти свойства css. Хак для блока выглядит так:
.class { min-width : 500px ; width : expression ( document.body.clientWidth < 500? "500px" : "auto" );}/* Для IE ширина блока меньше на величину padding + border */
.class { min-width : 500px ; max-width : 750px ; width : expression ( document.body.clientWidth < 500? "500px" : document.body.clientWidth > 750? "750px" : "auto" );}/* Для IE ширина блока меньше на величину padding + border */
Min-height хак от Дастина Диаза
.class { min-height : 100% ; height : auto !important ; height : 100% ; }
Простые селекторы:
Не обязательно создавать отдельный файл для разных браузеров. Можно использовать индивидуальные css-селекторы в основном css-файле:
* html .class { } /* В случае, если у html-страницы есть доктайп, этот хак работает в IE6 *//* В случае quirks-mode, хак работает в IE6 и IE7. */*:first-child+html .class { } /* Для IE 7 и ниже (first-child) */*+html .class { } /* Для IE 7 */*:first-child+html .class { } /* Для IE 7 */html>body .class { } /* Для IE 7 и нормальных браузеров */html>/**/body .class { } /* Для нормальных браузеров (кроме IE 7) *//* Пример: .class { background:red } *html .class { background:green } Во всех браузерах кроме IE6 и ниже бэкграунд будет красный, а в IE6 и ниже браузерах - зеленый */
Грязные хаки для IE6 :
.class { _background : #F00 ; }.class { -background : #F00 ; }.class { c\olor : #F00 ; } /* Не работает перед буквами a, b, c, d, e, f */
Грязные хаки для IE7 :
>body { background : #F00 ; }/* выбирает элемент body только в IE7 */html* { background : #F00 ; }/* выделяет все элементы внутри элемента html. Только для IE7 и ниже */-,.class { background : #F00 ; }.class { background : #F00 !important! ; }/* Хак работает по аналогии со свойством !important. Работает для IE7 и ниже */
Грязные хаки для IE8 :
.class { background : #F00\0/ ; }/* выбирает элемент body только в IE7 */
Грязные хаки, работающие в IE6 и IE7 :
.class { *background : #F00 ; }.class { //background : #F00 ; }.class { background : #F00 !ie ; }/* Хак работает по аналогии со свойством !important */
CSS-хаки для браузера Mozila FireFox
Хаки для всех версий MFF :#class[id=class] { color : #F00 ; }@-moz-document url-prefix () { .class { color : #F00 ; } } *>.class { color : #F00 ; }
Для MFF 1.5 и выше :
.class, x:-moz-any-link, x:only-child { color : #F00 ; }
Для MFF 2.0 и выше :
body:empty .class { color : #F00 ; }#class[id=CLASS] { color : #F00 ; }html>/**/body .class, x:-moz-any-link { color : #F00 ; }
Для MFF 3.0 и возможно выше :
html>/**/body .class, x:-moz-any-link, x:default { color : #F00 ; }
CSS-хаки для браузера Google Chrome
body:nth-of-type(1) .class { background : #000 ; }
CSS-хаки для браузера Opera
Хаки для всех версий Opera :@media all and (-webkit-min-device-pixel-ratio:10000), not all and ( -webkit-min-device-pixel-ratio : 0 ) { .style { background : #F00 ; } }
@media all and ( min-width : 0px ) { .class { color : #F00 ; } }
Для Opera 6 :
@media all and ( min-width : 1px ) { { } .class { color : #F00 ; } }
Для Opera 7, 8 :
@media all and ( min-width : 1px ) { .class { color : #F00 ; } }
Для Opera 9 :
@media all and ( width ) { .class { color : #F00 ; } }
@media all and ( min-width : 0px ) { head~body .class { color : #F00 ; } }
CSS-хаки для браузера Safari
body:first-of-type .class { color : #F00 ; }html:root*.class { color : #F00 ; }body:first-of-type .class { color : #F00 ; }body:first-of-type .class { color : #F00 ; }
@media screen and ( -webkit-min-device-pixel-ratio : 0 ) { .class { color : #F00 ; } } /* Хак для Opera и Safari */
Selector Hacks
/***** Selector Hacks ******/ /* IE6 and below */ * html #uno { color: red } /* IE7 */ *:first-child+html #dos { color: red } /* IE7, FF, Saf, Opera */ html>body #tres { color: red } /* IE8, FF, Saf, Opera (Everything but IE 6,7) */ html>/**/body #cuatro { color: red } /* Opera 9.27 and below, safari 2 */ html:first-child #cinco { color: red } /* Safari 2-3 */ html[xmlns*=""] body:last-child #seis { color: red } /* safari 3+, chrome 1+, opera9+, ff 3.5+ */ body:nth-of-type(1) #siete { color: red } /* safari 3+, chrome 1+, opera9+, ff 3.5+ */ body:first-of-type #ocho { color: red } /* saf3+, chrome1+ */ @media screen and (-webkit-min-device-pixel-ratio:0) { #diez { color: red } } /* iPhone / mobile webkit */ @media screen and (max-device-width: 480px) { #veintiseis { color: red } } /* Safari 2 - 3.1 */ html[xmlns*=""]:root #trece { color: red } /* Safari 2 - 3.1, Opera 9.25 */ *|html[xmlns*=""] #catorce { color: red } /* Everything but IE6-8 */ :root *> #quince { color: red } /* IE7 */ *+html #dieciocho { color: red } /* IE 10+ */ @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { #veintiun { color: red; } } /* Firefox only. 1+ */ #veinticuatro, x:-moz-any-link { color: red } /* Firefox 3.0+ */ #veinticinco, x:-moz-any-link, x:default { color: red } /* FF 3.5+ */ body:not(:-moz-handler-blocked) #cuarenta { color: red; }
Attribute Hacks
/***** Attribute Hacks ******/ /* IE6 */ #once { _color: blue } /* IE6, IE7 */ #doce { *color: blue; /* or #color: blue */ } /* Everything but IE6 */ #diecisiete { color/**/: blue } /* IE6, IE7, IE8, but also IE9 in some cases :( */ #diecinueve { color: blue\9; } /* IE7, IE8 */ #veinte { color/*\**/: blue\9; } /* IE6, IE7 -- acts as an !important */ #veintesiete { color: blue !ie; } /* string after ! can be anything */ /* IE8, IE9 */ #anotherone {color: blue\0/;} /* must go at the END of all rules */ /* IE9, IE10 */ @media screen and (min-width:0\0) { #veintidos { color: red} }
Property prefix hacks
/* Property prefix hacks */ /* IE6 only - any combination of these characters */ _ - ? ¬ ¦ /* IE6/7 only - any combination of these characters */ ! $ & * ( ) = % + @ , . / ` [ ] # ~ ? : < > |
@media hacks
/* @media hacks */ /* IE6/7 only (via Keith Clarke) */ @media screen\9 { } /* IE6/7/8 (via Keith Clarke) */ @media \0screen\,screen\9 {} /* IE8 (via Keith Clarke) */ @media \0screen { } /* IE8/9 */ @media screen\0 { }
Список CSS хаков для разных браузеров, IE6, IE7, IE8, FireFox, Opera, Safari, Chrome
/* хак только для IE8 Only */.myClass { color:red\0/; /* красный */ padding:70px\0/; /* отступ 70px только для Internet Explorer 8 */ } /* IE 6 Only */* html .myClass { ... } /* All except IE6 standards */.myClass { property /**/: value; } /* Firefox & IE 7, и выше */html>body .myClass { ... } /* Modern browsers only (not IE 7) */html>/**/body .myClass { ... } /* IE 7 Only */*:first-child+html .myClass { ... } /* Firefox Only */@-moz-document url-prefix() { .myClass { ... } } /* Opera Only */noindex:-o-prefocus, .MyClass { color:red; } /* IE7 Only */div[class^="myClass"] .myClass2 { ... } /* IE7 only */*+html .myClass { ... } /* hack for Opera <=9 */html:first-child .myClass { ... } /* Firefox, Opera, Konqueror, Safari */*|html .myClass { ... } /* IE8 beta 2 only (?)*/html:first-child .myClass [attr|=a-b] { ... } /* IE5/Mac only *//*\*//*/ .myClass { property: value; } /**/ /* Gecko only */.myClass:not([attr*=""]) { ... } /* Opera */@media all and (min-width: 0px) { html:first-child .myClass { ... } } /* Safari only */.myClass:not(:root:root) { ... } /* Safari 3.0 and Chrome only */@media screen and (-webkit-min-device-pixel-ratio:0) { .myClass { .... } } /* Chrome browser */body:nth-of-type(1) .myClass { ... } /* Safari browser css hack */body:first-of-type .myClass {property:value;}
CSS для Explorer
<!--[if IE]> ... если Internet Explorer .. <link href="ie-fix.css" type="text/css" rel="stylesheet"> <![endif]--> <!--[if IE 6.0]> ... если IE6 <![endif]--> <!--[if IE 7]> ... если IE7 <![endif]--> <!--[if gte IE 5]> ... если IE5+ <![endif]--> <!--[if lt IE 6]> .. если ниже IE 6 <![endif]--> <!--[if lte IE 5.5]> ... если ниже или равно IE 5.5 <![endif]--> <!--[if gt IE 6]> ... если выше IE 6 <![endif]-->
Полупрозрачность фона в IE, Firefox, Opera
.myClass { background-color:#000; -moz-opacity:.82; /* Firefox */ opacity:.82; /* Opera */ filter:alpha(opacity=82); /* IE */ }
Убрать лишний padding в button в Firefox
button::-moz-focus-inner { border: 0; padding: 0; }
Chrome/Firefox ... ?
button { -webkit-border-fit: lines; }
Firefox 2
html>/**/body .selector, x:-moz-any-link { color:lime;}
Firefox 3
html>/**/body .selector, x:-moz-any-link, x:default { color:lime;}
Any Firefox
@-moz-document url-prefix() { .selector { color:lime; }}
Дополнительно
Хаки для IE
Синтаксис | Кто понимает | Пример |
Проходят валидацию | ||
---|---|---|
* html | IE6 | div { background: #ff0000; } * html div { background: #000; } |
!important | IE6 | div { background: #ff0000 !important; /* для всех браузеров */ background: #000; /* для IE6 */ } |
*:first-child+html | IE7 | div { background: #ff0000; } *:first-child+html div { background: #000; } |
*+html | IE7+ может понять Opera 9 и ниже | div { background: #ff0000; } *+html div { background: #000; } |
html>body | поймут все кроме IE6 | div { background: #ff0000; } html>body div { background: #000; } |
#ie#fix | поймут все кроме IE8 | div { background: #ff0000; /* для ie8 */ } div, #ie#fix { background: #000; /* для остальных браузеров */ } |
Не проходят валидацию (не рекомендуемые) | ||
_свойство: значение и -свойство: значение | IE6 | div { background: #ff0000; /* для всех браузеров */ _background: #000; /* для IE6 */ } |
*свойство: значение и //свойство: значение | IE6 IE7 | div { background: #ff0000; /* для всех браузеров */ *background: #000; /* для IE6 и IE7 */ } |
html* | IE6 IE7 Chrome Safari | div { background: #ff0000; } html* div { background: #000; } |
!ie | IE6 IE7 | div { background: #ff0000; /* для всех браузеров */ background: #000 !ie; /* для IE6 и IE7 */ } |
Хаки для Firefox
Синтаксис | Кто понимает | Пример |
Не проходят валидацию (не рекомендуемые) | ||
---|---|---|
FF 1.5+ Opera 9.6 update: 14.01.10 неактуально (понимают новые версии opera, chrome, safari) | div { background: #ff0000; } html:root div { background: #000; } | |
x:-moz-any-link | FF 1.5+ IE7 | div { background: #ff0000; } div, x:-moz-any-link { background: #000; } |
@-moz-document url-prefix() | FF 1.5+ | div { background: #ff0000; } @-moz-document url-prefix() { div { background: #000; }} |
Хаки для Opera
Синтаксис | Кто понимает | Пример |
Проходит валидацию | ||
---|---|---|
html:first-child | Opera 7-9.01 | div { background: #ff0000; } html:first-child div { background: #000; } |
Не проходят валидацию (не рекомендуемые) | ||
проходит валидацию CSS3 | Opera 9-9.6
update 14.01.10 не актуально (понимается новыми версиями ff, chrome, safari) | div { background: #ff0000; } @media all and (min-width:0) { div { background: #000; }} |
html>/**/body noindex:-o-prefocus, html>/**/body | Opera 9.5-10 | html>/**/body noindex:-o-prefocus, html>/**/body p { color:#0f0 } |
Хаки для Chrome и Safari
Синтаксис | Кто понимает | Пример |
Не проходят валидацию (не рекомендуемые) | ||
---|---|---|
update 14.01.10 - не актуально (понимается новыми версиями opera, ff, safari, chrome) | div { background: #ff0000; } body:nth-of-type(1) div { background: #000; } | |
update 14.01.10 - не актуально (понимается новыми версиями opera, ff, safari, chrome) | div { background: #ff0000; } html:root*div { background: #000; } | |
html* | Safari Chrome IE6 IE7 | div { background: #ff0000; } html*div { background: #000; } |
Хаки Konqueror
Синтаксис | Кто понимает | Пример |
Не проходят валидацию (не рекомендуемые) | ||
---|---|---|
html:not(:nth-child(1)) #element | Konqueror FF 3.5 | #div { background: #ff0000; } html:not(:nth-child(1)) #div { background: #000; } |
Created/Updated: 25.05.2018