js 获取元素的具体样式信息getcss(实例讲解)


Posted in Javascript onJuly 05, 2017

如果想获取元素的某一个具体的样式属性值

1、元素.style.属性名

需要我们把元素的样式都写在行内样式上才可以(写在样式表中是不管用的)

console.log(box.style.height)  ->null

在真实项目中,这种方式不常用,因为不能为了获取值而把所有的样式都写在行内(无法实现html和css的分离)

2、使用window.getComputedStyle(当前操作的元素对象,当前元素的伪类【一般我们不用伪类写null】)这个方法获取所有经过浏览器计算过的样式

所有经过浏览器计算过的样式:只要当前的元素标签可以在页面中呈现出来,那么他的所有样式都是经过浏览器计算过的(渲染过的)->哪怕有些样式你没有写,我们也可以获取到

获取的结果是CSSStyleDeclaration这个类的实例:包含了当前元素的所有样式属性和值

console.log(window.getComputedStyle);//function

console.log(window.getComputedStyle(box,null))["height"]

3、方法虽然好用,但是在IE6-8下是不兼容的:因为window下没有getComputedStyle这个属性->会报错

在IE6-8下我们可以使用currentStyle来获取所有经过浏览器计算过的样式

console.log(box.currentStyle)

console.log(box.currentStyle.height)

获取样式的兼容写法getCss:获取当前元素所有经过浏览器计算过的样式中的[attr]对应的值

/*
      curEle:[object] 当前要操作的元素对象 
      attr:[string] 我们要获取的样式属性的名称
      1、使用try、catch来处理兼容(只有在不得已的情况下)
        前提:必须保证try中的代码在不兼容的时候报错,这样才可以catch捕获到错误信息,进行其他的处理
        不管当前的浏览器是否支持这个方法,都需要把try中的代码执行一遍,如果当前是IE7,window.getComputedStyle不兼容,但是也需要执行一遍再执行catch里面的代码,执行了两遍,消耗性能,
      2、判断当前浏览器中是否存在这个属性或者方法,存在就兼容,不存在就不兼容
      3、通过检测浏览器版本和类型来处理兼容 window.navigator.userAgent
      获取当前浏览器是IE6-8
      
    */
    function getCss(curEle,attr){
      var val = null;
      //方法2
      if("window.getComputedStyle" in window){//或者window.getComputedStyle
        var = window.getComputedStyle(curEle,null)[attr];
      }else{
        var = curEle.currentStyle[attr];
      }
      //方法1
      try{
        var = window.getComputedStyle(curEle,null)[attr];
      }catch(e){
        var = curEle.currentStyle[attr];
      }
      //方法3
      if(/MSIE (6|7|8)/.test(navigator.userAgent)){
        var = curEle.currentStyle[attr];
      }else{
        var = window.getComputedStyle(curEle,null)[attr];
      }
      return val;    
    }
console.log(getCss(box,"border"))
    console.log(getCss(box,"fontFamily"))

标准浏览器和IE浏览器获取的结果还是不一样的->对于部分样式属性,不同浏览器获取的结果不一样,主要是由于getComputedStyle和currentStyle在某些方面不一样

对于复合的样式值可以拆开来获取

console.log(getCss(box,"marginTop"))

上面的getCss还没有写完,下面进行第一次升级:把获取的样式值“单位去掉”(只有符合“数字+单位/数字”才可以使用parseFloat)

function getCss(curEle,attr){
      var val = null;
      var reg = null;
      if(/MSIE (6|7|8)/.test(navigator.userAgent)){
        var = curEle.currentStyle[attr];
      }else{
        var = window.getComputedStyle(curEle,null)[attr];
      }
      reg = /^(-?\d+(\.\d+)?)(px|pt|rem|em)?$/i;

      return reg.test(val)?parseFloat(val):val; //这样写肯定不行,对于某些样式属性的值是不能去单位的,例如:float position margin padding border  这些复合值 background  
    }

第二次升级:有些样式属性在不同的浏览器中是不兼容的,例如opacity

function getCss(curEle,attr){
      var val = null;
      var reg = null;
      if(/MSIE (6|7|8)/.test(navigator.userAgent)){
        if(attr==="opacity"){
          val = curEle.currentStyle["filter"];
          //把获取到的结果剖析,获取里面的数字,让数字除以100才和标准浏览器保持一致
          reg = /^alpha\(opacity=(\d+(?:\.\d+)?)\)$/i;
          val = reg.test(val)?reg.exec(val)[1]/100:1

        }else{
          val = curEle.currentStyle[attr];
        }        
      }else{
        //如果传递进来的结果是opacity,说明我想获得的是透明度,但是在IE6-8下获取透明度需要使用filter
        val = window.getComputedStyle(curEle,null)[attr];
      }
    }

在补充一个小的知识点:伪类

:before  :after  在一个元素便签的前面或者后面创建一个新的虚拟标签,我们可以给这个虚拟标签增加样式,也可以增加内容等...也可以通过伪类来进行清除浮动 可以通过如下方式获取 window.getComputedStyle(box,"before").content

以上这篇js 获取元素的具体样式信息getcss(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript基本对象
Jan 11 Javascript
js removeChild 障眼法 可能出现的错误
Oct 06 Javascript
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 Javascript
javascript 在firebug调试时用console.log的方法
May 10 Javascript
只需一行代码,轻松实现一个在线编辑器
Nov 12 Javascript
基于canvas实现的钟摆效果完整实例
Jan 26 Javascript
JavaScript中的继承之类继承
May 01 Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 Javascript
vue如何获取点击事件源的方法
Aug 10 Javascript
vue axios 在页面切换时中断请求方法 ajax
Mar 05 Javascript
微信小程序动态增加按钮组件
Sep 14 Javascript
解决 window.onload 被覆盖的问题方法
Jan 14 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
Jul 05 #Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
Jul 05 #Javascript
JS鼠标滚动分页效果示例
Jul 05 #Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
Jul 05 #jQuery
Angular 2父子组件数据传递之@Input和@Output详解 (上)
Jul 05 #Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
Jul 05 #Javascript
vue2.X组件学习心得(新手必看篇)
Jul 05 #Javascript
You might like
Protoss建筑一览
2020/03/14 星际争霸
php&java(三)
2006/10/09 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
JavaScript去掉空格的方法集合
2010/12/28 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python常用算法学习基础教程
2017/04/13 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
会计职业生涯规划范文
2014/01/04 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
英语导游词
2015/02/13 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
老员工辞职信范文
2015/05/12 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python