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>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler