This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

CSS хаки

Браузеры и стандарты. Вечная погоня. Из-за несоответствий стандартам, из-за разных способов рендеринга страниц большая часть времени веб-дизайнера уходит на то, чтобы загладить эти несоответствия (использовать хаки). В итоге, вместо эффективной работы, дизайнер вступает в противоестественные отношения с браузерами, теряя драгоценное время.

Css Хак — специальная CSS конструкция, которую понимают одни браузеры и игнорируют другие. Использование хаков часто говорит о непрофессиональности верстальщика. Но встречаются случаи, когда хак — единственный способ решения проблемы (например общеизвестные баги браузеров (см «Глюки браузеров»)). Не стоит так же забывать, что в наше время спешка — обычное явление. Посему сроками «на вчера» — никого не удивишь. Вот и нет времени разбираться почему не выходит так как хочется.

Плюс css хаков

Это быстрое решение проблемы. Прописали дополнительных строчек и все отлично, верстаем дальше.

Недостатки css хаков

  1. Нет уверенности как поведет себя сайт с выходом новых версий браузеров. Например, написали код с хаком для Firefox, через месяц выходит новая версия Safari и оказывается она тоже воспринимает этот хак! Приходится переделывать.
  2. Многие хаки не проходят валидацию — опасность этого описана в предыдущем пункте.

По возможности старайтесь избегать использования хаков. Для исправления ошибок 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

Синтаксис Кто понимает Пример
Не проходят валидацию (не рекомендуемые)
html:root 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;
		}
		
Не проходят валидацию (не рекомендуемые)
@media all and (min-width: 0)
проходит валидацию 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

Синтаксис Кто понимает Пример
Не проходят валидацию (не рекомендуемые)
body:nth-of-type(1)
update 14.01.10 - не актуально (понимается новыми версиями opera, ff, safari, chrome)
div {
		background: #ff0000;
		}
		body:nth-of-type(1) div {
		background: #000;
		}
		
html:root*
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

';>