Проблемы с border-radius
После того как большинство браузеров так или иначе стали поддерживать CSS3 свойство border-radius, многие верстальщики вдохнули с облегчением: наконец-то можно забыть о головной боли, связанной с простым дизайнерским решением — скругленные уголки.
Но как оказалось, реализация поддержки этого свойства браузерами пока оставляет желать лучшего: есть некоторые проблемы при использовании border-radius.
Webkit браузеры: отсутствие сглаживания
Chrome и Safari отображают скругление «рвано», нет сглаживания (антиалиасинга) скругления. Сравни скругление в Firefox и Chrome:
В Chrome помимо угловатости, в рамке скругления просвечиваются некоторые пиксели основного изображения.
С этими багами пока ничего не поделать. Ждем исправлений от разработчиков браузеров.
В своих проектах вместе с заказчиком решаем, что важней: скорость загрузки и простота кода (используем border-radius), или же красота (делаем картинкой). Замечу, что отсутствие сглаживания не так бросается в глаза при небольших радиусах скругления.
Не скругляются изображения
Независимо от того border-radius применяется к самой картинке (<img>) или к ее родителю:
#imgs li { width: 200px; height: 200px; float: left; margin-right: 20px; overflow: hidden; border: 1px solid #f00; -moz-border-radius: 20px; -webkit-border-radius: 20px; border-radius: 20px; }
А вот и результат:
Заметка
Изображения нормально скругляются в современных webkit-браузерах: Chrome 4+ и Safari 4+.
Решение 1
Народ в Сети советует пробовать дублировать border-radius для самой картинки:
#imgs li { width: 200px; height: 200px; float: left; margin-right: 20px; overflow: hidden; border: 1px solid #f00; -moz-border-radius: 20px; -webkit-border-radius: 20px; border-radius: 20px; } #imgs img { -moz-border-radius: 19px; -webkit-border-radius: 19px; border-radius: 19px; }
При чем иногда имеет смысл задавать радиус картинке 1px меньше чем у контейнера. Прием вроде как иногда работает, но мне на простой тестовой странице этого добиться не удалось.
Решение 2
Не пытаться скруглять тег <img>, а помещать картинку в background.
<li style="background: url(path-to/alps.jpg)"></li> <li style="background: url(path-to/gamburceva.jpg)"></li>
li { width: 200px; height: 200px; float: left; margin-right: 20px; overflow: hidden; border: 1px solid #f00; -moz-border-radius: 20px; -webkit-border-radius: 20px; border-radius: 20px; }
Как не трудно догадаться семантикой тут и не пахнет, но за то работает. Семантику можно улучшить несложными манипуляциями с кодом:
<ul id="imgs"> <li style="background: url(img/alps.jpg)"><img src="img/alps.jpg" alt="" /></li> <li style="background: url(img/gamburceva.jpg)"><img src="img/gamburceva.jpg" alt="" /></li> </ul>
#imgs li { width: 200px; height: 200px; text-indent: -9999px; float: left; margin-right: 20px; overflow: hidden; border: 1px solid #f00; -moz-border-radius: 20px; -webkit-border-radius: 20px; border-radius: 20px; behavior: url(PIE.htc); }
Демо пример. Проверено в:
Недостаток данного способа — это избыточность HTML кода. Это можно побороть с помощью небольшого javascript кода:
<ul id="imgs"> <li><img src="path-to/img-1.jpg" alt="" /></li> <li><img src="path-to/img-2.jpg" alt="" /></li> </ul>
roundedImg = function() { var arrImg = document.getElementById("imgs").getElementsByTagName("img"), arrImgLen = arrImg.length, i; for(i=0;i<arrImgLen;i++) { arrImg[i].parentNode.style.backgroundImage="url("+arrImg[i].getAttribute("src")+")"; arrImg[i].parentNode.style.behavior="url(PIE.htc)"; } } window.onload=roundedImg;
Тут следует обратить внимание на то, что behavior из CSS для IE убрали и перенсли его в js. Это пришлось сделать для IE, который отрисовывал блок на VML до того, как ему присваивался background. Демо пример.
Выводы
Мы давно все ждали поддержки браузерами border-radius. В какой-то степени это время пришло. Только пока следует с осторожностью применять это свойство. Уверен, что мне встретились еще не все «сюрпризы».