Настройка CSS с префиксом поставщика с использованием javascript

... это огромная боль.

var transform = 'translate3d(0,0,0)';
elem.style.webkitTransform = transform;
elem.style.mozTransform = transform;
elem.style.msTransform = transform;
elem.style.oTransform = transform;

Есть ли библиотека/структура/лучший способ сделать это? Предпочтительно только с одной линией JS?

Ответ 1

Я не знаю ни одной библиотеки, которая делает это, но если все они просто префиксы - то есть нет разницы в имени или синтаксисе - писать функцию самостоятельно было бы тривиально.

function setVendor(element, property, value) {
  element.style["webkit" + property] = value;
  element.style["moz" + property] = value;
  element.style["ms" + property] = value;
  element.style["o" + property] = value;
}

Тогда вы можете просто использовать это в большинстве случаев.

Ответ 2

В настоящее время в конце 2015 года ситуация немного изменилась. Прежде всего, важно, чтобы McBrainy прокомментировал вышеприведенную капитализацию. Префикс webkit теперь webkit, но, к счастью, используется только Safari в этой точке. И Chrome, и Firefox поддерживают el.style.transform без префикса, и я думаю, что IE тоже работает. Ниже представлено несколько более современное решение этой задачи. Сначала он проверяет, нужно ли нам даже префикс нашего свойства преобразования:

var transformProp = (function(){
  var testEl = document.createElement('div');
  if(testEl.style.transform == null) {
    var vendors = ['Webkit', 'Moz', 'ms'];
    for(var vendor in vendors) {
      if(testEl.style[ vendors[vendor] + 'Transform' ] !== undefined) {
        return vendors[vendor] + 'Transform';
      }
    }
  }
  return 'transform';
})();

Впоследствии мы можем просто использовать простой однострочный вызов для обновления свойства transform для элемента:

myElement.style[transformProp] = 'translate3d(0,' + dynamicY + 'px,0)';

Ответ 3

Вы можете найти соответствующий префикс поставщика с помощью Javascript со следующим кодом -

var prefix = (function () {
  var styles = window.getComputedStyle(document.documentElement, ''),
    pre = (Array.prototype.slice
      .call(styles)
      .join('') 
      .match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])
    )[1],
    dom = ('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1];
  return {
    dom: dom,
    lowercase: pre,
    css: '-' + pre + '-',
    js: pre[0].toUpperCase() + pre.substr(1)
  };
})();

Вышеупомянутый возвращает объект соответствующего префикса поставщика браузера.

Сохранено много дубликатов кода в моих сценариях.

Источник - Дэвид Уолш блог: https://davidwalsh.name/vendor-prefix

Ответ 5

Если вы настраиваете рабочий процесс с помощью Gulp, например, вы можете использовать Postcss autoprefixer, что является удобным инструментом при решении браузера префиксы поставщиков. Он использует JS, чтобы преобразовать вас в css.