• 有关于requsetAnimationFrame 以及做一个简单的轮播


    RequestAnimationFrame()

    这个方法是关于动画的,详细原因可以阅读相关资料(javascript高级程序设计25章-新兴的API)。

    RequestAnimationFrame() 接受一个参数,即在重回屏幕前调用的一个函数(就是动画所执行的函数),这个函数负责改变下一次重新绘制的DOM样式。

    循环的方式与setTimeout() 方法一样,全局启动,函数内部调用自身,形成循环。

    传入该方法的函数接受一个参数,他是一个时间码,(从1970年一月一日至今的毫秒数--不小啊)表示下一次重新绘制的实际发生时间。

    说真的,我不太清楚这个时间有什么用。

    然后来贴一个例子:MDN

    window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
    
    var start = null;
    var d = document.getElementById('SomeElementYouWantToAnimate');
    function step(timestamp) { 
      if (start === null) start = timestamp;
      var progress = timestamp - start;
      d.style.left = Math.min(progress/10, 200) + "px";
      if (progress < 2000) {
        requestAnimationFrame(step);
      }
    }
    requestAnimationFrame(step);

    然后我想做一个轮播的效果,以前做过一次,结果屎一样的效果,至今未不想改囧。决定重新做一个,并且带小点点可以操控,我就不插入图片了。

    贴出我的bug,额是代码:

    //强行用这个方法=_=
    //上下轮播,原理是移动img的父元素,将更外层的父元素设置为域外隐藏 overflow:hidden;
        var qt=document.querySelector('#qt');
        window.requestAnimationFrame=window.requestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame;
        var start= null;
        var tt= 0,
                nei,
                wai;
    //draw中遇到的问题就是 element.style.top 是一个带单位的字符串,而不是一个数!这一点一定要注意!
        function draw(){
            console.log(parseInt(tt));
            if(parseInt(tt)==-1500){
                qt.style.top=0+'px';
            }else{
              qt.style.top=(parseInt(tt)-300)+'px';
            }
            tt=qt.style.top;
             nei=setTimeout(yc,2000);
        }
        function yc(){
        requestAnimationFrame(draw);
        }
        wai=setTimeout(yc,2000);
    //下面是小点点操控,当鼠标移入小点点父元素内时正常轮播,点击对应的小点点停止轮播,显示对应的图片,并且捕捉容器的top值,如果不捕捉就会继续上一次轮播的top继续而不是接着你点击的图片继续
        window.onload=function(){
            var zong=document.querySelector('#zong');
            zong.onclick=function(event){
                console.log(event.target.id);
                switch (event.target.id) {
                    case 'id1':
                        clearTimeout(nei);
                        clearTimeout(wai);
                        qt.style.top = 0 + 'px';
                        tt = qt.style.top;
                        break;
                    case 'id2':
                        clearTimeout(nei);
                        clearTimeout(wai);
                        qt.style.top = -300 + 'px';
                        tt = qt.style.top;
                        break;
                    case 'id3':
                        clearTimeout(nei);
                        clearTimeout(wai);
                        qt.style.top = -600 + 'px';
                        tt = qt.style.top;
                        break;
                    case 'id4':
                        clearTimeout(nei);
                        clearTimeout(wai);
                        qt.style.top = -900 + 'px';
                        tt = qt.style.top;
                        break;
                    case 'id5':
                        clearTimeout(nei);
                        clearTimeout(wai);
                        qt.style.top = -1200 + 'px';
                        tt = qt.style.top;
                        break;
                    case 'id6':
                        clearTimeout(nei);
                        clearTimeout(wai);
                        qt.style.top = -1500 + 'px';
                        tt = qt.style.top;
                        break;
                }
            };
    //最后移除点点区域开始正常轮播,重新启动(其实也可以鼠标移除小点点就开始轮播,一般网站上都是这样,不难实现)
            zong.onmouseleave=function(){
                clearTimeout(nei);
                clearTimeout(wai);
                tt=qt.style.top || 0;
                setTimeout(yc,2000);
            }
        }

    其实做完了还是比较高兴,虽然很简单。

    三秒钟以后感觉不对。

    零点五秒后发现,不用RequestAnimationFrame()方法也能做啊!我只不过验证了这个方法里的代码能跑!

    *!

    收获就是setTimeout()里面的RequestAnimationFrame()方法会立即执行不会排队。

  • 相关阅读:
    python之Socket网络编程
    python_异常处理
    python_面向对象编程
    Vue-cli3与springboot项目整合打包
    命令打开java控制面板
    后端记录用户登录失败次数
    跨域问题解决办法
    vue-i18n多语言文件归类的两种方法
    svn全局设置过滤文件没有作用的解决办法
    vue数据变化后页面刷新
  • 原文地址:https://www.cnblogs.com/bengbengbengbengbeng/p/7569626.html
Copyright © 2020-2023  润新知