ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

09 暂时

2019-11-03 21:56:30  阅读:307  来源: 互联网

标签:function top 09 window curPos ele 暂时 step


前面的复习:

 

 

所以说window.setInterval()  和  window.clearInterval() 

和 window.setTimeout() 和 window.clearTimeout()  都是浏览器的对象(BOM),而不是DOM对象。

 

 

 

 

 

 

 

 

 

最后一个就是当鼠标进入的时候停止播放,当鼠标离开的时候继续播放。。。。。。 

scroll 系列:

 

 

div的滚动事件onscroll(因为滚动条是在div 中的):

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页的标题</title>
 6         <style>
 7             *{
 8                 margin:0;
 9                 padding:0;
10             }
11             div{
12                 width: 300px;
13                 height: 200px;
14                 border:1px solid red;
15                 overflow: auto;
16             }
17             input{
18                 position: absolute;
19                 left: 400px;
20                 top: 100px;
21             }
22 
23         </style>
24     </head>
25     <body>
26         <div id="dv">我我我我哦我我发就是空地金风科技发简历的空间付款撒地方姐夫撒娇的反馈及发生的借款方方法大师傅就卡了
27 发电房绝绝绝地反击打飞机浮点数据按扣发奖金安防监控大师傅发手机端放发电房绝绝绝地反击打飞机浮点数据按扣发奖金安防监控大师傅发手机端放 发电房绝绝绝地反击打飞机浮点数据按扣发奖金安防监控大师傅发手机端放 发电房绝绝绝地反击打飞机浮点数据按扣发奖金安防监控大师傅发手机端放 发电房绝绝绝地反击打飞机浮点数据按扣发奖金安防监控大师傅发手机端放发电房绝绝绝地反击打飞机浮点数据按扣发奖金安防监控大师傅发手机端放发电房绝绝绝地反击打飞机浮点数据按扣发奖金安防监控大师傅发手机端放
28         </div>
29         <input type="button" value="点我" id="btn">
30         <script src="js/common.js"></script>
31         <script>
32             document.onmousemove = function (evt) {
33                 getId$("img").style.left = evt.clientX +"px";
34                 getId$("img").style.top = evt.clientY +"px";
35 
36             };
37         </script>
38     </body>
39 </html>
View Code

整个网页的滚动事件---封装getScroll()函数: 

向上卷曲出去的距离:

 

它是兼容代码,有的浏览器认为是浏览器向上出去的距离,有的是支持整体文档向上出去的距离,而有的是认为body出去的距离了!

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页的标题</title>
 6     </head>
 7     <body>
 8         <input type="button" value="点我" id="btn">
 9         <script src="js/common.js"></script>
10         <script>
11             function getScroll() {
12                 var obj = {};
13                 //兼容代码
14                 var top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
15                             //浏览器            // html                                //body
16                 var left = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
17                 obj.top = top;
18                 obj.left = left;
19                 return obj;
20             }
21         </script>
22     </body>
23 </html>
getScroll() version01
 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页的标题</title>
 6     </head>
 7     <body>
 8         <input type="button" value="点我" id="btn">
 9         <script src="js/common.js"></script>
10         <script>
11             function getScroll() {
12                 var obj = {};
13                 //兼容代码
14                 obj.top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
15                             //浏览器            // html                                //body
16                 obj.left = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
17                 return obj;
18             }
19         </script>
20     </body>
21 </html>
getScroll() version02
 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页的标题</title>
 6     </head>
 7     <body>
 8         <input type="button" value="点我" id="btn">
 9         <script src="js/common.js"></script>
10         <script>
11             function getScroll() {
12                 var obj = {
13                     //兼容代码
14                     top : window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
15                                 //浏览器            // html                                //body
16                     left : window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
17                 };
18                 return obj;
19             }
20         </script>
21     </body>
22 </html>
getScroll() version03
 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页的标题</title>
 6     </head>
 7     <body>
 8         <input type="button" value="点我" id="btn">
 9         <script src="js/common.js"></script>
10         <script>
11             function getScroll() {
12                 return {
13                     //兼容代码
14                     top : window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
15                                 //浏览器            // html                                //body
16                     left : window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
17                 };
18             }
19         </script>
20     </body>
21 </html>
getScroll() version04
 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>这是网页的标题</title>
 6     </head>
 7     <body>
 8         <div>大数据分开就</div>
 9         <div>大数据分开就</div>
10         <div>大数据分开就</div>
11         <div>大数据分开就</div>
12         <div>大数据分开就</div>
13         <div>大数据分开就</div>
14         <div>大数据分开就</div>
15         <div>大数据分开就</div>
16         <div>大数据分开就</div>
17         <div>大数据分开就</div>
18         <div>大数据分开就</div>
19         <div>大数据分开就</div>
20         <div>大数据分开就</div>
21         <div>大数据分开就</div>
22         <div>大数据分开就</div>
23         <div>大数据分开就</div>
24         <div>大数据分开就</div>
25         <div>大数据分开就</div>
26         <div>大数据分开就</div>
27         <div>大数据分开就</div>
28         <div>大数据分开就</div>
29         <div>大数据分开就</div>
30         <div>大数据分开就</div>
31         <div>大数据分开就</div>
32         <div>大数据分开就</div>
33         <div>大数据分开就</div>
34         <div>大数据分开就</div>
35         <div>大数据分开就</div>
36         <div>大数据分开就</div>
37         <div>大数据分开就</div>
38         <div>大数据分开就</div>
39         <div>大数据分开就</div>
40         <div>大数据分开就</div>
41         <input type="button" value="点我" id="btn">
42         <script src="js/common.js"></script>
43         <script>
44             function getScroll() {
45                 return {
46                     //兼容代码
47                     top : window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
48                                 //浏览器            // html                                //body
49                     left : window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
50                 };
51             }
52             //浏览器的滚动事件
53             window.onscroll = function () {
54                 console.log(getScroll().top);
55             };
56         </script>
57     </body>
58 </html>
使用我们自己封装的getScroll() 函数

案例:固定导航栏:

 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6         <style>
 7             * {
 8             margin: 0;
 9             padding: 0
10             }
11 
12             img {
13             vertical-align: top;
14             }
15 
16             .main {
17             margin: 0 auto;
18             width: 1000px;
19             margin-top: 10px;
20 
21             }
22 
23             .fixed {
24             position: fixed;
25             top: 0;
26             left: 0;
27             }
28         </style>
29     </head>
30     <body>
31         <div class="top" id="topPart">
32             <img src="images/top.png" alt=""/>
33         </div>
34         <div class="nav" id="navBar">
35             <img src="images/nav.png" alt=""/>
36         </div>
37         <div class="main" id="mainPart">
38             <img src="images/main.png" alt=""/>
39         </div>
40         <script src="js/common.js"></script>
41         <script>
42             //滚动事件
43             function getScroll() {
44                 return {
45                     top:window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
46                     left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
47                 };
48             }
49             window.onscroll = function () {
50                 if(getScroll().top >= getId$("topPart").offsetTop){
51                     getId$("navBar").style.position = "fixed";
52                     getId$("navBar").style.top = "0px";
53                 }
54             };
55         </script>
56     </body>
57 </html>
01
 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6         <style>
 7             * {
 8                 margin: 0;
 9                 padding: 0
10             }
11             img {
12                 vertical-align: top;
13             }
14             .mainPart {
15                 margin: 0 auto;
16                 width: 1000px;
17                 margin-top: 10px;
18             }
19             .fixed {
20                 position: fixed;
21                 top: 0;
22                 left: 0;
23             }
24         </style>
25     </head>
26     <body>
27         <div class="topPart" id="topPart">
28             <img src="images/top.png" alt=""/>
29         </div>
30         <div class="navBar" id="navBar">
31             <img src="images/nav.png" alt=""/>
32         </div>
33         <div class="mainPart" id="mainPart">
34             <img src="images/main.png" alt=""/>
35         </div>
36         <script src="js/common.js"></script>
37         <script>
38             //滚动事件
39             function getScroll() {
40                 return {
41                     top:window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0,
42                     left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
43                 };
44             }
45             window.onscroll = function () {
46                 if(getScroll().top >= getId$("topPart").offsetHeight){
47                     getId$("navBar").className = "nav fixed";
48                     getId$("mainPart").style.marginTop = getId$("navBar").offsetHeight +"px";
49                 }else{
50                     getId$("navBar").className = "nav";
51                     getId$("mainPart").style.marginTop = "10px";
52                 }
53             };
54         </script>
55     </body>
56 </html>
最终版本

其中的images链接为:https://files.cnblogs.com/files/zach0812/images.zip

封装动画函数:

复习之前的动画函数 animation() 它是个匀速的函数,因为它的step =10  是个常量,

 1 function animation(ele,targetPos) {
 2                 //清理定时器
 3                 window.clearInterval(ele.timeId);
 4                 ele.timeId = setInterval(function () {
 5                     //获取当前的位置
 6                     var curPos = ele.offsetLeft;
 7                     //每次移动的步数
 8                     var step = 10;
 9                     step = targetPos > curPos ? step :-step;
10 
11                     //判断  本次移动后的curPos 和 目标tarPos 的差距
12                     if(Math.abs(targetPos - curPos ) > Math.abs(step)){
13                         curPos += step;
14                         ele.style.left = curPos +'px';
15                     }else{
16                         window.clearInterval(ele.timeId);
17                         ele.style.left = targetPos +'px';
18                     }
19                 },10);
20             }
View Code

下面我们看的是变速运动。。。变速动画.

 

实现缓动效果:

 

 

即step  = (targetPos - curPos)/10; 

 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6         <style>
 7             * {
 8                 margin: 0;
 9                 padding: 0
10             }
11             div{
12                 width: 200px;
13                 height: 100px;
14                 background-color: green;
15                 position: absolute;
16                 left: 0;
17                 top: 0;
18                 margin-top: 20px;
19             }
20         </style>
21     </head>
22     <body>
23         <input type="button" value="移动到400px" id="btn1">
24         <input type="button" value="移动到800px" id="btn2">
25         <div id="dv"></div>
26         <script src="js/common.js"></script>
27         <script>
28             function animation(ele,targetPos) {
29                 //清理定时器
30                 window.clearInterval(ele.timeId);
31                 ele.timeId = setInterval(function () {
32                     //获取当前的位置
33                     var curPos = ele.offsetLeft;
34                     //每次移动的步数
35                     var step = (targetPos - curPos) / 10;
36                     // step = targetPos > curPos ? step :-step;  不需要这个了
37 
38                     //判断  本次移动后的curPos 和 目标tarPos 的差距
39                     if(Math.abs(targetPos - curPos ) > Math.abs(step)){
40                         curPos += step;
41                         ele.style.left = curPos +'px';
42                     }else{
43                         window.clearInterval(ele.timeId);
44                         ele.style.left = targetPos +'px';
45                     }
46                 },10);
47             }
48             getId$("btn1").onclick = function(){
49                 animation(getId$("dv"),400);
50             };
51              getId$("btn2").onclick = function(){
52                 animation(getId$("dv"),800);
53             };
54         </script>
55     </body>
56 </html>
缓动效果

但是这里是有bug 的,因为step 避免不了会出现小数,结果未知不太精准,所以我们要尽可能的使得step 为整数。

而且,当step 为正数的时候要向上取整  Math.ceil() 。为负数的时候向下取整 Math.floor() .....  每次走可以多走,不可少走。

之所以不可少走是因为当到最后的阶段的时候,step 将会变得很小。如果向下取整就直接为0了,所以 此时的二者直接的距离是一直大于 step 的。这导致程序不能到直接设定为目标位置的分支。  

 

 

 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6         <style>
 7             * {
 8                 margin: 0;
 9                 padding: 0
10             }
11             div{
12                 width: 200px;
13                 height: 100px;
14                 background-color: green;
15                 position: absolute;
16                 left: 0;
17                 top: 0;
18                 margin-top: 20px;
19             }
20         </style>
21     </head>
22     <body>
23         <input type="button" value="移动到400px" id="btn1">
24         <input type="button" value="移动到800px" id="btn2">
25         <div id="dv"></div>
26         <script src="js/common.js"></script>
27         <script>
28             function animation(ele,targetPos) {
29                 //清理定时器
30                 window.clearInterval(ele.timeId);
31                 ele.timeId = setInterval(function () {
32                     //获取当前的位置
33                     var curPos = ele.offsetLeft;
34                     //每次移动的步数
35                     var step = (targetPos - curPos) / 10;
36                     // step = targetPos > curPos ?Math.ceil(step): Math.floor(step); //正数向上取整 负数向下取整
37                     step = Math.ceil(step);
38 
39                     //判断  本次移动后的curPos 和 目标tarPos 的差距
40                     if(Math.abs(targetPos - curPos ) > Math.abs(step)){
41                         curPos += step;
42                         ele.style.left = curPos +'px';
43                         console.log("我停在这个分支了");
44                     }else{
45                         window.clearInterval(ele.timeId);
46                         ele.style.left = targetPos +'px';
47                     }
48                 },1);
49             }
50             getId$("btn1").onclick = function(){
51                 animation(getId$("dv"),400);
52             };
53              getId$("btn2").onclick = function(){
54                 animation(getId$("dv"),800);
55             };
56         </script>
57     </body>
58 </html>
此时如果从800 移回400就会发生上述情况。

 

总结: step 只能向上取整,不能向下取整,这是很严重的问题会导致定时器不能被清理!

 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6         <style>
 7             * {
 8                 margin: 0;
 9                 padding: 0
10             }
11             div{
12                 width: 200px;
13                 height: 100px;
14                 background-color: green;
15                 position: absolute;
16                 left: 0;
17                 top: 0;
18                 margin-top: 20px;
19             }
20         </style>
21     </head>
22     <body>
23         <input type="button" value="移动到400px" id="btn1">
24         <input type="button" value="移动到800px" id="btn2">
25         <div id="dv"></div>
26         <script src="js/common.js"></script>
27         <script>
28             function animation(ele,targetPos) {
29                 //清理定时器
30                 window.clearInterval(ele.timeId);
31                 ele.timeId = setInterval(function () {
32                     //获取当前的位置
33                     var curPos = ele.offsetLeft;
34                     //每次移动的步数
35                     var step = (targetPos - curPos) / 10;
36                     step = targetPos > curPos ?Math.ceil(step): Math.floor(step); //正数向上取整 负数向下取整
37 
38                     //判断  本次移动后的curPos 和 目标tarPos 的差距
39                     if(Math.abs(targetPos - curPos ) > Math.abs(step)){
40                         curPos += step;
41                         ele.style.left = curPos +'px';
42                     }else{
43                         window.clearInterval(ele.timeId);
44                         ele.style.left = targetPos +'px';
45                     }
46                 },1);
47             }
48             getId$("btn1").onclick = function(){
49                 animation(getId$("dv"),400);
50             };
51              getId$("btn2").onclick = function(){
52                 animation(getId$("dv"),800);
53             };
54         </script>
55     </body>
56 </html>
最终版本

还有到最后的几步都是以 1 向上增加的。所以不用担心超过目标值 ,可以直接用 == 判断
 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6         <style>
 7             * {
 8                 margin: 0;
 9                 padding: 0
10             }
11             div{
12                 width: 200px;
13                 height: 100px;
14                 background-color: green;
15                 position: absolute;
16                 left: 0;
17                 top: 0;
18                 margin-top: 20px;
19             }
20         </style>
21     </head>
22     <body>
23         <input type="button" value="移动到400px" id="btn1">
24         <input type="button" value="移动到800px" id="btn2">
25         <div id="dv"></div>
26         <script src="js/common.js"></script>
27         <script>
28             function animation(ele,targetPos) {
29                 //清理定时器
30                 window.clearInterval(ele.timeId);
31                 ele.timeId = setInterval(function () {
32                     //获取当前的位置
33                     var curPos = ele.offsetLeft;
34                     //每次移动的步数
35                     var step = (targetPos - curPos) / 10;
36                     step = targetPos > curPos ?Math.ceil(step): Math.floor(step); //正数向上取整 负数向下取整
37 
38                     if(curPos == targetPos){ //到最后的几步都是以 1 向上增加的。所以不用担心超过目标值 ,可以直接用== 判断。
39                         window.clearInterval(ele.timeId);
40                     }else{
41                         curPos += step;
42                         ele.style.left = curPos +"px";
43                     }
44                 },1);
45             }
46             getId$("btn1").onclick = function(){
47                 animation(getId$("dv"),400);
48             };
49              getId$("btn2").onclick = function(){
50                 animation(getId$("dv"),800);
51             };
52         </script>
53     </body>
54 </html>
最最终版本
 1 <!DOCTYPE html>
 2 <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title>这是网页标题</title>
 6         <style>
 7             * {
 8                 margin: 0;
 9                 padding: 0
10             }
11             div{
12                 width: 200px;
13                 height: 100px;
14                 background-color: green;
15                 position: absolute;
16                 left: 0;
17                 top: 0;
18                 margin-top: 20px;
19             }
20         </style>
21     </head>
22     <body>
23         <input type="button" value="移动到400px" id="btn1">
24         <input type="button" value="移动到800px" id="btn2">
25         <div id="dv"></div>
26         <script src="js/common.js"></script>
27         <script>
28             function animation(ele,targetPos) {
29                 //清理定时器
30                 window.clearInterval(ele.timeId);
31                 ele.timeId = setInterval(function () {
32                     //获取当前的位置
33                     var curPos = ele.offsetLeft;
34                     //每次移动的步数
35                     var step = (targetPos - curPos) / 10;
36                     step = targetPos > curPos ?Math.ceil(step): Math.floor(step); //正数向上取整 负数向下取整
37 
38                     curPos += step;
39                     ele.style.left = curPos +"px";
40 
41                     if(curPos == targetPos){ //到最后的几步都是以 1 向上增加的。所以不用担心超过目标值 ,可以直接用== 判断。
42                         window.clearInterval(ele.timeId);
43                     }
44                     //测试代码:
45                     console.log("目标位置:"+targetPos+" 当前位置:"+curPos+" 每次移动的步数: "+step+"");
46 
47 
48                 },1);
49             }
50             getId$("btn1").onclick = function(){
51                 animation(getId$("dv"),400);
52             };
53              getId$("btn2").onclick = function(){
54                 animation(getId$("dv"),800);
55             };
56         </script>
57     </body>
58 </html>
最最最终版本 (带有测试代码)
测试代码:
console.log("目标位置:"+targetPos+" 当前位置:"+curPos+" 每次移动的步数: "+step+"");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

最后一个系列:

之前说过有 三个系列:

前面已经说过两个系列:  offset系列 ,scroll系列,下面是第三个系列!

 

 

 

 

 

 

 

标签:function,top,09,window,curPos,ele,暂时,step
来源: https://www.cnblogs.com/zach0812/p/11783827.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有