20150912 javascript事件-获取样式

<!doctype html>

<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>

#div1{widht:200px;height:200px; background:#f00; border:4px solid black;}</style>

<script>
window.onload=function(){
    var oDiv=document.getElementById("div1");
    oDiv.onclick=function(){
        startMove();
        }

    }
var timer=null;
function startMove(){
    clearInterval(timer);
    timer=setInterval(function(){

        var oDiv=document.getElementById("div1");
oDiv.style.width=oDiv.offsetWidth-1+"px";
        },50)
    }

</script>

</head>
<body>
<div id="div1"></div>
</body>
</html>

问题一:var timer=null 必须放在全局定义,函数内部定义无效果,为什么?
  思考结果:因为,每一次点击div,都会另外开启一个定时器,而在函数内部定义timer,只是一个局部变量timer,无法影响已经开启的timer,所以需要将timer定义在全局,以便所有定时器都共用这一个timer

问题二.为什么增加1像素边框后,div未按预期的逐渐减小,而是逐渐增大呢?
  因为:offsetWidht值是指div的宽度加上它的边(widht+border),所以:计时器开始计时第一次,将offsetWidth值-1后,实际将div的宽度变为了201px;然后依次类推,每次都会增加1像素,和原本期望的结果恰好相反。
  解决办法:将div的widht值改为行内样式,即<div id="div1" style="widht:200px">,同时修改代码 oDiv.style.width=oDiv.offsetWidth-1+"px"; 改为:oDiv.style.width=parseInt(oDiv.style.width)-1+"px";
  关键点将offsetWidth值替换为oDiv.style.width。
  

修改代码部分代码如下:

<style>
#div1{height:200px; background:#f00; border:4px solid black;}
</style>
<script>
window.onload=function(){
    var oDiv=document.getElementById("div1");
    oDiv.onclick=function(){
        startMove();
        }

    }
var timer=null;
function startMove(){
    clearInterval(timer);
    timer=setInterval(function(){
        var oDiv=document.getElementById("div1");
        oDiv.style.width=parseInt(oDiv.style.width)-1+"px";
        },50)
    }
</script>
</head>
<body>
<div id="div1" style="width:200px"></div>
</body>

但是带来新的问题:无法将所有样式都写在行内并在js中进行获取。

解决办法:使用getComputedStyle()和currentStyle来解决该办法。

    封装一个getStyle()的函数,用来获取样式中的任意属性

最终代码如下<!doctype html>

<html>
<head>
<meta charset="utf-8">
<title>获取样式</title>
<style>
#div1{width:200px;height:200px; background:#f00; border:10px solid black;  font-size:6px; color:white;}
</style>
<script>
window.onload=function(){
    var oDiv=document.getElementById("div1");
    oDiv.onclick=function(){
        startMove();
        }

    }
var timer=null;
function startMove(){
    clearInterval(timer);
    timer=setInterval(function(){

        var oDiv=document.getElementById("div1");
        oDiv.style.width=parseInt(getStyle(oDiv,‘width‘))-1+"px";
//任意属性的变化,在这里都可以进行添加
        },50)
    }
//封装好的获取样式的函数
function getStyle(obj,attr){
    if(obj.currentStyle){
        return obj.currentStyle[attr];//兼容ie
        }
    else{
        return getComputedStyle(obj,false)[attr];//兼容ff
        }
    }
</script>
</head>
<body>
<div id="div1">font-size</div>
</body>
</html>
时间: 2024-10-22 10:41:45

20150912 javascript事件-获取样式的相关文章

javascript 获取样式表里的属性值 currentStyle 和 getComputedStyle 的使用

很多时候我们要获取 CSS 样式表里面的值(非行间样式),而获取行间样式的属性值那么这用 obj.style.attr 就能获取得到,那么怎么样才能获取到CSS样式表里面的值呢,那么就要请出我们的主角 currentStyle 和 getComputedStyle ,简要的介绍一下他们,再封装一个函数来兼容各个浏览器. 介绍: currentStyle :这个属性是 IE 浏览器上使用的. getComputedStyle :这个方法是 搞基 浏览器上使用的. 封装: //这里的 obj 参数指

day26—JavaScript对CSS样式的获取和修改实践

转行学开发,代码100天--2018-04-11 通过JavaScript获取和修改HTML元素及CSS属性是其一个基本功能.对于CSS样式通常有行内样式,外部样式,内嵌样式之分. 如: 行内样式: <div id="box" style="width: 100px;height: 100px;background:#ccc"></div> 外部样式: <link rel="stylesheet" type=&quo

利用原生JavaScript获取样式的方式小结

来源:http://www.ido321.com/930.html ps:是获取样式,不是设置样式.若没有给元素设置样式值,则返回浏览器给予的默认值.(论坛整理) 1.element.style:只能获取写在元素标签中的style属性里的样式值,无法获取到定义在<style></style>和通过<link href="css.css">加载进来的样式属性 1: var ele = document.getElementById('ele'); 2:

使用JavaScript获取样式的属性值

1 . 在js中可以使用style属性来获取样式的属性值(只能获取内联样式的属性值) 语法格式为: HTML元素.style.样式属性; 2 .   在IE浏览器中,使用currentStyle来获取属性值 语法格式为: HTML元素.currentStyle.样式属性: 3 . DOM提供了一个getComputedStyle()方法来获取属性值, Firefox,Opera,Safari,Chrome等浏览器支持(IE浏览器不支持) 语法格式: document.defaultView.ge

javascript事件兼容处理以及时间冒牌、捕获

/cancelBubble阻止事件冒泡 function cancelBubble(ev){ var ev=ev||window.event; if(ev.stopPropagation){ ev.stopPropagation(); }else{ ev.cancelBubble=true; } } //获取样式 function getStyle(obj,attr){ if(getComputedStyle){ getComputedStyle(obj)[attr]; }else{ obj.c

javascript事件委托机制详解

以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点击一个li时实现弹出该li的信息 <ul class="top"> <li>橘子</li> <li>香蕉</li> <li>苹果</li> <li>梨子</li> <li>

JavaScript事件---事件对象

原文:JavaScript事件---事件对象 发文不易,若转载传播,请亲注明出处,谢谢!   内容提纲: 1.事件对象 2.鼠标事件 3.键盘事件 4.W3C与IE JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功能.最方便和强大的就是事件对象,他们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事件的捕获/冒泡流的函数. 一.事件对象 事件处理函数的一个标准特性是,以某些方式访问的事件对象包含有关于当前事件的上下文信息. 事件处理三

Javascript 事件对象(六)键盘事件

keyCode获取用户按下键盘的哪个按键 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>无标题文档</title> 6 <script> 7 /* 8 onkeydown : 当键盘按键按下的时候触发

JavaScript事件流原理解析

一.为什么会有这一篇的文章 国庆前几天由于任务比较重,要赶在国庆前把一个进度的任务开发完成,所以也就有点赶,但是却遇到了一个比较奇怪的Bug,导致了任务比预计的延迟了几个小时,对此深表遗憾,所以利用国庆的这段时间来补一补这个不足,也为了国庆后能够更好的完成公司的业务打下基础 二.大致了解什么是JavaScript事件流 首先这里先来举一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta chars