`
bluenemo
  • 浏览: 176485 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

js中scrollLeft,scrollWidth,clientWidth,offsetWidth完全详解

阅读更多

scrollHeight: 获取对象的滚动高度。

scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离

scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离

scrollWidth:获取对象的滚动宽度

offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度

offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置

offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置

event.clientX 相对文档的水平座标

event.clientY 相对文档的垂直座标

event.offsetX 相对容器的水平坐标

event.offsetY 相对容器的垂直坐标

document.documentElement.scrollTop 垂直方向滚动的值

event.clientX+document.documentElement.scrollTop 相对文档的水平座标+垂直方向滚动的量

 

以上主要指IE之中,FireFox差异如下:

IE6.0、FF1.06+:

clientWidth = width + padding

clientHeight = height + padding

offsetWidth = width + padding + border

offsetHeight = height + padding + border

IE5.0/5.5:

clientWidth = width - border

clientHeight = height - border

offsetWidth = width

offsetHeight = height

(需要提一下:CSS中的margin属性,与clientWidth、offsetWidth、clientHeight、offsetHeight均无关)

 

js width height 图解

 

 

&  scrollLeft(right,top,bottom)的用法和特点

在图片滚动的方法中,最常用的就是scroll方法。


上图所示的滚动条,我们称为srcollBar。在div的内容宽度超过div的宽度时。我们给div加属性overflow-x:scroll;就会出现这种效果。见得最多的scrollBar就是浏览器右侧的了。大家都很熟悉。当我们拖动滚动条的时候,未显示部分就会随着拖动显示出来。我们拖动的距离,就是scroll的大小,拖动的距离在四个不同方向上,就有了scrollLeft,scrollRight,scrollTop,scrollBottom四个属性。

这里我们以scrollLeft为例,其他三个都是一样的。由scrollLeft的由来,我们可以知道,如果scrollLeft值递增,效果也就相当于滚动条在向右拖动。在没有scrollBar的情况下,增加scrollBar的值,同样会有内容左移的效果。

也就是说使用scrollLeft的必要条件是

第一:此标签的内容宽度超过了标签本身的宽度

这个很容易理解,如果内容没有超过标签的宽度,不需要横向的滚动就可以看到所有横向的范围,那在使用scrollLeft的时候肯定是无效的了。

在这里很多新手经常会犯一个错误,内容的大小确实是超过了标签的显示范围,但是却因为浏览器的默认属性换行了,也就是没有在横向上超出,这时候同样是不能使用scrollLeft的。

第二:scrollLeft的值范围是在一定范围内的,不能无限增大。

当内容的最右端可以显示的时候,scrollLeft便不能再增加了。这个也容易理解。以浏览器右侧滚动条为例,这个滚动条肯定是能拖到底的,这个拖动有一定的范围,跟页面内容高度有关。

第三:scrollLeft(包括其他三个)常与定时器一起使用,实现位置移动效果,如滚动。

 

& JS定时器setTimeout与setInterval用法分析及实例详解

      定时器可以说是js前端最常用的工具,几乎所有的逐渐变化的动态效果都会使用到定时器,比如说图片滚动(位置渐变)。渐隐渐现。拖拽(不使用计时器会多消耗大量资源)等等。

     

    定时器分两种分别是setTimeout和setInterval。

两者的用法分别是setTimeout(funhander,time);setInterval(fnhander,time);设置的相应计时器需要用clearTimeout(对象)和clearInterval(对象)清掉。有以下几点需要注意:

    第一:setTimeout(funhander,time)的作用是在过time毫秒后,执行一次句柄funhander指向的方法。而setInterval(funhander,time)的作用是,每隔time毫秒后,就执行一次句柄funhander指向的方法。一直到我清掉计时器停止。

    第二:巨大多数的计时器使用都是为了执行渐变、渐隐渐现、位置渐变等效果,所以funhander指向的方法会被多次执行。因此如果我们使用setTimeout做定时器,一般要把计时器的设置写在funhander指向的方法里,这样就可以循环调用,多次执行funhander,一直到我清掉这个定时器。而在使用setInterval设置定时器的时候,一般要放在funhander指向行数的外面。

    第三:funhander指向的方法里处理了渐变中的一步,又会被重复执行,所以在此方法中大多包含有判断语句IF。用来控制渐变到一定程度的时候进行相应处理。比如清掉定时器或者进行循环操作。

    第四:funhander为句柄,此处还可以为代码段,假设重复调用的函数为function test() {alert("1");}则,我们可以写为 var timer = setTimeout(test,1000)或者 var timer = setTimeout("test()",1000)或者 var timer = setTimeout("alert("1")",1000)。但是下面的写法是错误的。var timer = setTimeout(test(),1000)。

    第五:因为funhander部分是句柄,所以不能传递参数,但是有些函数是必须要传递参数的,这时候我们一般用代码段。如果碰到又需要用句柄,又不能用代码段的特殊情况,我们一般用比较特殊的方法处理。如 var timer =setTimeout(test(name),1000)。这时候这个test(name)看起来是不对的,实际上如果他的返回值是一个没有传参的方法,利用子函数可以调用父函数变量的特点,把参数传递到返回函数(子函数)内部。那上面的写法一样是可以的。

    第六:在设定时器的时候一定要有返回值timer(当然你可以起自己想要的名字)。清掉定时器的时候需要使用,也是一个好的习惯。

 

    下面是网上常见的一个例子,我稍微改动了下。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> New Document </title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<form action="">
<input type="text" value="0" name="txt1"/>
<input type="button" value="开始" name="btnStart"/>
<input type="button" value="重置" name="btnReset"/>
</form>
</body>
</html>
<script language="JavaScript" type="text/javascript">
<!--
//获取表单中的表单域
var txt=document.forms[0].elements["txt1"];
var btnStart=document.forms[0].elements["btnStart"];
var btnReset=document.forms[0].elements["btnReset"]
//定义定时器的id
var id;
//每10毫秒该值增加1
var seed=0;

btnStart.onclick=function(){
      //根据按钮文本来判断当前操作
      if(this.value=="开始"){
              //使按钮文本变为停止
              this.value="停止";
              //使重置按钮不可用
              btnReset.disabled=true;
              //设置定时器,每0.01s跳一次
              id=window.setInterval(tip,10);
      }else{
              //使按钮文本变为开始
              this.value="开始";
              //使重置按钮可用
              btnReset.disabled=false;
              //取消定时
              window.clearInterval(id);
      }
}

//重置按钮
btnReset.onclick=function(){
     seed=0;
txt.value=seed/100;
}
//让秒表跳一格
function tip(){
      seed++;
      txt.value=seed/100;
}
//-->
</script>

 

下面看一个滚动效果的实例。非常简单,就是内容从左滚动最右的效果。如果有兴趣的话可以吧内容换成图片什么的,看起来会漂亮些。


 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>滚动图片</title>
<style type="text/css">
body,div{border:0;margin:0;padding:0;}
#outer {overflow:hidden;width:300px;border:1px red solid;margin:50px auto;height:148px;}
.part1 {height:140px;width:500px;overflow:hidden;border:4px blue solid;}
</style>
</head>
<body>
<div id="outer">
<div class="part1">
   这里可以放图片什么的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
</div>
</div>
</body>
<script type="text/javascript" language="javascript">
function test() {
document.getElementById("outer").scrollLeft++;
}
var run = setInterval(test,100);
</script>
</html>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics