Может ли .css() автоматически добавлять префиксы поставщика? - программирование
Подтвердить что ты не робот

Может ли .css() автоматически добавлять префиксы поставщика?

У меня есть код:

$("#" + this.id).css("border-radius",this.radius + "px");
$("#" + this.id).css("-moz-border-radius",this.radius + "px");
$("#" + this.id).css("-webkit-border-radius",this.radius + "px");

Я пытаюсь улучшить такие строки, используя JSON для их применения (как показано в документах jQuery) или полностью удалив версии префикса поставщика.

Использует ли метод jQuery .css() любые необходимые префиксы поставщика при изменении свойств CSS в элементе?

4b9b3361

Ответ 1

Как пишет @zeroflagL, поскольку jQuery 1.8.0 .css() добавляет специальные префиксы браузера (см. это).

В более ранних версиях это не выполняется автоматически с помощью jQuery .css(). Вам нужно будет сделать это самостоятельно или вы можете использовать jQuery .cssHooks(), чтобы добавить префиксы поставщика.

Пример кода из здесь:

(function($) {
  if ( !$.cssHooks ) {
    throw("jQuery 1.4.3+ is needed for this plugin to work");
    return;
  }

  function styleSupport( prop ) {
    var vendorProp, supportedProp,
        capProp = prop.charAt(0).toUpperCase() + prop.slice(1),
        prefixes = [ "Moz", "Webkit", "O", "ms" ],
        div = document.createElement( "div" );

    if ( prop in div.style ) {
      supportedProp = prop;
    } else {
      for ( var i = 0; i < prefixes.length; i++ ) {
        vendorProp = prefixes[i] + capProp;
        if ( vendorProp in div.style ) {
          supportedProp = vendorProp;
          break;
        }
      }
    }

    div = null;
    $.support[ prop ] = supportedProp
    return supportedProp;
  }

  // check for style support of your property 
  // TODO by user: swap out myCssPropName for css property
  var myCssPropName = styleSupport("myCssPropName");

  // set cssHooks only for browsers that
  // support a vendor-prefixed border radius
  if (myCssPropName && myCssPropName !== 'myCssPropName') {
    $.cssHooks["myCssPropName"] = {
      get: function(elem, computed, extra) {
        // handle getting the CSS property
        return $.css(elem, myCssPropName);
      },
      set: function(elem, value) {
        // handle setting the CSS value
        elem.style[myCssPropName] = value;
      }
    };
  }
})(jQuery);

Ответ 2

jQuery Добавляет префиксы поставщиков. Сначала он проверяет наличие стандартного свойства, и если он не найден для версии с префиксом поставщика. Из источника:

// return a css property mapped to a potentially vendor prefixed property
function vendorPropName( style, name ) {
    // shortcut for names that are not vendor prefixed
    if ( name in style ) {
      return name;
     }

    // check for vendor prefixed names
    ...

Я не знаю, с какой версии, но я думаю 1.8.

Ответ 3

Это подтверждено в официальных документах: http://api.jquery.com/css/

Сеттер (.css( propertyName, value ))

Как и в jQuery 1.8, установщик .css() автоматически позаботится о префиксах имени свойства. Например, возьмите .css( "user-select", "none" ) в Chrome/Safari, установите его как -webkit-user-select, Firefox будет использовать -moz-user-select, а IE10 будет использовать -ms-user-select.

Getter (.css( propertyName ))

Метод .css() - это удобный способ получить вычисленное свойство стиля из первого совпадающего элемента, особенно в свете различных способов доступа браузеров к большинству этих свойств (метод getComputedStyle() в браузерах на основе стандартов по сравнению с currentStyle и runtimeStyle свойства в Internet Explorer до версии 9) и различные термины, используемые браузерами для определенных свойств. Например, реализация DOM в Internet Explorer относится к свойству float как styleFloat, в то время как браузеры, совместимые со стандартами W3C, относятся к нему как cssFloat. Для согласованности вы можете просто использовать "float", а jQuery переведет его на правильное значение для каждого браузера.

В нем явно не упоминаются префиксы поставщиков в контексте getter, но их легко проверить. Например, $element.css('border-radius') в Chrome возвращает значения, установленные как border-radius или -webkit-border-radius, и игнорирует значения, установленные как -moz-border-radius.

Просто имейте в виду, что он несовместим между браузерами для стенографических свойств:

Получение сокращенных CSS-свойств (например, margin, background, border), хотя и работает с некоторыми браузерами, не гарантируется. Например, если вы хотите получить рендер border-width, используйте: $( elem ).css( "borderTopWidth" ), $( elem ).css( "borderBottomWidth" ) и т.д.