原生javascript实现读写CSS样式的方法详解


Posted in Javascript onFebruary 20, 2017

前言

可能大家一说起操作css样式,很多人都会想到jQuery的css方法:$(selector).css(name) ,但是有思考过如何使用原生js来实现类似的功能么?

大家最熟悉的原生js操作样式的方法非DOM中的Style对象莫属了,但是这个方法只能获取和修改html文档中的内联样式,无法操作非内联样式(内部样式和外部样式表)。

我通过搜索和整理,总结了使用原生js对css样式的读写实现。下面话不多说,来看看详细的介绍吧。

获取样式

1. dom style

这个方法只能获取内联样式:

var text = document.getElementById('text');
var textColor = text.style.color;

// 得到textColor的值为 '#000'

2. currentStyle

这个方法只适用于IE浏览器,在形式上与element.style相近,区别在于正如currentStyle其名——目前的样式(css加载后的样式),返回的是元素当前最终的CSS属性值,包括了内部style标签里的样式和外部引入的css文件。

用法:元素.currentStyle.属性

比如我们要获取id为box的width:

var boxWidth = document.getElementById('box').currentStyle.width;

// 得到boxWidth的值为 '200px'

3. getComputedStyle

getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),并且是只读的。

在兼容性上,基本支持:Chrome、Firfox、IE9、Opera、Safari

用法:getComputedStyle(元素, 伪类).属性,第二个参数如果不是伪类就设置为null吧。

var el = document.getElementById("box");
var style = window.getComputedStyle(el , ":after");

来~封装一个通用的获取样式的函数

为了适用于各大主流浏览器,我们来写一个函数:

// 这个函数需要传递两个参数:元素对象和样式属性名称

function getStyle(el, styleName) {

 if( el.currentStyle ) {
 
 // for IE
 return el.currentStyle[styleName];
 
 } else {
 
 // for peace
 return getComputedStyle(el, false)[styleName];
 }
 
}

接着调用这个函数来获取box的宽度:

var box = document.getElementById("box");

var boxWidth = getStyle(box, 'width');

这个函数并没有考虑到对伪类的相关操作,可以根据需要自行扩展~

getComputedStyle与style的区别?

既然都是获取样式属性的值,它们有啥区别呢:

只读与可写

getComputedStyle方法是只读的,只能获取样式而不能设置,但是element.style既能读也能写。

获取的对象范围

getComputedStyle方法获取的是最终应用在元素上的所有CSS属性对象(即使没有CSS代码,也会把默认的祖宗八代都显示出来);而element.style只能获取元素style属性中的CSS样式。因此对于一个光秃秃的元素<p>,getComputedStyle方法返回对象中length属性值(如果有)就是190+(据我测试FF:192, IE9:195, Chrome:253, 不同环境结果可能有差异), 而element.style就是0。

引用自——张鑫旭博客文章

设置样式

1. dom style

这个不用说了吧,比如把元素的背景颜色改为红色:

var el = document.getElementById('box');
el.style.backgroundColor = 'red';

2. cssText属性

cssText 的本质就是设置 HTML 元素的 style 属性值。它是一组样式属性及其值的文本表示。这个文本格式化为一个 CSS 样式表,去掉了包围属性和值的元素选择器的花括号。

它的用法和innerHTML类似: document.getElementById("d1").style.cssText = "color:red; font-size:13px;";

详细请参考: CSSRule.cssText - Web APIs | MDN

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用Javascript能带来一定的帮助,如果有疑问大家可以留言交流。谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript操纵窗口的方法小结
Jun 28 Javascript
自己动手写的javascript前端等待控件
Oct 30 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 Javascript
jQuery+css实现的切换图片功能代码
Jan 27 Javascript
jQuery获取table表中的td标签(实例讲解)
Jul 28 jQuery
基于AngularJS实现表单验证功能
Jul 28 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
微信小程序仿美团城市选择
Jun 06 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
Oct 12 Javascript
JavaScript对JSON数组简单排序操作示例
Jan 31 Javascript
vue生命周期与钩子函数简单示例
Mar 13 Javascript
JS的时间格式化和时间戳转换函数示例详解
Jul 27 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 #Javascript
js中new一个对象的过程
Feb 20 #Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 #Javascript
jQuery实现鼠标跟随效果
Feb 20 #Javascript
BootStrap fileinput.js文件上传组件实例代码
Feb 20 #Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
Feb 20 #Javascript
分享一道关于闭包、bind和this的面试题
Feb 20 #Javascript
You might like
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
跟老齐学Python之用while来循环
2014/10/02 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
遗传算法之Python实现代码
2017/10/10 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
django最快程序开发流程详解
2019/07/19 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
携程英文网站:Trip.com
2017/02/07 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
一道Delphi上机题
2012/06/04 面试题
关于环保的演讲稿
2014/05/10 职场文书
企业法人授权委托书
2014/09/25 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
2014年人大工作总结
2014/12/10 职场文书
党校毕业个人总结
2015/02/28 职场文书
公司员工体检通知
2015/04/21 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
《将心比心》教学反思
2016/02/23 职场文书
python munch库的使用解析
2021/05/25 Python