第十八课: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. ...
随机推荐
- Super A^B mod C
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B ...
- poj 1050 To the Max(最大子矩阵之和,基础DP题)
To the Max Time Limit: 1000MSMemory Limit: 10000K Total Submissions: 38573Accepted: 20350 Descriptio ...
- 简单好用的日志管理工具 Logrotate
前言 日志就像程序的生命记录仪,详细记录下了程序运行的点点滴滴. 慎重的选择记录哪些日志:在茫茫日志海中寻找真正记录问题的日志,你是不想经历的: 精心的定时压缩转移日志:故障发生了,日志却丢了,此时的 ...
- zabbix_server 已死,但是 subsys 被锁
一开始 grant all privileges on zabbix.* to zabbix@localhost identified by 'password'; 将localhost改为ip后恢 ...
- 迅为iTOP-4418开发板兼容八核6818开发板介绍
核心板介绍 三星四核S5P4418与八核6818完美兼容 1GB内存/2GB内存可选 电源管理:AXP228,支持动态调频,超低功耗 核心板引出脚最全:四组连接器共320个PIN脚 核心板连接器高度仅 ...
- Asp.net web form 动态生成控件的注意事项
Asp.net页面生命周期 页面初始化 Page_Init 加载View State LoadViewState 回发数据处理 LoadPostData ...
- [转]SQLServer SQL执行效率和性能测试方法总结
本文转自:http://www.zhixing123.cn/net/27495.html 对于做管理系统和分析系统的程序员,复杂SQL语句是不可避免的,面对海量数据,有时候经过优化的某一条语句,可以提 ...
- Oracle索引(B*tree和Bitmap)学习
在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引. (1).与索引相关 ...
- Java中的流
一.Java中流的原理 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行.设备可以是文件,网络,内存等. 四种基本流InputStream,Ou ...
- AC日记——无线网络发射器选址 洛谷 P2038
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...