Хак с применением подчеркивания или дефиса. Хак с применением дочернего селектора
При использовании семантической верстки каждый разработчик обязательно столкнется с проблемами кроссбраузерности, для решения которых в большинстве случаев приходится использовать так называемые «хаки». Обычно под этим термином подразумевается особый способ написания селекторов или правил, понимаемый только конкретным браузером. Однако совместимость с CSS в большинстве браузеров уже достигла уровня, при котором следует ограничивать использование «хаков».
Как правило, основным источником неприятностей бывает Internet Explorer. Многообразие ошибок в реализации CSS в браузерах Microsoft удивляет даже самых опытных верстальщиков. В связи с этим возникают ситуации, когда необходимо использовать дополнительные или альтернативные правила для IE. Именно в таких случаях рекомендуется применять «хаки». Если же вам вдруг понадобились альтернативные правила, скажем, только для Firefox, то рекомендуется пересмотреть ваш код, и в 99% случаев вы найдете более элегантное решение.
CSS-хаки для браузера Opera
*|html .style { background: #F00; } html:first-child .style { background: #F00; }CSS-хаки для браузера FireFox
@-moz-document url-prefix() { .style {background: #F00;} }CSS-хаки для браузера Internet Explorer 6.0 и ниже
.style { _background: #F00; } * html .style { background: #F00; }CSS-хаки для браузера Internet Explorer 7.0
*+html .style { background: #F00; } html>body .style { *background: #F00; }CSS-хаки для браузера Safari
body:last-child:not(:root:root) .style { background: #F00; } html body:last-child .style { background: #F00; }Для Internet Explorer существует альтернативное решение - conditional comments (условные комментарии). Данная технология поддерживается в Internet Explorer, начиная с пятой версии, тем самым охватывая все интересующие нас браузеры. Ниже приводится пример использования условных комментариев:
Первой строкой идет обычное подключение CSS-файлов, однако вторую строку, увидят, а следовательно и подгрузят css-файл только браузеры семейства Internet Explorer. Происходит это благодаря условию, заложенному в условном комментарии - if IE. Данное условие означает «если Internet Explorer» и Explorer’ы версии пять и выше прочитают код, находящийся внутри комментария и интерпретируют его.
Таким образом все наши хаки можно вынести в отдельный файл.
И еще раз позволю себе повториться. Время IE6 подходит к концу, и на сегодняшний день практически все современные браузеры отображают валидный код вполне адекватно. Поэтому, в случае возникновения проблем с отображением страницы в каком либо браузере, прежде чем прибегать к хакам, просмотрите заново свой код, поэкспериментируйте, поищите информацию в интернете, и скорей всего ненужных хаков можно будет избежать, добившись таким образом абсолютной валидности вашего кода.
При использовании семантической верстки каждый разработчик обязательно столкнется с проблемами кроссбраузерности, для решения которых в большинстве случаев приходится использовать так называемые «хаки». Обычно под этим термином подразумевается особый способ написания селекторов или правил, понимаемый только конкретным браузером. Однако совместимость с CSS в большинстве браузеров уже достигла уровня, при котором следует ограничивать использование «хаков».
Как правило, основным источником неприятностей бывает Internet Explorer. Многообразие ошибок в реализации CSS в браузерах Microsoft удивляет даже самых опытных верстальщиков. В связи с этим возникают ситуации, когда необходимо использовать дополнительные или альтернативные правила для IE. Именно в таких случаях рекомендуется применять «хаки». Если же вам вдруг понадобились альтернативные правила, скажем, только для Firefox, то рекомендуется пересмотреть ваш код, и в 99% случаев вы найдете более элегантное решение.
Наиболее популярным хаком на сегодня остается так называемый «star html hack» :
#element { position:relative; /* Основное правило для всеx браузеров */ } * HTML #element { position:static; /* Переопределение правила для IE младше седьмой версии */ }
В валидных HTML- и XHMTL-документах селектор HTML всегда играет роль корневого элемента, а BODY - потомка первого уровня, но не второго или более высокого уровня. Таким образом, теоретически селектор «* HTML» не должен применяться ни к одному элементу. Но на практике IE пятых и шестых версий из-за ошибки в собственном движке интерпретируют данный селектор как HTML и применяют указываемые правила. Поскольку остальные современные браузеры селектор «* HTML» игнорируют, этот прием можно использовать в корыстных целях. Это полезно, но правильно ли?
Несмотря на то что данный хак корректен с точки зрения стандарта CSS, есть ряд негативных нюансов.
Как же укротить Internet Explorer, не используя хаки?
Альтернативный выход
В недрах Microsoft Developer Network есть решение получше - . Данная технология поддерживается в Internet Explorer, начиная с пятой версии, тем самым охватывая все интересующие нас браузеры. Ниже приводится пример элегантного использования условных комментариев:
Обычное подключение CSS-файлов, однако увидят вторую строку, а следовательно и подгрузят css-файл только браузеры семейства Internet Explorer. Происходит это благодаря условию, заложенному в условном комментарии - if IE. Данное условие означает «если Internet Explorer» и Explorer’ы версии пять и выше (включая свежий седьмой) прочитают код, находящийся внутри комментария и интерпретируют его.
Таким образом все наши хаки можно вынести в отдельный файл:
style.css:
#element { position:relative; /* Основное правило для всеx браузеров */ }
#element { position:static; /* Переопределение правила для IE всех версий */ }
Теперь мы не используем хаки в основном листе стилей; добились того, что альтернативное правило было применено ко всем Explorer’ам, включая седьмой; а также избавили пользователей альтернативных браузеров от загрузки лишнего кода. При этом мы сохранили наш (X)HTML и CSS валидным, так как такой условный комментарий не распознается никем иным кроме IE, включая даже валидатор от W3C.
Условные комментарии гибче, чем кажется на одном примере. Вы можете охватить не только все Explorer’ы, но и все его версии ниже или выше определенной или конкретную его версию; а также подгрузить код, который будут интерпретировать все браузеры, кроме Internet Explorer. К сожалению, это уже тема для отдельной статьи и с этими возможностями читателю следует ознакомится самостоятельно.
position: relative
- The IE/Win Disappearing List-Background Bug
- IE6 Border Chaos
Данное правило также часто применяется для спонтанно пропадающих блоков. Не падающих или неправильно отображающихся, а именно пропадающих. Особенно грешит этим Internet Explorer 5.0.
height: 1%
- The IE6 Three Pixel Text-Jog
- The IE Escaping Floats Bug
- IE and italics (будьте осторожны с 5.0, используйте экранирование)
- IE/Win Unscrollable Content Bug
- IE/Win Guillotine Bug
Применяется также для клиаринга элементов. Задается контейнеру, содержащему float’ы.
display: inline
- Floats, Margins and IE
- The IE Doubled Float-Margin Bug
display: inline-block
- Quirky Percentages in IE6’s Visual Formatting Model
- Аналог height: 1% для IE 7.
И еще пара советов:
Во-первых, используйте данные правила по-возможности только для IE. Причем для разных версий решение может отличаться (чаще это относится к height: 1% и zoom: 1).
Во-вторых, столкнувшись с нежелательным поведением Explorer’а, которому нет документированного объяснения (или вам просто лень его искать) - попробуйте последовательно применить к проблемному элементу все правила, влияющие на свойство hasLayout. Псоледовательный метод перебора очень часто используется в нашей професии.
На этой странице описаны CSS хаки для IE , используя которые можно назначить HTML-элементу какие-то свойства, понимаемые только этим браузером, но игнорируемые другими.
CSS хаки для IE6
Браузер IE6 имеет больше всего багов и проблем с пониманием стандартов W3C, хотя для своего времени он был очень неплох.
Хак с применением правила CSS !important
Хак с применением селектора * html
Этот CSS хак для IE6 связан с применением универсального селектора , который ассоциируется в CSS сразу со всеми HTML-элементами на странице. Однако если его использовать в создании селектора потомков , где указать перед селектором html , то это будет противоречить всякой логике, хотя синтаксис CSS и не будет нарушен. Ведь получается, что таким объявлением мы говорим браузерам, что на странице присутствуют элементы, которым тег является потомком. Естественно этого не может быть, так как данный тег - это корневой элемент HTML-страницы, и все браузеры это понимают и игнорируют такой селектор, но только не IE6.
Синтаксис:
* html селектор { стили CSS }
Валидация: да.
Пример HTML и CSS: хак для IE6 и универсальный селектор
В IE6 этот текст будет красным, в остальных браузерах - зеленым.