Статьи

Как определить поддержку браузером свойств CSS3

Раньше обнаружение функций было намного проще.

Обнаружение браузера было разумным решением в первые дни Интернета. Разработчики будут проверять пользовательский агент и запускать код JavaScript, предназначенный для приложения. Это было больно, но часто необходимо, потому что технологии браузера значительно различались.

Рост веб-стандартов снизил потребность в разветвлении кода. Модель событий Internet Explorer и реализация XMLHttpRequest не соответствовали стандартам W3C, но небольшое обнаружение объектов преодолело эти препятствия. Большая часть нашего кода будет работать везде.

Теперь у нас есть HTML5 и CSS3. Ни один браузер не поддерживает все функции, поэтому для обеспечения кросс-браузерной совместимости часто необходимо включать прокладки или использовать методы обнаружения. Рассмотрим пример с тиснением:

body { font-family: sans-serif; background-color: #fff; } .emboss { font-size: 2.5em; font-weight: bold; color: #fff; text-shadow: 1px 1px 1px rgba(0,0,0,0.4); } 

Большинство современных браузеров показывают приятный эффект:

Рельефный текст

Чтобы добиться этого, мы установили шрифт того же цвета, что и фон. К сожалению, это делает текст невидимым в браузерах, которые не поддерживают текстовую тень. Это включает в себя Internet Explorer 9.0 и более ранние версии всех браузеров.

Модернизр на помощь!

Modernizr — это удивительная библиотека, которая обнаруживает свойства CSS, преобразования, элементы HTML5, холст, SVG, геолокацию, локальное хранилище, сенсорные события и многое другое. Развернутая версия в сжатом виде составляет всего 3,7 КБ, и вы можете уменьшить ее, загрузив настроенную сборку .

Modernizr предоставляет API-интерфейс JavaScript и добавляет имена классов, такие как texthadow, opacity, cssgradients, svg и т. Д., В элемент html . Поэтому мы можем переписать наш тисненый текст CSS соответствующим образом:

 .emboss { font-size: 2.5em; font-weight: bold; color: #333; } .textshadow .emboss { color: #fff; text-shadow: 1px 1px 1px rgba(0,0,0,0.4); } 

Если вам необходимо обнаружить широкий спектр функций, Modernizr — одно из лучших доступных решений.

Прокручивая свой собственный код обнаружения

Сторонняя библиотека может быть излишней, если вы хотите обнаружить только несколько функций CSS. Modernizr и подобные решения работают, создавая элемент (не добавленный в DOM) и проверяя значение свойства CSS. Неподдерживаемое свойство обычно возвращает undefined.

text-shadow — одно из самых простых свойств для обнаружения — следующий код добавляет класс «texthadow» к элементу html если он поддерживается:

 // detect CSS text-shadow support in JavaScript if (document.createElement("detect").style.textShadow === "") { document.getElementsByTagName("html")[0].className += " textshadow"; } 

Свойства с префиксами вендора немного сложнее. Например, boxShadow может не поддерживаться напрямую, но одно из следующих свойств: WebkitBoxShadow, MozBoxShadow, OBoxShadow, msBoxShadow, KhtmlBoxShadow. Поэтому необходимо перебирать опции, например

 // detect CSS box-shadow support in JavaScript var d = document.createElement("detect"), CSSprefix = "Webkit,Moz,O,ms,Khtml".split(","), All = ("boxShadow " + CSSprefix.join("BoxShadow,") + "BoxShadow").split(","); for (var n = 0, np = All.length; n < np; n++) { if (d.style[All[n]] === "") { document.getElementsByTagName("html")[0].className += " boxshadow"; break; } } 

Это немного скучно, и вы не захотите писать подобный код для каждого свойства. Поэтому мы обернем функциональность в модуле, который обнаруживает поддержку CSS text-shadow, text-stroke, box-shadow, border-radius, border-image и opacity:

 // CSS support detection var Detect = (function() { var props = "textShadow,textStroke,boxShadow,borderRadius,borderImage,opacity".split(","), CSSprefix = "Webkit,Moz,O,ms,Khtml".split(","), d = document.createElement("detect"), test = [], p, pty; // test prefixed code function TestPrefixes(prop) { var Uprop = prop.charAt(0).toUpperCase() + prop.substr(1), All = (prop + ' ' + CSSprefix.join(Uprop + ' ') + Uprop).split(' '); for (var n = 0, np = All.length; n < np; n++) { if (d.style[All[n]] === "") return true; } return false; } for (p in props) { pty = props[p]; test[pty] = TestPrefixes(pty); } return test; }()); 

Значения Detect.textShadow, Detect.textStroke, Detect.boxShadow, Detect.borderRadius, Detect.borderImage и Detect.opacity возвращают true, если они поддерживаются. При необходимости мы можем добавить имена связанных классов к элементу html :

 // append to HTML node var html = document.getElementsByTagName("html")[0]; for (t in Detect) { if (Detect[t]) html.className += " " + t.toLowerCase(); } 

Или отобразите список поддерживаемых свойств:

 for (t in Detect) { document.write( "CSS " + t + " support? " + (Detect[t] ? "YES" : "NO") + "<br>" ); } 

Демонстрационная страница показывает этот код в действии. Вы можете использовать его как основу своей собственной библиотеки обнаружения — или, возможно, проще включить Modernizr и покончить с этим!