Некоторое время я посвятил теме скругления углов у блочных элементов. Вот что получилось.
Цель
Разработать самый лучший (простой и надежный) метод для скругления углов у блочных элементов.
Требования
Необходимо достигнуть баланса со следующим списком требований:
- Никаких изображений. В крайнем случае — одно.
- Никакого яваскрипта. Должно работать без него. В крайнем случае — только expressions для IE. Т.е. случай с отключенным яваскриптом в IE принимаем за маргинальный.
- Работать должно во всех более-менее заметных браузерах и мобильных устройствах: IE 7, 6, 5.5; Firefox 2, 1.5; Safari 3, 2; Opera 9.5, 9, 8. В крайнем случае — только на наиболее популярных — IE 7,6; Firefox 2; Safari 3
- Визуальная привлекательность. Максимально быстрая отрисовка прямо со старта — именно поэтому никаких изображений и скриптов. Уж больно эти загружающиеся изображения и прочие тормоза раздражают.
- Валидность XHTML Strict 1.0 по нормам валидатора W3C и работа с content-type. "application/xhtml+xml" для всех кроме IE и c "text/html" для IE
- Расширяемость на будущее. Чтобы при появлениии новых версий браузеров это не сломалось.
- Валидность CSS 2 и отсутствие хаков в CSS. Это, пожалуй, недостижимо, но к этому нужно стремиться.
- Семантичность верстки. Никаких лишних сущностей в html-коде быть не должно. В крайнем случае — должен быть семантичный DOM.
- Оптимизация производительности. Главное — минимизация числа запросов к серверу. На следующем месте — минимизация трафика.
- Гибкая верстка. При изменении размера блока, масштаба страницы, размера шрифта, ничего разъезжаться не должно.
Анализ существующих методов
- Картинки в углы. Тормоза, лишние запросы. Несемантичный код или семантичный, но требуется включенный JS в IE.
- Буллеты в углы. Проблемы с масштабированием. Проблемы с читалками экрана.
- Эмуляция пикселов в углах через сетку html-тегов. Несемантичный код. Раздувание кода и стилей.
- Встроенные средства браузеров. Хорошо, но неуниверсально. CSS3 еще никто не поддерживает.
- SVG как фоновое изображение. Это безусловно будет хит. Но поддерживается пока только оперой 9.5 beta.
Процесс
В общем, как можно заметить, хороших способов нет. Точнее, их будет аж два: SVG как фоновое изображение и средства предлагаемые CSS3. Но это для культурных браузеров. А вот для IE ничего нет и не предвидится. И тут меня осенило: У IE начиная с версии 5.5 есть полный аналог SVG. Это VML!
Итак, после некоторых раздумий было решено: использовать VML для IE, а в остальных случаях использовать аналоги из CSS3.
Результат
Для работы с VML нужно вначале включить namespace для VML. Например так:
Потом нужно включить сам VML (в стилях). Например так: v\: * { behavior: url(#default#VML); } После чего можно использовать команды VML прямо в тексте.
Разные замечания:
- Можно ещё улучшить — подключить SVG, тогда заработает и в опере 9.5 и в других будущих продвинутых браузерах.
- Обратите внимание на условные комментарии для IE. Оказывается многие не знают как сделать "else".
- Комментарии можно вообще убрать. И использовать тег "v:roundrect" как блочный элемент (заодно и код будет семантичен). Я проверял — работает во всех браузерах. Можно даже content-type выставить в application/xhtml+xml. Но возмущается валидатор W3C. Можно дополнить DTD. Но это не понимает IE. Можно создать свой DTD. Но валидатор от W3C не понимает custom DTD. В общем, решайте сами, что вам валидней. Как по мне, так в данном конкретном случае валидатор от W3C конкретно не прав. Ну да ладно.
- Насчет оперы. Я очень люблю этот браузер. В том числе это означает и то, что я прощаю ему то, чего он не умеет. Он очень быстро развивается. Так что это не проблема.
- Я не в восторге от смешивания HTML и VML, но другого способа подсоединить VML нет.
- Те атрибуты VML-тегов, которые относятся только к VML нельзя переместить в стили. Увы.
- Если использовать VML-теги как блочные элементы, то они не понимают margin. Padding понимают. Есть и ещё мелкие странности. Типа отступов в 1px в некоторых случаях.
- Кривые в VML сглаживаются! Это выглядит просто отлично.
- Что делать с градиентами? VML и SVG их поддерживают. Можно и реализовать.
- Интересный случай — код в примере не семантичен, но построенный по нему DOM — да.
Итак, решение работает во всем чем только можно, исключая оперу. Лишних запросов нет вообще. Почти семантично. Отображается моментально. Красота.
Цель достигнута. Интересно только почему никто ранее не додумался до этого?