【问题标题】:Does .css() automatically add vendor prefixes?.css() 会自动添加供应商前缀吗?
【发布时间】:2013-07-03 11:42:39
【问题描述】:

我有一些代码:

$("#" + 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 属性时,jQuery 的 .css() 方法是否会自动应用任何必需的供应商前缀?

【问题讨论】:

  • 你为什么不使用样式文件而不是 javascript,只需添加带有 venodrs 的类,许多扩展都添加了这样的功能。而且它更具可读性
  • 您真的应该以相反的顺序编写这些 CSS 行,这样如果两个版本都存在,则标准版本会覆盖实验/供应商版本。
  • 特别是在border-radius 方面,您可能无论如何都可以删除前缀;它已经标准化了足够长的时间,以至于在野外确实没有多少浏览器仍然需要前缀。见caniuse.com/#search=border-radius
  • 如果您不介意使用库prefix free 会有所帮助。

标签: javascript jquery css vendor-prefix


【解决方案1】:

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

二传手(.css( propertyName, value )

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

吸气剂 (.css( propertyName ))

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

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

请记住,速记属性在浏览器中是不一致的:

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

【讨论】:

    【解决方案2】:

    正如@zeroflagL 所写,自 jQuery 1.8.0 以来,.css() 确实添加了特定于浏览器的前缀 (see this)。

    在早期版本中,这不是由 jQuery 的 .css() 自动完成的。您必须自己完成,或者您可以使用 jQuery 的 .cssHooks() 添加供应商前缀。

    来自here的代码示例:

    (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);
    

    【讨论】:

    【解决方案3】:

    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-01-05
    • 2023-03-25
    • 2022-09-26
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    相关资源
    最近更新 更多