第十八课:js样式操作需要注意的问题
样式分为,外部样式(<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样式操作需要注意的问题的更多相关文章
- NeHe OpenGL教程 第四十八课:轨迹球
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Bootstrap入门(二十八)JS插件5:工具提醒
Bootstrap入门(二十八)JS插件5:工具提醒 工具提示在使用过程中比较常见,但是实现起来有些麻烦,而bootstrap则很好地解决了这个问题. 我们来写一个简单的实例 先引入CSS文件和JS文 ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第二十八课:贝塞尔曲面
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第十八课:二次几何体
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 第六十四天 JS基础操作
一.分支结构 1.if语句 if基础语句 if(条件表达式){ 代码块: } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通表达式 // 0.undefined ...
- 前端(十八)—— jQuery高级操作:选择器、文本属性与类、事件、文档操作、动画、结构关系
JQ选择器.文本属性与类.事件.文档操作.动画.结构关系 可参考jQuery的API文档 一.选择器 1.css语法匹配 标签 | 类 | id | 交集 群组 | 后代 | 兄弟 伪类 | 属性 $ ...
- Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解
CRM 2013 里流程有4个类别:操作(action).业务流程(business process flow).对话(dialog)和工作流(workflow).它们都是从 setting –> ...
- JS 样式操作学习总结。
在我们编写网页的时候,样式表示我们常常需要相伴的内容,谁然很招人烦.恕我前端菜鸟对这东西很是无力啊.下面是我在代码浪潮中的虚席到的一些东西. 1.样式表内容修改方式. 2.当前元素样式内容获取. 3. ...
随机推荐
- nginx命令详解
nginx的configure命令支持以下参数: --prefix=path 定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录.默认使用 /usr/local/nginx. --s ...
- hadooop 配置多网卡 提供跨网段服务
http://hortonworks.com/blog/multihoming-on-hadoop-yarn-clusters/ https://hadoop.apache.org/docs/r2.6 ...
- Jenkins插件hyper slaves源码分析
1.public class HyperSlaves extends Plugin implements Describable<HyperSlaves> (1).init():初始化co ...
- 【Ext.Net学习笔记】03:Ext.Net DirectEvents用法详解、DirectMethods用法详解
Ext.Net通过DirectEvents进行服务器端异步的事件处理.[Ext.Net学习笔记]02:Ext.Net用法概览.Ext.Net MessageBus用法.Ext.Net布局 中已经简单的 ...
- java 15 - 8 集合框架(并发修改异常的产生原因以及解决方案)
问题? 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. 面试题: Concu ...
- SqlServer 注入技巧
一.SA权限执行命令,如何更快捷的获取结果? 有显示位 显示位 其实这里的关键并不是有无显示位.exec master..xp_cmdshell 'systeminfo'生成的数据写进一张表的时候,会 ...
- 纯CSS3制作九款可爱复古相机
前言 掐指一算,快两个月没写博客分享了.好吧,我就只是在准备校招而已.现在已经有满意的offer了,所以我就回来啦!这两个月过得挺煎熬也挺充实的.具体细说估计得长篇大论,我就不闲扯了.总之呢,越努力, ...
- 安卓版微信内置浏览器,<a href="tel:电话号码"></a> 这个链接失效,不能跳到拨号界面?
https://segmentfault.com/q/1010000000318831 在URL最后面加“ #mp.weixin.qq.com ”,应该加其他qq.com的二级域名都行,估计是微信的安 ...
- 第二章 rabbitmq在mac上的安装
下载页: http://www.rabbitmq.com/install-standalone-mac.html 1.下载页面首部的文件(页面下载可能比较慢,使用迅雷下载就好),之后解压到一个合适的路 ...
- C语言 结构体中属性的偏移量计算
//计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...