Мне нужны были эти элегантные закругленные углы для веб-проекта, над которым я сейчас работаю.
Я думал, что попробую выполнить это, используя javascript, а не CSS, чтобы свести к минимуму запросы файлов изображений (да, я знаю, что можно объединить все необходимые формы с закругленными углами в одно изображение), и я также хотел чтобы иметь возможность менять цвет фона практически на лету.
Я уже использую jQuery, поэтому я посмотрел на отличный плагин закругленных углов, и он отлично работал в каждом браузере, который я пробовал. Однако, будучи разработчиком, я заметил возможность сделать его более эффективным. Сценарий уже включает код для определения, поддерживает ли текущий браузер закругленные углы webkit (браузеры на основе Safari). Если это так, он использует необработанный CSS вместо создания слоев div.
Я подумал, что было бы замечательно, если бы можно было провести такую же проверку, чтобы увидеть, поддерживает ли браузер специфичные для Gecko свойства -moz-border-radius-*, и если да, то использовать их.
Проверка поддержки webkit выглядит так:
var webkitAvailable = false;
try {
webkitAvailable = (document.defaultView.getComputedStyle(this[0], null)['-webkit-border-radius'] != undefined);
}
catch(err) {}
Однако это не сработало для -moz-border-radius, поэтому я начал искать альтернативы.
Мое резервное решение, конечно, заключается в использовании обнаружения браузера, но это, конечно, далеко от рекомендуемой практики.
Мое лучшее решение заключается в следующем.
var mozborderAvailable = false;
try {
var o = jQuery('<div>').css('-moz-border-radius', '1px');
mozborderAvailable = $(o).css('-moz-border-radius-topleft') == '1px';
o = null;
} catch(err) {}
Он основан на теории, согласно которой Gecko «расширяет» составной -moz-border-radius до четырех подсвойств.
-moz-border-radius-topleft-moz-border-radius-topright-moz-border-radius-bottomleft-moz-border-radius-bottomrightЕсть ли какой-нибудь гуру javascript / CSS, у которого есть лучшее решение?
(Запрос функции для этой страницы находится по адресу http://plugins.jquery.com/node/3619)
Как использовать обнаружение функций, чтобы узнать, поддерживает ли браузер радиус границы? stackoverflow.com/questions/5277288/…
Я пришел к этому вопросу только сейчас, когда ему 2 года. Итак, для записи я бы добавил, что сегодня лучший способ (IMO) проверить возможности браузера - использовать библиотеку Modernizr



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Почему бы не использовать -moz-border-radius и -webkit-border-radius в таблице стилей? Это действительный CSS, и добавление неиспользуемого в противном случае атрибута повредило бы меньше, чем если бы javascript выполнял беготню по выяснению, следует ли его применять или нет.
Затем в javascript вы должны просто проверить, является ли браузер IE (или Opera?) - если это так, он проигнорирует проприетарные теги, и ваш javascript может это сделать.
Может я что-то здесь упускаю ...
Безоговорочно применить CSS и проверить element.style.MozBorderRadius в скрипте?
Как насчет этого?
var mozborderAvailable = false;
try {
if (typeof(document.body.style.MozBorderRadius) !== "undefined") {
mozborderAvailable = true;
}
} catch(err) {}
Я тестировал его в Firefox 3 (true) и false в Safari, IE7 и Opera.
(Edit: лучший неопределенный тест)
Глядя на это еще раз, это не лучший способ проверить undefined в js, я обновлю его ...
Поскольку вы уже используете jQuery, вы можете использовать утилиту jQuery.browser для анализа браузера, а затем соответствующим образом настроить таргетинг на свой CSS / JavaScript.
Проблема в том, что Firefox 2 не использует сглаживание границ. Сценарий должен будет обнаружить Firefox 3, прежде чем он будет использовать собственные закругленные углы, поскольку FF3 действительно использует сглаживание.
Я разработал следующий метод определения, поддерживает ли браузер закругленные границы или нет. Мне еще предстоит протестировать его в IE (я на машине Linux), но он правильно работает в браузерах Webkit и Gecko (например, Safari / Chrome и Firefox), а также в Opera:
function checkBorders() {
var div = document.createElement('div');
div.setAttribute('style', '-moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px;');
for ( stylenr=0; stylenr<div.style.length; stylenr++ ) {
if ( /border.*?-radius/i.test(div.style[stylenr]) ) {
return true;
};
return false;
};
Если вы хотите протестировать Firefox 2 или 3, вам следует проверить движок рендеринга Gecko, а не фактический браузер. Я не могу найти точную дату выпуска Gecko 1.9 (это версия, которая поддерживает сглаженные закругленные углы), но в вики Mozilla говорится, что она была выпущена в первом квартале 2007 года, поэтому мы предполагаем, что май просто Конечно.
if ( /Gecko/\d*/.test(navigator.userAgent) && parseInt(navigator.userAgent.match(/Gecko/\d*/)[0].split('/')[1]) > 20070501 )
В общем, комбинированная функция такова:
function checkBorders() {
if ( /Gecko/\d*/.test(navigator.userAgent) && parseInt(navigator.userAgent.match(/Gecko/\d*/)[0].split('/')[1]) > 20070501 ) {
return true;
} else {
var div = document.createElement('div');
div.setAttribute('style', '-moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px;');
for ( stylenr=0; stylenr<div.style.length; stylenr++ ) {
if ( /border.*?-radius/i.test(div.style[stylenr]) ) {
return true;
};
return false;
};
};
Я знаю, что это более старый вопрос, но он часто встречается в поисках по тестированию поддержки радиуса границы, поэтому я подумал, что брошу сюда этот самородок.
У Роба Глейзбрука есть небольшой фрагмент, который расширяет объект поддержки jQuery, чтобы быстро проверить поддержку радиуса границы (также moz и web-kit).
jQuery(function() {
jQuery.support.borderRadius = false;
jQuery.each(['BorderRadius','MozBorderRadius','WebkitBorderRadius','OBorderRadius','KhtmlBorderRadius'], function() {
if (document.body.style[this] !== undefined) jQuery.support.borderRadius = true;
return (!jQuery.support.borderRadius);
}); });
Таким образом, если для него нет поддержки, вы можете отступить и использовать jQuery для реализации двухстороннего слайдера, чтобы другие браузеры по-прежнему имели похожий визуальный опыт.
Перестанет ли javascript выполняться, если вы попытаетесь применить к элементам неопределенные атрибуты CSS?