Лучший способ проверить поддержку -moz-border-radius

Мне нужны были эти элегантные закругленные углы для веб-проекта, над которым я сейчас работаю.

Я думал, что попробую выполнить это, используя 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)

Перестанет ли javascript выполняться, если вы попытаетесь применить к элементам неопределенные атрибуты CSS?

Ben Shelock 04.01.2010 00:30

Как использовать обнаружение функций, чтобы узнать, поддерживает ли браузер радиус границы? stackoverflow.com/questions/5277288/…

Tom 14.09.2011 19:20

Я пришел к этому вопросу только сейчас, когда ему 2 года. Итак, для записи я бы добавил, что сегодня лучший способ (IMO) проверить возможности браузера - использовать библиотеку Modernizr

jira 12.09.2010 23:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
3
6 735
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Почему бы не использовать -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, я обновлю его ...

travis 02.03.2011 19:07

Поскольку вы уже используете 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 для реализации двухстороннего слайдера, чтобы другие браузеры по-прежнему имели похожий визуальный опыт.

Другие вопросы по теме