jquery的css详解(一)

通过阅读源码可以发现css是jq的实例方法。而在内部调用jq的工具方法access来实现的,对该方法不了解的朋友请点击 -> jquery工具方法access详解

在access的回调中做了一个判断,value不等于undefined则调用jq的工具方法style,否则调用jq的工具方法css

可以看出,style是设置,css是获取。也就是说要搞懂jq的实例方法css,必须先要搞懂jq的工具方法style和css

jQuery.fn.extend({
    css: function( name, value ) {
        return jQuery.access( this, function( elem, name, value ) {
            return value !== undefined ?
                jQuery.style( elem, name, value ) :
                jQuery.css( elem, name );
        }, name, value, arguments.length > 1 );
    },

    ...............................

});

jQuery.css有4个参数,前面2个一看就明白,elem是元素,name是样式名称,后面2个是用于把样式值转为数字类型
比如 : $(selector).css(‘width‘) //100px
         $(selector).width() //100
其实$(selector).width()就是调用了jQuery.css并传递了后面2个参数,把带px的转成数值类型。这个我们稍后再分析,接着往下看。

jQuery.extend({

    .......................

    css: function( elem, name, numeric, extra ) {
        var val, num, hooks,
            origName = jQuery.camelCase( name );

        // Make sure that we‘re working with the right name
        name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );

        // gets hook for the prefixed version
        // followed by the unprefixed version
        hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

        // If a hook was provided get the computed value from there
        if ( hooks && "get" in hooks ) {
            val = hooks.get( elem, true, extra );
        }

        // Otherwise, if a way to get the computed value exists, use that
        if ( val === undefined ) {
            val = curCSS( elem, name );
        }

        //convert "normal" to computed value
        if ( val === "normal" && name in cssNormalTransform ) {
            val = cssNormalTransform[ name ];
        }

        // Return, converting to number if forced or a qualifier was provided and val looks numeric
        if ( numeric || extra !== undefined ) {
            num = parseFloat( val );
            return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
        }
        return val;
    },

        ...................

});

我们接着往下分析:
origName = jQuery.camelCase( name );    这句代码是把样式名称转驼峰式的写法,比如:background-color转成backgroundColor
我们看一下camelCase源码:

var rmsPrefix = /^-ms-/,

    rdashAlpha = /-([\da-z])/gi,

    fcamelCase = function( all, letter ) {
        return ( letter + "" ).toUpperCase();
    };

jQuery.extend({

    ..............................

    camelCase: function( string ) {
        return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
    },

    ..............................

});    

继续往下走。。。。
这句代码是对name的赋值操作,当jQuery.cssProps的属性包含origName则赋值给name,否则调用vendorPropName方法并且动态生成一个jQuery.cssProps的属性且赋值给name
cssProps里面没有则通过vendorPropName生成,以后就直接往cssProps里面取,应该就是这样的思想。
我们看一下cssProps和vendorPropName这俩家伙是什么东西。

name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );

cssProps默认定义了一个float的属性,对应的值为cssFloat与styleFloat
因为float是js的保留字,所以不能在样式中直接用,就跟class一样的道理,需要改成className。

cssProps: {
    // normalize float css property
    "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
},

vendorPropName主要是针对css3的样式名称进行处理,我们知道css3样式都是有前缀的,比如moz,ms,webkit等
而我们使用jq是不需要写前缀的,比如:$(selector).css(‘tranfroms‘)

好了,大致了解了vendorPropName作用我们分析源码
vendorPropName内部分为3块,下面我们一个个分析。

function vendorPropName( style, name ) {

    // shortcut for names that are not vendor prefixed
    if ( name in style ) {
        return name;
    }

    // check for vendor prefixed names
    var capName = name.charAt(0).toUpperCase() + name.slice(1),
        origName = name,
        i = cssPrefixes.length;

    while ( i-- ) {
        name = cssPrefixes[ i ] + capName;
        if ( name in style ) {
            return name;
        }
    }

    return origName;
}

首先做一个判断,如果在style中找到了name则直接返回name,说明name已经是有前缀的样式名称了,比如:$(selector).css(‘MozTranfroms‘),否则走下面的代码。

if ( name in style ) {
    return name;
}

把name的第一个字母转大写赋值给capName,capName再赋值给origName,i等于cssPrefixes的长度。

var capName = name.charAt(0).toUpperCase() + name.slice(1),
     origName = name,
     i = cssPrefixes.length;
cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],

遍历i,把带前缀的样式名称赋值给name,再一次name in style

while ( i-- ) {
    name = cssPrefixes[ i ] + capName;
    if ( name in style ) {
        return name;
    }
}

分析完了vendorPropName我们继续看css的代码
这里是做了hooks的处理,如透明度、宽度等默认都是空,利用hooks转为数值0

hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

// If a hook was provided get the computed value from there
if ( hooks && "get" in hooks ) {
    val = hooks.get( elem, true, extra );
}

经过了上面的各种处理,调用curCSS获取到样式的值

if ( val === undefined ) {
    val = curCSS( elem, name );
}

某些样式默认值是normal,调用cssNormalTransform做了处理

if ( val === "normal" && name in cssNormalTransform ) {
    val = cssNormalTransform[ name ];
}
cssNormalTransform = {
    letterSpacing: 0,
    fontWeight: 400
},

这里就是css后面2个参数起作用的地方,把样式的值转为数值类型

if ( numeric || extra !== undefined ) {
    num = parseFloat( val );
    return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
}

最终返回val

时间: 2024-10-27 09:55:45

jquery的css详解(一)的相关文章

jquery的css详解(二)

jq的工具方法style用于设置样式,jq的实例方法css在设置样式时就是调用的它,接下来分析一下源码. jQuery.extend({ ............................ style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ||

jQuery css详解

今天确确实实是放了一天假,喝了点小酒,看了天天向上和快乐大本营以及中国好舞蹈,越来越热爱舞蹈了,还是总结一篇吧. @jquery css css(name|pro|[,val|fn):访问或设置匹配元素的样式属性 1 $("div").click(function(){ 2 $(this).css({width:20px,height:30px}) 3 }); offset([coordinates]):获取匹配元素在当前视口(body)的相对偏移 1 <p>hello b

jQuery datepicker参数 详解

DatePicker支持鼠标点选日期,同时还可以通过键盘控制选择: page up/down - 上一月.下一月 ctrl+page up/down - 上一年.下一年 ctrl+home - 当前月或最后一次打开的日期 ctrl+left/right - 上一天.下一天 ctrl+up/down - 上一周.下一周 enter - 确定选择日期 ctrl+end - 关闭并清除已选择的日期 escape - 关闭并取消选择 实用功能: $.datepicker.setDefaults( set

常见26个jquery使用技巧详解(比如禁止右键点击、隐藏文本框文字等)

来自:http://www.xueit.com/js/show-6015-1.aspx 本文列出jquery一些应用小技巧,比如有禁止右键点击.隐藏搜索文本框文字.在新窗口中打开链接.检测浏览器.预加载图片.页面样式切换.所有列等高.动态控制页面字体大小.获得鼠标指针的X值Y值.验证元素是否为空.替换元素.延迟加载.验证元素是否存在于Jquery集合中.使DIV可点击.克隆对象.使元素居中.计算元素个数.使用Google主机上的Jquery类库.禁用Jquery效果.解决Jquery类库与其他J

使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 事件详解

在前文<使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 默认配置与事件基础>中,Kayo 对 jQuery Mobile 事件的基础作出了一些说明,建议在阅读本文前首先阅读前文,这里 Kayo 再引用前文的重要内容. “jQuery Mobile 在基于本地事件上,创建了一系列的自定义事件,大部分事件是基于触摸设备的使用情况开发的,当然这些事件对于桌面环境也会有适当的处理,开发者可以使用 bind() 函数绑定到需要的页面对象中. 值得

jQuery.hasClass() 函数详解

目录 jQuery.hasClass() 函数详解 语法 参数 返回值 示例&说明 jQuery.hasClass() 函数详解 hasClass()函数用于指示当前jQuery对象所匹配的元素是否含有指定的css类名. 该函数属于jQuery对象(实例). 语法 JavaScript: jQueryObject.hasClass( className ) 参数 参数 描述 className String类型指定的css类名. 返回值 hasClass()函数的返回值是Boolean类型,返回

jQuery 事件用法详解

jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jquery中文文档 简介 jquery 之所以成为最受欢迎的前端库,很大一部分是得益于它的事件具有良好的语义,优秀的兼容性,并且便于管理和扩展. 在这里我会介绍 jquery 事件的一些比较基础的用法. 实现原理 jquery 事件脱胎于浏览器的 addEventListener (W3) 和 attac

jQuery选择器代码详解(四)——Expr.preFilter

原创文章,转载请注明出处,多谢! Expr.preFilter是tokenize方法中对ATTR.CHILD.PSEUDO三种选择器进行预处理的方法.具体如下: Expr.preFilter : { "ATTR" : function(match) { /* * 完成如下任务: * 1.属性名称解码 * 2.属性值解码 * 3.若判断符为~=,则在属性值两边加上空格 * 4.返回最终的mtach对象 * * match[1]表示属性名称, * match[1].replace(rune

JQuery选择器代码详解(三)——tokenize方法

原创文章,转载请注明出处,多谢! /* * tokenize函数是选择器解析的核心函数,它将选择器转换成两级数组groups * 举例: * 若选择器为"div.class,span",则解析后的结果为: * group[0][0] = {type:'TAG',value:'div',matches:match} * group[0][1] = {type:'CLASS',value:'.class',matches:match} * group[1][0] = {type:'TAG'