.css() 会自动添加供应商前缀吗?

IT技术 javascript jquery css vendor-prefix
2021-01-24 17:12:52

我有一些代码:

$("#" + 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 的文档中所示)或完全删除供应商前缀版本来改进这样的行。

.css()更改元素上的 CSS 属性时,jQuery 的方法是否会自动应用任何必需的供应商前缀?

3个回答

正如@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);
+1 为 cssHooks。是否有具有通用前缀的存储库?
2021-03-15 17:12:52
谢谢,我将根据 caniuse.com 的建议删除供应商前缀版本
2021-03-20 17:12:52
我在示例中看到:prefixes = [ "Moz", "Webkit", "O", "ms" ]. 添加了代码示例
2021-03-25 17:12:52
我在文档中找不到任何关于此的信息。你有什么参考吗?
2021-04-08 17:12:52

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。

再也找不到那个方法了——可惜。
2021-04-03 17:12:52

这现在在官方文档中得到确认:http : //api.jquery.com/css/

二传手 ( .css( propertyName, value ))

从 jQuery 1.8 开始,.css()setter 将自动处理属性名称的前缀。例如,.css( "user-select", "none" )在 Chrome/Safari 中将其设置为-webkit-user-select,Firefox 将使用-moz-user-select,而 IE10 将使用-ms-user-select

吸气剂 ( .css( propertyName ) )

.css()方法是从第一个匹配元素中获取计算样式属性的便捷方法,特别是考虑到浏览器访问大多数这些属性的不同方式(getComputedStyle()基于标准的浏览器中方法与版本 9 之前的 Internet Explorer 中currentStyleruntimeStyle属性) 以及浏览器对某些属性使用的不同术语。例如,Internet Explorer 的 DOM 实现将 float 属性称为styleFloat,而符合 W3C 标准的浏览器将其称为cssFloat为了保持一致性,您可以简单地使用"float",jQuery 会将其转换为每个浏览器的正确值。

它没有在 getter 上下文中明确提及供应商前缀,但很容易测试。例如,$element.css('border-radius')在 Chrome 上返回设置为border-radiusor 的-webkit-border-radius值并忽略设置为 的值-moz-border-radius

请记住,它在浏览器之间的速记属性不一致:

检索速记 CSS 属性(例如,边距、背景、边框)虽然在某些浏览器中有效,但不能保证。例如,如果要检索渲染的border-width,请使用: $( elem ).css( "borderTopWidth" )$( elem ).css( "borderBottomWidth" )等。