├── demo
└── demo.html
├── README.md
└── cssControl.1.0.0.js
/demo/demo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | css control demo
5 |
6 |
7 | Test
8 |
9 |
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## 原生JS实现CSS样式的get与set,兼容主流浏览器与 IE678
2 |
3 | ### 初始化方法
4 | ###### 1) 提供 var cc = new CC() 构造函数,构建 cssControl 实例,然后 cc.getStyle(elem, style) 调用
5 | ###### 2) 或者直接 CC().getStyle(elem, style) 进行调用
6 |
7 | ### 核心方法
8 | ###### 1) getStyle(elem, style) -- 用于获取结点为 elem 的 style 样式
9 | ###### 2) setStyle(elem, style, value) -- 用于设置结点为 elem 的 style 样式为 value
10 |
11 | ## 博客园相关blog
12 | [【CSS进阶】原生JS getComputedStyle等方法解析](http://www.cnblogs.com/coco1s/p/5210667.html)
13 |
14 |
15 |
--------------------------------------------------------------------------------
/cssControl.1.0.0.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @author Coco
3 | * QQ : 308695699
4 | * @name cssControl 1.0.0
5 | * @description 原生 JS 实现 CSS 样式的 get 与 set,兼容主流浏览器与 IE678
6 | * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 | * 1、使用原生 JS 实现 CSS 样式的 get 与 set
8 | *
9 | * 2、初始化方法,
10 | * 1)提供 var cc = new CC() 构造函数,构建 cssControl 实例,然后 cc.getStyle(elem, style) 调用
11 | * 2)也可以不使用 new 运算符将 cssControl 实例化 var cc = CC(); 然后 cc.getStyle(elem, style) 调用
12 | * 3)或者直接 CC().getStyle(elem, style) 进行调用
13 | *
14 | * 3、核心方法
15 | * getStyle(elem, style) -- 用于获取结点为 elem 的 style 样式
16 | * setStyle(elem, style, value) -- 用于设置结点为 elem 的 style 样式为 value
17 | *
18 | */
19 | ;
20 | (function(window, undefined) {
21 |
22 | var
23 | doc = document,
24 | win = window,
25 | cssControl = function() {
26 | return new cssControl.prototype.init();
27 | }
28 |
29 | // IE 下获取透明度
30 | function getIEOpacity(elem) {
31 | var filter = null;
32 |
33 | // 早期的 IE 中要设置透明度有两个方法:
34 | // 1、alpha(opacity=0)
35 | // 2、filter:progid:DXImageTransform.Microsoft.gradient( GradientType= 0 , startColorstr = ‘#ccccc’, endColorstr = ‘#ddddd’ );
36 | // 利用正则匹配,注意 ?: 的用法
37 | filter = elem.style.filter.match(/(?:progid:[\w.]+.)?alpha\((?:[^,]+,)?\s*opacity=(\d+)\s*\)/i) || elem.style.filter.match(/alpha\(opacity=(.*)\)/i);
38 |
39 | if (filter) {
40 | var value = parseFloat(filter);
41 | if (!isNaN(value)) {
42 | // 转化为标准结果
43 | return value ? value / 100 : 0;
44 | }
45 | }
46 | // 默认返回 1
47 | return 1;
48 | }
49 |
50 | // IE 下将 CSS 命名转换为驼峰表示法
51 | // background-color --> backgroundColor
52 | // 利用正则处理一下就可以了
53 | function camelize(attr) {
54 | // /\-(\w)/g 正则内的 (\w) 是一个捕获,对应后面 function 的 letter
55 | // 意思是将 匹配到的 -x 结构的 x 转换为大写的 X (x 这里代表任意字母)
56 | return attr.replace(/\-(\w)/g, function(all, letter) {
57 | return letter.toUpperCase();
58 | });
59 | }
60 |
61 | cssControl.prototype = {
62 | init: function() {
63 | return this;
64 | },
65 | // 获取样式
66 | getStyle: function(elem, style) {
67 | // 主流浏览器
68 | if (win.getComputedStyle) {
69 | // 获取 float 属性使用 cssFloat
70 | // 测试最新版的浏览器,使用 cssFloat 已经获取不到 float 了,直接使用下面的通用语法
71 | // if(style === "float"){
72 | // return win.getComputedStyle(elem, null).getPropertyValue("cssFloat");
73 | // }
74 | return win.getComputedStyle(elem, null).getPropertyValue(style);
75 |
76 | // 不支持 getComputedStyle
77 | } else {
78 | // IE 下获取透明度
79 | if (style == "opacity") {
80 | getIEOpacity(elem);
81 |
82 | // IE687 下获取浮动使用 styleFloat
83 | } else if (style == "float") {
84 | return elem.currentStyle.getAttribute("styleFloat");
85 |
86 | // 未设置元素的高宽,获取的值是 auto
87 | // 这里要获取精确的 px 值,使用 elem.getBoundingClientRect 进行 hack
88 | // 跨浏览器的方法 getBoundingClientRect 可以获得元素四个点相对于文档视图左上角的值 top、left、bottom、right ,通过计算就可以容易地获得准确的元素大小
89 | } else if ((style == "width" || style == "height") && (elem.currentStyle[style] == "auto")) {
90 | var clientRect = elem.getBoundingClientRect();
91 |
92 | // 加上 px ,转化为标准输出
93 | return (style == "width" ? clientRect.right - clientRect.left : clientRect.bottom - clientRect.top) + "px";
94 | }
95 |
96 | // 其他样式,无需特殊处理
97 | return elem.currentStyle.getAttribute(camelize(style));
98 | }
99 | },
100 | // 设置样式
101 | setStyle: function(elem, style, value) {
102 | // 如果是设置 opacity ,需要特殊处理
103 | if (style == "opacity") {
104 |
105 | //IE7 bug:filter 滤镜要求 hasLayout=true 方可执行(否则没有效果)
106 | if (!elem.currentStyle || !elem.currentStyle.hasLayout) {
107 | // 设置 hasLayout=true 的一种方法
108 | elem.style.zoom = 1;
109 | }
110 | // IE678 设置透明度叫 filter ,不是 opacity
111 | style = "filter";
112 |
113 | // !!转换为 boolean 类型进行判断
114 | if (!!window.XDomainRequest) {
115 | value = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=" + value * 100 + ")";
116 | } else {
117 | value = "alpha(opacity=" + value * 100 + ")"
118 | }
119 | }
120 |
121 | // 通用方法
122 | elem.style.cssText += ';' + (style + ":" + value);
123 | }
124 | }
125 |
126 | cssControl.prototype.init.prototype = cssControl.prototype;
127 |
128 | // 暴露接口
129 | window.CC = cssControl;
130 |
131 | })(window);
132 |
--------------------------------------------------------------------------------