zoukankan      html  css  js  c++  java
  • 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 || !elem.style ) {
                return;
            }
    
            // Make sure that we're working with the right name
            var ret, type, hooks,
                origName = jQuery.camelCase( name ),
                style = elem.style;
    
            name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
    
            // gets hook for the prefixed version
            // followed by the unprefixed version
            hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
    
            // Check if we're setting a value
            if ( value !== undefined ) {
                type = typeof value;
    
                // convert relative number strings (+= or -=) to relative numbers. #7345
                if ( type === "string" && (ret = rrelNum.exec( value )) ) {
                    value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
                    // Fixes bug #9237
                    type = "number";
                }
    
                // Make sure that NaN and null values aren't set. See: #7116
                if ( value == null || type === "number" && isNaN( value ) ) {
                    return;
                }
    
                // If a number was passed in, add 'px' to the (except for certain CSS properties)
                if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
                    value += "px";
                }
    
                // If a hook was provided, use that value, otherwise just set the specified value
                if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
                    // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
                    // Fixes bug #5509
                    try {
                        style[ name ] = value;
                    } catch(e) {}
                }
    
            } else {
                // If a hook was provided get the non-computed value from there
                if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
                    return ret;
                }
    
                // Otherwise just get the value from the style object
                return style[ name ];
            }
        },
    
        ...........................................
    
    });

    代码开始判断了dom节点类型,不是元素节点类型的直接return掉

    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
        return;
    }

    下面的代码跟jq的工具方法css一样,就不再分析了,不明白的朋友请点击 -> jquery的css详解(一)

    var ret, type, hooks,
        origName = jQuery.camelCase( name ),
        style = elem.style;
    
    name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
    
    // gets hook for the prefixed version
    // followed by the unprefixed version
    hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

    然后判断value是否undefined,是的话则获取,否则设置

    if ( value !== undefined ) {
    
        .................
    
    } else {
    
        ................
    
    }

    我们先看设置中的代码,先获取value的类型

    type = typeof value;

    如果type是字符串并且符合正则条件,则经过处理后赋值给value,type修改为number
    这里的正则不解释了,有兴趣的朋友可以自己研究一下,我说一下这段代码在开发中的使用场景。
    $(selector).css('width','+=100');

    if ( type === "string" && (ret = rrelNum.exec( value )) ) {
        value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
        // Fixes bug #9237
        type = "number";
    }

    对不正确的值返回

    if ( value == null || type === "number" && isNaN( value ) ) {
        return;
    }

    type是数字并且origName不是cssNumber的属性,则样式值加px

    if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
        value += "px";
    }
    cssNumber: {
        "fillOpacity": true,
        "fontWeight": true,
        "lineHeight": true,
        "opacity": true,
        "orphans": true,
        "widows": true,
        "zIndex": true,
        "zoom": true
    }

    针对尺寸的hooks

    if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
        // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
        // Fixes bug #5509
        try {
            style[ name ] = value;
        } catch(e) {}
    }

    好了,设置部分分析完了,获取部分很简单
    先针对尺寸的hooks,然后用style对应的属性得到样式值

    if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
        return ret;
    }
    
    // Otherwise just get the value from the style object
    return style[ name ];
  • 相关阅读:
    cornerstone log 点击down之后无法查看log解决方法
    YYWebImage的使用
    关于AF请求报错Request failed: unacceptable content-type: text/plain 解决方案
    如何优雅地进行页面间的跳转(iOS)
    关于添加设置PCH静态文件的方法
    iOS开发,获取动态web页面的高度
    IOS 开发 证书显示 此证书签发者无效 解决办法
    关于强制竖屏变横屏
    iOS面试必看经典试题分析
    最新iOS10相关技术【集合帖】
  • 原文地址:https://www.cnblogs.com/gongshunkai/p/5932615.html
Copyright © 2011-2022 走看看