原生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 相关文章推荐
IE与Firefox在JavaScript上的7个不同句法分享
Oct 30 Javascript
创建公共调用 jQuery Ajax 带返回值
Aug 01 Javascript
js使用html()或text()方法获取设置p标签的显示的值
Aug 01 Javascript
js监听鼠标事件控制textarea输入字符串的个数
Sep 29 Javascript
JavaScript使用addEventListener添加事件监听用法实例
Jun 01 Javascript
JavaScript知识点整理
Dec 09 Javascript
JS显示日历和天气的方法
Mar 01 Javascript
js实现不重复导入的方法
Mar 02 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
详解vue mixins和extends的巧妙用法
Dec 20 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
Jul 31 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
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
JavaScript实现刷新不重记的倒计时
2016/08/10 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
简单介绍Ruby中的CGI编程
2015/04/10 Python
python实现中文输出的两种方法
2015/05/09 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python使用tornado实现登录和登出
2018/07/28 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
Django中FilePathField字段的用法
2020/05/21 Python
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
应聘教师自荐信
2013/10/12 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
电子银行业务授权委托书
2014/10/10 职场文书
大四学生个人总结
2015/02/15 职场文书
小学工作总结2015
2015/05/04 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android
使用Apache Camel表达REST服务的方法
2022/06/10 Servers