Рассмотрим, как работает библиотека rocon.
rocon дожидается загрузки DOM-дерева документа и ищет все элементы с классом rcN
, где N — радиус скругления, и добавляет им скругленные уголки.
Safari
Создается новая новая таблица стилей в документе, в которой классам rcN
указываются CSS-свойства -webkit-border-radius
и -khtml-border-radius
.
Firefox
По аналогии с Safari указывается CSS-свойство -moz-border-radius
.
Opera
Через <canvas> рисуется звездочка, которая затем преобразуется в data: URL картинку. Затем для каждого уголка создается по отдельному элементу и каждому указывается эта картинка в качестве фона. Все CSS-свойства указываются в таблице стилей, а не в самих элементах (это значит, что их можно легко перекрывать).
Internet Explorer
Такой же способ, как и у Opera, только используется VML. Соответственно, уголок вставляется как элемент, а не как фоновая картинка.
С первыми двумя случаями все довольно просто: используем внутренние возможности браузера для рисования скругленных уголков. Для двух последних все намного сложнее. После инициализации основному блоку указывается класс rocon-init
— это значит, что элемент был инициализирован. Также добавляется класс rocon__N
, где N — некий порядковый номер, характеризующий набор уникальных свойств блока: радиус скругления, цвет фона, толщина бордюра и так далее. Соответственно, если попадаются элементы с одинаковым набором этих характеристик, новые уголки не рисуются, а достаются из кэша. Для каждого создаваемого элемента с уголком присваиваются классы rocon-tl
, rocon-tr
, rocon-bl
, rocon-br
, что означает, соответственно, левый верхний, правый верхний, левый нижний и правый нижний. Все стили записываются в новую таблицу стилей, а не в сам элемент. Тем самым вы можете менять некоторые свойства уголка через CSS, что будет особенно полезно в IE6. Дело в том, что в этом браузере неправильно работают CSS-свойства right
и bottom
. И если первое свойство я смог эмулировать с помощью margin-left: 100%
, то со вторым проблема: я пока не знаю, как это можно исправить. Поэтому вам придется указывать вручную его позицию. Так как уголок добавляется в самый конец блока, вы можете воспользоваться тем, что его сместит контент блока в самый низ и подкорректировать его позицию с помощью свойства margin-top
(на забудьте поставить bottom: auto
).
Можно в любой момент добавить любому блоку скругление или поменять его свойства (радиус, цвет фона и так далее). Чтобы изменения вступили в силу, нужно вызвать метод rocon.update(elem)
, где elem
— указатель на элемент, который нужно обновить.
Все пожелания и комментарии просьба указывать в багтрекере.