技术标签: js scrollLeft setInterval 滚动 定时器
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均无关)
& 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>
来源:网络
$(window).height()必须最开始申明 <!DOCTYPE> 否则获取的结果不正确,最好使用替代的方法window.innerHeight||document.documentElement.clientHeight ||document.body.clientHeight; 网页可见区域宽: document.body.clientWidth; 网页可见区域高: docu...
二、涉及问题和总体概括: 如果你对width,offsetWidth,clientWidth,scrollWidth,offsetLeft,clientLeft,scrollLeft这几个的差别还不是很熟悉,那你最好翻阅资料搞清楚, 当然,你也可以看一下本文(虽然写的很差劲);...
demo1 View Code demo2 View Code demo3 View Code 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offsetWidth (包括边线的宽); 网页可见区域高: documen...
Web前端之 offsetWidth,clientWidth,scrollWidth,offsetLeft,clientLeft,scrollLeft 一...
最近学习原生js的时候,被几个属性绕晕了@_@(scrollWidth、clientWidth、offsetWidth),所以看了一些资料和文档,整理出了一篇文章,水平有限,不足之处请多多包涵。 转载请注明出处:http://www.cnblogs.com/xiaovw/articles/8351689.html 首先,来说一下这三个属性都是什么意思。 ...
最近再处理表单时,需要根据前一列的内容宽度计算之后列的位置,也需要根据前一行的高度计算下一行的位置。 这里几个width和height弄得有点懵,百度了一下,以下是百度到的内容,存下来备忘~~ 首先定义一个div。 然后稍微装修一下 下面开始区分 作者:恪守你我他 来源:CSDN 原文:https://blog.csdn.net/qq_42089654/article/details/805159...
首先定义一个div。 然后稍微装修一下 下面开始区分 一、clientWidth和clientHeigh 、 clientTop和clientLeft 1,clientWidth的实际宽度 cl...
本篇打算用两张图片分别说明标题提出的问题。这两张图片都是使用 Power BI 制作的,具体如下:首先,为何要使用Power BI呢?除了能够处理百万行级别的大数据之外,最重要的是对数据源的兼容性,比如一个报告中可以同时从Excel,各类不同数据库,甚至网抓等获取数据,并建立分析模型。对于致力于开发企业级BI报告的使用者来说,通过熟练灵活使用DAX语言来进行更加复杂和多样化灵活的多表间数据分析,能...
用纯CSS也可以实现各种各样很酷的效果了,甚至是动画。虽然有些效果不能跨浏览器(甚至是支持CSS3的浏览器)运行,有些只是展示并没什么实际 用途, 但仅用CSS实现出的这些效果似乎没什么可以挑剔的。 对于设计人员和开发人员来说,CSS一直是web设计过程中重要的一部分,随着CSS3的出现以及越来越多的浏览器对它的支持,设计师们有了 更多的选择。用纯CSS也可以实现各种各样很酷的效果了,甚至是动画。...
2019独角兽企业重金招聘Python工程师标准>>> TCP/IP协议分层 TCP/IP是传输层协议,主要解决数据如何在网络中传输; HTTP是应用层协议,主要解决如何包装数据。 Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。HTTP是轿车,提供了封装或...
I've tried many times to create a table view and delete certain rows, I even asked this question here before and implemented what they advised but yet failed to even get my table ViewController.h View...
I'm new to ruby and this looks wrong but works fine So how do I do this without having an end.compact? Some notes Your method is called get_internal_deps, but it looks like it actually sets an instanc...
Say I have two files: where table.html holds my table (e.g the following contents): and index.html just has the datatables code, e.g. The above doesn't work, because the reference my_table is not foun...
I'm using NSData+AESCrypt category by Jim Dovey and NSString+AESCrypt by Michael Sedlaczek (2011-02-22). And on PHP I have a simple script: In ObjC: I change the variable $plaintext in PHP, run script...
I'm working with AI and one of my algorithms needs to work adding and removing edges. I can do it with igraph, but my problem is: It's too slow. If I work with two dictionaries, I can run my code in 0...