基础回顾

jQuery里节点样式读取以及设置都是通过.css()这个方法来实现的,本章通一下分解探究下jquery里这部分代码的实现

那么jQuery要处理样式的哪些问题?

先简单回顾下样式操作会遇到的问题

HTML样式定义3种方式了

<link/> 外部引入也就是定义CSS中的
<style/>嵌入式样式
style特性地定义

给一个HTML元素设置css属性,如

var head= document.getElementById("head");
head.style.width = "20px";
head.style.height = "10px";
head.style.display = "block";

这是DOM2级样式提供的API了,这里总的来说还涉及了3个问题,当然也是jQuery内部需要解决的兼容问题了

1 单一的设置太麻烦,而且每次style一次就等于浏览器要绘制一次,当然高级的浏览器是可能会合并style的次数的

2 style只能针对行类样式,对于link引入的样式,无法获取

3 样式属性名的兼容问题,比如驼峰,保留字


样式规则

任何支持style特性的HTML元素在js中有一个对象的style属性,其实也是一个实例,但是内部属性命名都是采用的驼峰形式的

比如 background-image =>要写成  backgroundImage

其中一个是比较特殊的就是 float,  保留字嘛所以就换成 cssFloat,  IE : styleFloat

然后对于width,hight这些处理都最好要有一个量度单位


合并cssText

可能针对一种情况给出的处理就是cssText合并

var head= document.getElementById("head");
head.style.cssText="width:20px;height:10px;display:bolck";

和innerHTML一样,cssText很快捷且所有浏览器都支持。此外当批量操作样式时,cssText只需一次reflow,提高了页面渲染性能

当然如果是在创建的时候,我们还可以利用文档碎片

缺点自然就是样式被整体覆盖了,所以在处理的时候应该要先获取需要保留的样式然后再拼接起来


样式访问

之前说过了style只能获取行类样式了,那么CSS外部样式表定义的样式如何处理?

DOM2增加了 document.defauleView,提供了 getComputedStyle()方法 返回了类似style属性的 css的dom隐射的实例对象

自然包行了样式表的最终样式了

getComputedStyle与style的区别

区别就在于getComputedStyle是只能读的,style是可以可读可写的

看看jQuery的

function getStyles( elem ) {
return window.getComputedStyle( elem, null );
}

没有defauleView前缀,查了下在浏览器中,该属性返回当前 document 对象所关联的 window 对象,如果没有,会返回 null。

应该就能直接window调用了

当然啦,IE这个老大反正就不怎么守规矩了,getComputedStyle方法IE6~8是不支持,所以自己弄出来了currentStyle

处理类似style的处理了,jQuery2X 可以无视IE9以下的兼容了, 所以这个略过~

以上就是样式操作需要了解是基础了,那么总的来说

jQuery需要的处理问题就显而易见了

1 参数传递

2 命名规范

3 访问规则

4 性能优化


.css()

关于css的接口

jQuery.fn.css 与 jQuery.css

我们知道实例是调用静态的方法

css的接口参数传递是可以很多个组合情况的,这也符合了jQuery少写多做的原则了

最终方法与设置样式的方法是实例方法,所以我们看传递的参数就知道了,只能是单一的elem, name, value 实参

jQuery.style( elem, name, value ) :
jQuery.css( elem, name );

所以如果我们传递是对象或者别的方式就需要一个过滤的环节

css参数的处理也跟之前的attr属性的处理保持一致,采用了jQuery.access方法统一调配

这个具体之前就分析了,无非就是递归参数,但是有个可学的设计思路

分离不同的逻辑判断通过回调传递进去


取值jQuery.css()

先看看源码

css: function( elem, name, extra, styles ) {
var val, num, hooks,
origName = jQuery.camelCase( name );
name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
if ( hooks && "get" in hooks ) {
val = hooks.get( elem, true, extra );
}
if ( val === undefined ) {
val = curCSS( elem, name, styles );
}
if ( val === "normal" && name in cssNormalTransform ) {
val = cssNormalTransform[ name ];
}
if ( extra === "" || extra ) {
num = parseFloat( val );
return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
}
return val;
}

首先自然是检测是是否驼峰写法了,如果不是就得转化下

origName = jQuery.camelCase( name );

把正则拖出来

'background-image'.replace(/-([\da-z])/gi, fcamelCase = function( all, letter ) {
return letter.toUpperCase();
})

找到-后面的,转成大写开头

修正命名float

jQuery.cssProps

css样式的钩子处理,针对不同的兼容增加的解耦处理,这里先跳过下章再将,不影响代码流程

所以最终在默认情况下是通过curCSS处理的取值

curCSS = function( elem, name, _computed ) {
var width, minWidth, maxWidth,
computed = _computed || getStyles( elem ), // Support: IE9
// getPropertyValue is only needed for .css('filter') in IE9, see #12537
ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
style = elem.style;

最终就是通过getComputedStyle的getPropertyValue方法了,所以通体来说跟之前假设的处理是保持一致的,只是做了不同的兼容


设值jQuery.style()

处理的方式与css类似,只是要注意了style才具有样式的修改权限

这样的传对象其实都是需要调用多次style处理的,当然没有采用cssText的方式处理,因为本身以前的属性就会丢失了

var color = a.css({"background-color":'red','width':'200px'});

总结:

jQuery的处理流程:

1. 分解参数

2. 转换为驼峰式,修正属性名

3. 如果有钩子,则调用钩子的set get

4. 最终实现都是依靠浏览器自己的API的

解密jQuery内核 样式操作的更多相关文章

  1. 解密jQuery内核 DOM操作的核心函数domManip

    domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...

  2. 解密jQuery内核 DOM操作的核心buildFragment

    文档碎片是什么 http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-B63ED1A3 DocumentFragment is a & ...

  3. 解密jQuery内核 DOM操作

    jQuery针对DOM操作的插入的方法有大概10种 append.prepend.before.after.replaceWith appendTo.prependTo.insertBefore.in ...

  4. jQuery - 5.样式操作

    样式操作 1.获取样式 attr("class"), 2.设置样式attr("class","myclass"), 3.追加样式addCla ...

  5. 解密jQuery内核 Sizzle引擎筛选器 - 位置伪类(一)

    本章开始分析过滤器,根据API的顺序来 主要涉及的知识点 jQuery的组成 pushStack方法的作用 sizzle伪类选择器 首页我们知道jQuery对象是一个数组对象 内部结构 jQuery的 ...

  6. jquery动态样式操作

    获取与设置样式 获取class和设置class都可以使用attr()方法来完成.例如使用attr()方法来获取p元素的class,JQuery代码如下: 1 var p_class = $(" ...

  7. 解密jQuery内核 DOM操作方法(二)html,text,val

    回顾下几组DOM插入有关的方法 innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 看图对照区别 innerText 设置 ...

  8. jQuery 源码解析(二十九) 样式操作模块 尺寸详解

    样式操作模块可用于管理DOM元素的样式.坐标和尺寸,本节讲解一下尺寸这一块 jQuery通过样式操作模块里的尺寸相关的API可以很方便的获取一个元素的宽度.高度,而且可以很方便的区分padding.b ...

  9. jQuery 2.0.3 源码分析 样式操作

    根据API分类 CSS addClass() jQuery.cssHooks .hasClass() .removeClass() .toggleClass() .addClass() 对元素的样式操 ...

随机推荐

  1. iOS 与 惯性滚动

    注:以下所有例子均 只 在 iOS 的微信中测试过,但对于饿了么APP的内置浏览器同样适用(两者使用相同内核) 引题 工作中常常有需要显示大量信息的情况,列表超出一屏就涉及到滚动的问题.例如 - va ...

  2. C#在Linux+Mono环境中使用微信支付证书

    最近特殊的需求,要把微信平台一个功能页面部署到Linux(CentOS6.5)下,其中涉及到微信支付退款. 鉴于之前实践过mono+jexus+asp.net mvc的部署,于是问题重点在于解决对商户 ...

  3. JavaScript-Function基础知识

    function   1.  定义:一段预先设置的代码块,可以反复调用,根据输入参数的不同,返回不同的值:   2.  函数的声明方法:     (1)function 命令声明函数  functio ...

  4. Python3.5 Day2作业:购物车程序

    需求: 1. 启动程序后,用户通过账号密码登录,然后打印商品列表. 2. 允许用户根据商品编号购买商品. 3. 用户选择商品后,检测余额是否足够,够就直接扣款,不够就提醒充值. 4. 可随时退出,退出 ...

  5. tf-idf知多少?

    1.最完整的解释 TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反 ...

  6. spring hibernate4 c3p0连接池配置

    c3p0-0.9.1.2.jar,c3p0-oracle-thin-extras-0.9.1.2.jar,点此下载 <bean id="dataSource" class=& ...

  7. java并发编程(十七)内存操作总结

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17377197 主内存与工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则, ...

  8. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  9. while(cin.eof)出错 poj

    zoj遇到c++如何判定输入流结尾的问题,一不小心就超时了 楼下的代码可以通过zoj #include<iostream> using namespace std; int main(){ ...

  10. Spket在Eclipse下的安装和配置(图文教程)

    一.Spket简介 Spket是一个RIA的开发工具,具有代码自动完成.语法高亮.内容概要等功能,可以帮助开发人员高效的编写JavaScript程序. 效果图: 二.安装Spket 1.去官网(htt ...