CSS хаки

CSS хаки

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

В этой статье рассматриваются 14 CSS хаков (их еще называют CSS-фильтрами), которые помогут вам решить некоторые проблемы несоответствия браузеров.

1. Box Model хак

Box Model хак используется для того, чтобы справиться с глюком эксплорера, в котором border и padding включаются в ширину элемента

padding: 4em;
border: 1em solid red;
width: 30em;
width/**/:/**/ 25em;

Посмотреть на примере.

2. Условные комментарии

Условные комментарии работают только в IE под Windows, для других браузеров они являются обычными комментариями, поэтому их можно безболезненно использовать. Синтаксис такой:

<!--[if условие]> HTML <![endif]-->

Если же вы хотите проигнорировать эксплорером какой-то кусок кода, то используйте такой комментарий:

 <!--[if !condition]> HTML <![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.

Пример использования:

<!--[if lte IE 6]> <link rel="stylesheet" type="text/css" href="ie_sucks.css" /> <![endif]-->

3. Min-width и max-width: максимальная и минимальная ширина блока

IE, падла, не понимает эти свойства css. Хак для блока с id “wrapper” выглядит так:
А) Минимальная ширина 750px

#wrapper {
min-width: 750px;
width:expression(document.body.clientWidth < 750? "750px": "auto" );}

Б) Максимальная ширина 1220px, минимальная 750px

#wrapper {
min-width: 750px;
max-width: 1220px;
width:expression(document.body.clientWidth < 750? "750px" : document.body.clientWidth > 1220? "1220px" : "auto");}

Min-height хак от Дастина Диаза

elector {
min-height:500px;
height:auto !important;
height:500px; }

4. Простые селекторы

Не обязательно создавать отдельные css-файлы для разных браузеров, если разница в рендеринге не так уж велика.Можно использовать следующие css-селекторы в вашем основном css-файле:

IE 6 и ниже * html {}

IE 7 и ниже *:first-child+html {} * html {}

IE 7 только *:first-child+html {}

IE 7 и нормальные браузеры html>body {}

Только нормальные браузеры (не IE 7) html>/**/body {}

Опера версии 9 и ниже html:first-child {}

Пример использования: Пусть нам надо назначить для для селектора #news .title только в IE7 некоторые свойства. Делается это так:

*:first-child+html #news .title {
/*необходимые свойства*/
}

5. !important

У IE версии 6 и меньше проблемы с идентификатором !important, который используется для того, чтобы объявление некоторого свойства было проигнорировано, даже если это объявление появляется позже текущего. Пример:

<style type="text/css">
p {
background: green !important; /* для нормальных браузеров и IE>6 это свойстов остается, потому что оно помечено как important */
background: red; /* IE 6 и ниже использует это свойство, срать ему на !important */
} </style>

 

6. @import “nonie.css” all;

IE 7 и ниже не поддерживает медиаселекторы @import. Поэтому можно написать css для нормальных браузеров и импортировать его в ваш css используя

@import “nonie.css” all;

Этот хак работает для IE версии 7 и ниже, может не работать в следующих версиях IE

 

7. body[class|="page-body"]

<style type="text/css">
p {
background: red; /* Применимо ко всем браузерам */
}

body[class|="page-body"] p {
background: green; /* Применимо к IE7 и большинству нормальных браузеров, кроме Оперы */
}
</style>

Все вышеназванные хаки используют валидный css. Следующие позволят вам быстро решить проблему, но сделают css не валидным. НЕ советуется для использования.

8. Подчеркивание и дефис

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

Пример использования:

<style type="text/css">
p {
background: red; /* Применимо ко всем браузерам */
_background: green; /* Применимо к IE6 и ниже */
}
</style>

9. Звездочка

Работает для IE7 и ниже

<style type="text/css">
p {
background: red; /* Применимо ко всем браузерам */
*background: green; /* Применимо к IE6 и ниже */
}
</style>

Напомню, что этот хак использует невалидный css и является нерекомендуемым к использованию.

10. body:empty

Вообще говоря, :empty – это псевдо класс, который описан для CSS3, и который должен выбирать элементы, которые не имеют внутри других элементов или текста. Тем не менее, если использовать его для элемента body, Firefox 1.5 и Firefox 2 всегда выбирают его, даже если внутри тэга боди есть содержимое.

Итак, этот хак скорее всего будет валидным в CSS3, но в настоящее время не является валидным для CSS2.x.

Резюмируем:

body:empty{}

выбирает тэг body в FF1.5 и FF2.0. Может быть не будет работать в следующих версиях.

11. a:link:visited, a:visited:link

В соответствии со стандартами, псевдотеги :link и :visited взаимно исключаемы, то есть :link означает непосещенную ссылку. Тем не менее, IE 7 и ниже проигнорируют эти псевдо-классы, если какой-нибудь другой появится ниже в том же селекторе.

Пример:

 a:link:visited, a:visited:link {}

выбирает элемент a в IE7 и ниже.

12. >body

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

13. html* {}

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

14. !important!

Как мы уже говорили, у эксплорера нелюбовь с идентификатором !important. Зато он понимает идинтификатор !important! (другие браузеры не воспринимают такое свойство). Работает для IE7 и ниже.

На этом обзор хаков закончен. Надеемся вам понравилось. О PNG и прозрачности будет написано в другой статье.

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 26

skippi
вообще пункт "Условные комментарии" намного полезнее всех остальных %)
#
skippi
Жека
Да, использовать условные комменты - самое красивое решение. Не надо портить хорошо написанный css, а в будущем ненужные условные комменты можно удалить.
Евгений
Откровенно о наболевшем. Автор, молодец. Хотелось бы увидеть хак под Safari
#
Евгений
w-power.ru
Еще к хакам с дефисами и др. символами можно добвить следующее: 1. //width:100px; - так написаное свойство проигнорируют все браузеры кроме ie 7.0 и меньше 2. _width:100px; - видят только ie 6.0 и меньше. ie7 не воспримет 3. \width:100px; - видят только ie 5.0 и ie 5.5
#
w-power.ru
kinder
для ie 6 свойства max-width и min-width в зависимости от режима отображения страницы

width: expression((document.compatMode &
#
kinder
kinder
хе хе, а тег <code
#
kinder
kinder
млин... ничего не работает :(
#
kinder
PVasili
Автор не путайте людей в приамбеле. О чем пишем? Вы видели стандарты на WEB? Поделитесь ссылками ;) Есть рекомендации, а рекомендовать - не значит жениться...
#
PVasili
Евгений
4. Простые селекторы - еще как работает. Огоромное спасибо!!!!
#
Евгений
Ольга
А как сделать так, чтоб картинку видели все браузеры, кроме IE?
#
Ольга
Grin
Если с помощь этих хаков, то как-то вот так:
img#img_id {
_display: none;
}
#
Grin
chif
тема! два дня таблицу стилей подгонял, а тут за минуты. поклон
#
chif
alexpts
Полезный обзор хаков, не все знал раньше.
PVasili
"11 п. В соответствии со стандартами..." - интересно а где автор такое видел?
Ссылкой не поделитесь?
Евгений
PVasili, буду откровенен, я не знаю откуда взялись эти слова. Можете их проигнорировать.
Дмитрий
Женя, пример c !important для IE6 не совсем понятен. Какой-то он искусственный. А в случае, когда свойство, для которого применяется !important, встречается только один раз в селекторе, все отлично работает.
#
Дмитрий
PVasili
в 11. и в самом начале страницы. Как то ухо режет... Прямо, как законы нарушены ;)

Замените на "спецификации", так будет логичнее :).
Тем более создатели IE участвовали в их создании(погуглите на фамилию Могилевский из MS).

А раз нет стандартов, то и многое отдано на откуп рендерющему движку...
Спасибо за статью, не знаю как добавить вам свои "заметки" :(
Aleko
Вот здесь я специально собрал проверенную отличную подборку css хаков. Надеюсь вам поможет: http://studioad.ru/blog/css_haki_css_hacks_css_filters/2009-09-30-92
#
Aleko
Евгений
Хорошая подборка. Спасибо.
#
Евгений
Alex
Спасибо Автору! Замечательная статья! Юзфул на все 100%!
#
Alex
Andrey
Здравствуйте! У меня не работает вот этот код:
width:expression(document.body.clientWidth < 750? "750px" : document.body.clientWidth > 1220? "1220px" : "auto");}
Что можете посоветовать?
#
Andrey
viking
Попробуйте
width:expression( documentElement.clientWidth < 800 ? (documentElement.clientWidth == 0 ? (body.clientWidth < 800 ? "800" : "auto") : "800px") : "auto" );
#
viking
Etual
Спасибо, раньше не приходилось сталкиваться с хаками, статья дала общее представление,понятно)
#
Etual
Гриша
Не плохая статья по CSS хакам: здесь
#
Гриша
TheMacros
Спасибо, хорошая статья по хакам

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
counter strike mt2 silkroad pvp metin2 metin2 pvp knight pvp gm olarak başlayan pvpler pvp silkroad pvp serverler counter strike serverler msn show cam show görüntülü sohbet oyunlar suskunlar gazete oku