样式分为,外部样式(<link />),内部样式(<style></style>),行内样式(style:)。再加上一个important对选择器权重的干扰。

大体上,我们可以在标准浏览器上使用getComputedStyle,IE6-IE8下使用currentStyle来获取精确的样式。不过getComputedStyle不是元素上的方法,而是window的一个方法,它返回一个对象,这个对象可以调用getPropertyValue方法传入css标准风格的样式名获得其值。但是也可以使用属性+驼峰的风格去取值。我们可以写一个兼容的方法:

var getStyle = function(elem, name){   //传入元素,以及要查找的css属性的名字

  name = name.replace(/\-(\w)/g,function(all,letter){ 

        return letter.toUpperCase(); 

      }) ;

  //把css属性的名字改成驼峰形式的。all为匹配的子串,letter为子表达式匹配的子串,假设是margin-left,那么all为-l,letter为l,那么返回L,替换-l,就变成了marginLeft。这里需要改进,一些属性无法处理,比如:float,css3下的私有属性浏览器会有差异等。

  if(window.getComputedStyle){

    return window.getComputedStyle(elem,null)[name];   //第二个参数是处理伪类的,IE9不支持伪类的处理,因此这里要处理伪类的话,就会出错

  }

  else{

    return elem.currentStyle[name];

  }

}

接下来说一下需要注意的一些问题:

在标准浏览器下,如果元素节点没有插入DOM树,除了IE9-10,火狐,可以通过以上正常方法访问到内联样式外,其他的浏览器需要我们手动去找,可以通过$.contains方法。

在旧版本IE下,通过currentStyle取到的长,宽,如果有单位(比如:em,pc,pt),就很麻烦,它们不会自动进行单位换算。

float是js中的一个关键字,不能直接使用,就跟我在jQuery源码解析中说过的eval一样(http://www.cnblogs.com/chaojidan/p/4154310.html),IE这边用styleFloat,W3C用cssFloat代替。

CSS3中私有的前缀,IE:-ms-,Firefox:-moz-,Chrome:-webkit-,Safari:-webkit-,Opera:-o-。2013年初,谷歌嫌webkit内核太臃肿,决定单干,开发了blink,并在chrome28开始使用该内核,但是为了减轻用户负担,还是使用-webkit-做前缀。目前,使用-webkit-做前缀的有Opera,Safari,Chrome。

IE的前缀转换成js,前面的m是不大写的,而其他的浏览器会大写。举个例子:-ms-transform转换成js属性,就是msTransform,而-moz-transform,-webkit-transform转换成MozTransform,WebkitTransform。

透明度的设置:标准浏览器,包括IE9以及以上,设置透明度div{ opacity:0.5} (0-1之间的数,0不透明,1全透明)。opacity会同时让背景和内容透明,如果想让内容不透明,可以使用alpha。(比如:rgba,hsla)。IE6-8的透明度设置div{ filter:alpha(opacity=40)  }(0-100的数,相当于标准浏览器的0-1,0不透明,100全透明)。对于IE6-7,为了让透明设置生效,元素必须是拥有布局的(使一个元素拥有布局,很简单,设置元素的width,position,zoom=1等),判断一个元素是否拥有布局很简单,只要elem.style.hasLayout为true,就证明有布局。在IE7-8下,如果透明度为100,也就是全透明,会让文本模糊不清,不能设置100.

css3有一个叫user-select的样式,用于控制文本内容的可选择性。标准浏览器可以很方便的设置元素的这个样式,但是旧版本IE,没有这样的样式,必须使用unselectable属性代替。不过由于unselectable不具有继承性,加之子元素是位于父元素的上面,因此设置一个元素可选,要把它的所有子孙都设置才行。

background-position,背景图片的位置,比如:background-position:center;在js中取这个样式,backgroundPosition。IE6-7下没有这个属性,只有backgroundPositionX,backgroundPositionY,不过合起来就是backgroundPosition了。

z-index只能工作在被明确定义了absolute,fixed,relative这三个定位属性的元素中,它会让元素沿着z轴进行排序(z轴的起点为其父节点所在的层,终点为屏幕)。如果为正数,则离用户更近,为负数则离用户更远。举个例子:一个相对定位的父节点,然后里面有N个绝对定位的子元素,如果没有指定z-index,它们的显示方式按照出现的先后顺序排列,如果有z-index,就按照z-index的值排列,如果是负数,子元素就排在父节点的背后。但是有一些bug存在,比如IE6下的select元素,z-index为负数时,浏览器的差异化处理等。当我们获取一个元素的z-index值时,如果目标元素没有被定位,就往上回溯其祖先定位元素,找到,就返回定位祖先的z-index值,没找到,就返回0(IE返回0,其他标准浏览器返回auto)。如果元素定位了,就会去获取此元素的z-index,如果z-index不存在就返回0(IE返回0,其他标准浏览器返回auto),如果z-index的值不是数字(无效值),比如是"aaa"这种字符串,就会返回auto(所有的浏览器)。

第十八课:js样式操作需要注意的问题的更多相关文章

  1. NeHe OpenGL教程 第四十八课:轨迹球

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. Bootstrap入门(二十八)JS插件5:工具提醒

    Bootstrap入门(二十八)JS插件5:工具提醒 工具提示在使用过程中比较常见,但是实现起来有些麻烦,而bootstrap则很好地解决了这个问题. 我们来写一个简单的实例 先引入CSS文件和JS文 ...

  3. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第二十八课:贝塞尔曲面

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. NeHe OpenGL教程 第十八课:二次几何体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. 第六十四天 JS基础操作

    一.分支结构 1.if语句 if基础语句 if(条件表达式){ 代码块: } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通表达式 // 0.undefined ...

  7. 前端(十八)—— jQuery高级操作:选择器、文本属性与类、事件、文档操作、动画、结构关系

    JQ选择器.文本属性与类.事件.文档操作.动画.结构关系 可参考jQuery的API文档 一.选择器 1.css语法匹配 标签 | 类 | id | 交集 群组 | 后代 | 兄弟 伪类 | 属性 $ ...

  8. Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解

    CRM 2013 里流程有4个类别:操作(action).业务流程(business process flow).对话(dialog)和工作流(workflow).它们都是从 setting –> ...

  9. JS 样式操作学习总结。

    在我们编写网页的时候,样式表示我们常常需要相伴的内容,谁然很招人烦.恕我前端菜鸟对这东西很是无力啊.下面是我在代码浪潮中的虚席到的一些东西. 1.样式表内容修改方式. 2.当前元素样式内容获取. 3. ...

随机推荐

  1. 升级了win10后开启wifi热点出现iphone&macbook连接断线的问题(win7也一样)

    升级了win10后开启wifi热点出现iphone&macbook连接 不间断 断线的问题 文后附上开启虚拟wifi的办法 百度参考了别人也出现这种问题,解决办法是修改信道,默认信道是11,修 ...

  2. [转]ASP.NET MVC 4 (九) 模型绑定

    本文转自:http://www.cnblogs.com/duanshuiliu/p/3706701.html 模型绑定指的是MVC从浏览器发送的HTTP请求中为我们创建.NET对象,在HTTP请求和C ...

  3. oracle 高水位线详解

    一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称 ...

  4. jquery实现点击radio,当选中‘其它’时,显示后面输入框;否则隐藏

    有时候会遇到这么一个很简单的功能: jquery实现点击radio,当选中‘其它’时,显示后面输入框:否则隐藏 html代码: <div> <input type="rad ...

  5. HDU 4454 Stealing a Cake --枚举

    题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离. 解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离 ...

  6. FreeMarker 一二事 - 静态模板结合spring展示

    freemarker可以脱离web使用 前一篇文章使用了普通的方法 这回说说结合spring pom额外引入这个jar包 <dependency> <groupId>org.s ...

  7. java8-4 多态的练习以及题目

    1./* 多态练习:猫狗案例*/ class Animal { public void eat(){ System.out.println("吃饭"); } } class Dog ...

  8. Android Studio中提示:Project SDK is not defined

    Android Studio中提示:Project SDK is not defined 2015 年 4 月 1 日 下午 9:04crifan已有2209人围观我来说几句 [背景] 之前用Andr ...

  9. 3d照片环效果(修改版--添加了x轴y轴双向转动和修复模糊度的bug)

    今天用用前两天总结的css3新效果写了一个3d照片环的效果,其中还有些bug大家可以看一看,一起改进. <!DOCTYPE html> <html lang="en&quo ...

  10. SQLite 解决:Could not load file or assembly 'System.Data.SQLite ... 试图加载格式不正确的程序/or one of its dependencies. 找不到指定的模块。

     Could not load file or assembly 'System.Data.SQLite.dll' or one of its dependencies. 找不到指定的模块. 错误提示 ...