首先我们要介绍一些知识

offsetWidth

  element.offsetWidth = width + padding + border;

width

我们也知道element.style.width 这个属性一般用来修改属性,那么在获取这个属性的时候,

如果这个元素的的样式是定义在css的文件或者头样式中,都是获取不到的,只有行内样式才是获取到

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>获取样式</title>
<style>
.animation{
background-color: green;
height: 200px;
width: 200px;
border: 1px solid #000;
}
</style>
</head>
<body>
<div id="test" class="animation"></div>
</body>
<script type="text/javascript">
window.onload = function(){
var ele = document.getElementById("test"),
timer = null; ele.onmouseover = function(){
startAnimation();
} function startAnimation(){
clearInterval(timer);
var _ele = document.getElementById("test");
timer = setInterval(function(){
//_ele.style.width = _ele.offsetWidth -1 +'px';//1 offsetWidth = width + padding + border
console.log(_ele.style.width);//2 当width不写入行内style="width:200px"中的话,定义在css文件中,获取不到width
//_ele.style.width = parseInt(_ele.style.width) - 1 +'px';//3 offsetWidth = width + padding + border //
},100)
} }
</script>
</html>

  我们把1和3 注释了,2注释打印就可以看出,是获取不到的width是200值的。只有把

<div id="test" class="animation" style="width:200px;"></div>

  这样就可以获得到width的值

现在我们来做一写测试,给这个div宽度缩小的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>获取样式</title>
<style>
.animation{
background-color: green;
height: 200px;
width: 200px;
border: 1px solid #000;
}
</style>
</head>
<body>
<div id="test" class="animation" ></div>
</body>
<script type="text/javascript">
window.onload = function(){
var ele = document.getElementById("test"),
timer = null; ele.onmouseover = function(){
startAnimation();
} function startAnimation(){
clearInterval(timer);
var _ele = document.getElementById("test");
timer = setInterval(function(){
_ele.style.width = _ele.offsetWidth -1 +'px';//1 offsetWidth = width + padding + border
//onsole.log(_ele.style.width);//2 当width不写入行内style="width:200px"中的话,定义在css文件中,获取不到width
//_ele.style.width = parseInt(_ele.style.width) - 1 +'px';//3 offsetWidth = width + padding + border //
},100)
} }
</script>
</html>

  但是我们看到的是这个元素在变大,这个是为什么呢?这个就是offsetWidth的原因,

1.开始的时候offsetWidth = width(200px)+padding(0px)+border(1+1) = 202px;

那么_ele.style.width = 202-1 = 201px;

2.当下一个计算,

那么offsetWidth = width(201)+padding(0px)+border(1+1) = 203px;

那么_ele.style.width = 203-1 = 202px;

依次类推,所以每次div元素的宽度都在变大。

那我们怎么解决~~上面我们说了把width的属性放入到行内样式中,可以达到这个效果

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>获取样式</title>
<style>
.animation{
background-color: green;
height: 200px;
width: 200px;
border: 1px solid #000;
}
</style>
</head>
<body>
<div id="test" class="animation" style="width:200px;"></div>
</body>
<script type="text/javascript">
window.onload = function(){
var ele = document.getElementById("test"),
timer = null; ele.onmouseover = function(){
startAnimation();
} function startAnimation(){
clearInterval(timer);
var _ele = document.getElementById("test");
timer = setInterval(function(){
//_ele.style.width = _ele.offsetWidth -1 +'px';//1 offsetWidth = width + padding + border
//onsole.log(_ele.style.width);//2 当width不写入行内style="width:200px"中的话,定义在css文件中,获取不到width
_ele.style.width = parseInt(_ele.style.width) - 1 +'px';//3 offsetWidth = width + padding + border //
},100)
} }
</script>
</html>

  这样解决了,但是有一个问题,就是每个要修改的属性都要写入到行内样式中,这样很不好,

那么我们有什么办法可以获取到头样式和css的样式,而不要一定要把样式写入行内样式中呢?

IE有ele.currentStyle[attr]   DOM 有 getComputedStyle(ele,false)[attr]

attr不只width ,height等,还有很多fontSize ,left ````

 function getStyle(obj,attr){
if(obj.currentStyle){//IE
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
}

  那么实现我们的功能就可以

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>获取样式</title>
<style>
.animation{
background-color: green;
height: 200px;
width: 200px;
border: 1px solid #000;
}
</style>
</head>
<body>
<div id="test" class="animation" ></div>
</body>
<script type="text/javascript">
window.onload = function(){
var ele = document.getElementById("test"),
timer = null; ele.onmouseover = function(){
startAnimation();
} function startAnimation(){
clearInterval(timer);
var _ele = document.getElementById("test");
timer = setInterval(function(){
//_ele.style.width = _ele.offsetWidth -1 +'px';//1 offsetWidth = width + padding + border
//onsole.log(_ele.style.width);//2 当width不写入行内style="width:200px"中的话,定义在css文件中,获取不到width
//_ele.style.width = parseInt(_ele.style.width) - 1 +'px';//3 offsetWidth = width + padding + border
_ele.style.width = parseInt(getStyle(_ele,'width')) - 1 +'px';//3 offsetWidth = width + padding + border
},100)
} function getStyle(obj,attr){
if(obj.currentStyle){//IE
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
} }
</script>
</html>

  

js动画之获取元素属性的更多相关文章

  1. JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性)

    JS(原生js和jq方式)获取元素属性(自定义属性),删除属性(自定义属性) 以下内容: 一.获取元素的属性 二.设置元素的属性 三.删除元素的属性 一.获取元素的属性 1-原生JS 获取属性 .ge ...

  2. JS中获取元素属性的逆天大法

    给大家聊下js中获取元素属性的逆天大法,胆小慎入,切记切记!!! innerHTML.outerHTML.innerText .outerText.value.text().html(),val() ...

  3. JQ方法实用案例///鼠标移动到div和修改ipt中弹窗、CSS鼠标变小手、JQ获取元素属性、JQ选择器

    今天学习了jQ,jQ对js的帮助很大,菜鸟教程上也有属性.可以查看 js 和 jquery主要的区别 在 dom    想用jquery  必须先引入(顺序问题)        先css 再js:   ...

  4. 原生JS与JQ获取元素的区别

    刚学JQ不久,有时候可能会把JS和JQ获取元素的方式搞错,接下来获取属性方法什么的就一发不可收拾了,现在把两者获取获取元素的代码整理下. 一.原生JS获取元素. 1.常用的三种方式获取元素对象(将指定 ...

  5. UI自动化之特殊处理四(获取元素属性\爬取页面源码\常用断言)

    获取元素属性\爬取页面源码\常用断言,最终目的都是为了验证我们实际结果是否等于预期结果 目录 1.获取元素属性 2.爬取页面源码 3.常用断言 1.获取元素属性 获取title:driver.titl ...

  6. appium+python自动化:获取元素属性get_attribute

    使用get_attribute()获取元素属性,括号里应该填写什么? 查看appium源码 如果是获取resource-id,填写resourceId self.driver.find_element ...

  7. JS获取元素属性

    <style> *{ box-sizing: border-box; } html, body { margin: 0px; width: 100%; height: 100%; over ...

  8. JS获取元素属性和自定义属性

    获取元素的属性分为两种类型: 1-获取元素常见的属性(class,id,type,value……) 2-获取自定义的元素的属性(data-value,data-mess…….) 获取元素的属性,设置元 ...

  9. js+jquery动态设置/添加/删除/获取元素属性的两种方法集锦对照(动态onclick属性设置+动态title设置)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140 ...

随机推荐

  1. hihoCoder 1432 : JiLi Number(吉利数)

    hihoCoder #1432 : JiLi Number(吉利数) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 Driver Ji l ...

  2. (转)Linux grep

    文章转自 http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html 简介 grep (global search regular ...

  3. AspNet MVC中各种上下文理解

    0  前言 AspNet MVC中比较重要的上下文,有如下: 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文) 过滤器有关有五个的上下文Actio ...

  4. android面试题

    1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...

  5. spring+redis

    配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www ...

  6. strcpy strlen memcpy等的函数实现

    #include <assert.h> #include <string.h> #include <stdlib.h> #include <stdio.h&g ...

  7. 6.1-CALayer 使用

    @设置圆角 注意点 1圆角效果,并不是在给定frame布局后有,要给定内容后才有 //头像 NSData *data = [[DJXMPPTool sharedInstance].cardAvatar ...

  8. Skyfree退休公告

    Skyfree退休公告 https://www.itsk.com/thread-372142-1-1.html Skyfree 发表于 2016-11-14 12:26:51 本以为到了这天,会有很多 ...

  9. SSAS 部署失败 总结

    今天部署微软官方的SSAS实例AdventureWorks Multidimensional Models SQL Server 2012到本地SQL SERVER数据库,报了好几个错误.总结一下给大 ...

  10. lua特性纪要

    [局部变量] lua的局部变量通过local进行显示声明, 其作用域仅限于声明它的块block.这里的block分为三种类型: 1.控制结构的执行体 2.函数的执行体 3.chunk 比较容易引起混淆 ...