zoukankan      html  css  js  c++  java
  • js轮播

    封装一个animation函数

    实现的动画效果是:最开始运动速度快,然后逐渐减小,并且到最后,速度为零,且正好到达目的地即目标所在的位置,在此过程中改变透明度,以及宽高,left、top这些值还要实现同时改变多个元素。

    //封装一个getStyle()的函数,通过这个函数可以处理兼容性,来取得当前元素正在应用的样式,
    function getStyle(el,property) {
        if(getComputedStyle){
            return getComputedStyle(el)[property];//ie8之后获取方式
        }else{
            return el.currentStyle[property]; //ie8以前
        }
    }
    //参数:所改变的元素,改变的属性,目标(属性和目标合为properties)
    function animate(el,properties) {
        clearInterval(el.timerId);
        el.timerId=setInterval(function () {
            for(var property in properties){
                var current;
                var target=properties[property];
                if(property==='opacity'){
                    current=parseFloat(getStyle(el,'opacity'))*100;
                }else{
                    current=parseInt(getStyle(el,property));
                }
                //当target和current相等时,速度就变为0,为了每次都缓慢变化,所以要乘以一个系数
                var speed=(target-current)/30;
                speed=speed>0?Math.ceil(speed):Math.floor(speed);
                if(property==='opacity'){
                    el.style.opacity=(current+speed)/100;
                }
                el.style[property]=current+speed+"px";
            }
        },20)
    }

    水平轮播

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            ul{
                list-style: none;
            }
            .slider{
                width: 700px;
                height: 504px;
                border: 5px solid rebeccapurple;
                position: relative;
                overflow: hidden;
            }
            .slider .list{
                position: absolute;
    
            }
            .slider .list .item{
                width: 700px;
                height: 504px;
                float: left;
    
            }
            .slider .list .item img{
                width: 700px;
                height: 504px;
                display: block;
            }
            .slider .prev,.slider .next{
                position: absolute;
                top: 245px;
            }
            .slider .next{
                right: 0;
            }
            .slider .pagination {
                position: relative;
                top: 350px;
            }
            .slider .pagination .bullet{
                width: 20px;
                height: 20px;
                background:black;
                border: 2px solid yellow;
                float: left;
                margin-left: 5px;
                color: white;
                text-align: center;
                line-height: 20px;
                cursor: pointer;
            }
            .slider .pagination .bullet.focus{
                background-color: yellow;
            }
        </style>
    </head>
    <body>
    <div class="slider">
        <ul class="list">
            <li class="item"><img src="./images/1.jpeg" alt=""></li>
            <li class="item"><img src="./images/2.jpeg" alt=""></li>
            <li class="item"><img src="./images/3.jpeg" alt=""></li>
            <li class="item"><img src="./images/4.jpeg" alt=""></li>
        </ul>
        <button class="prev"><</button>
        <button class="next">></button>
        <ul class="pagination">
            <li class="bullet focus">1</li>
            <li class="bullet">2</li>
            <li class="bullet">3</li>
            <li class="bullet">4</li>
        </ul>
    </div>
    <script src="animation.js"></script>
    <script>
        (function () {
            var currentIndex;//当前显示的索引
            var lis;//所有的li
            var liWidth;//li的宽度
            var len;//li的个数
            var id;
            //是图片顺序排列为3 0 1 2 3 0  两边的两张是假定的,中间的四张是真正显示的长度
            init();
            function init() {
                currentIndex=1;
                var li_1=document.querySelector('.slider .list .item:first-of-type');
                var copy_1=li_1.cloneNode(true);
                var li_last=document.querySelector('.slider .list .item:last-of-type');
                var copy_last=li_last.cloneNode(true);
                var list=document.querySelector('.slider .list');
                list.appendChild(copy_1);
                list.insertBefore(copy_last,li_1);
    
                //根据list的长度,设定ul的宽度
                lis=document.querySelectorAll('.slider .list .item');//取到所有的li
                liWidth=lis[0].offsetWidth;
                len=lis.length;//6
                list.style.width=liWidth*len+"px";//ul的宽度
                document.querySelector('.prev').onclick=function () {
                    sliderPrev();
                };
                document.querySelector('.next').onclick=function () {
                  sliderNext();
                };
                list.style.left=-liWidth+"px";
                var bullets=document.querySelectorAll('.slider .pagination .bullet');
                for(var i=0;i<bullets.length;i++){
                    bullets[i].index=i;
                    bullets[i].onclick=function () {
                        index=this.index+1;
                        sliderTo(index);
                    }
                }
                auto();
                var slider=document.querySelector('.slider');
                //鼠标移入,停止自动轮播
                slider.onmouseover=function () {
                    stop();
                };
                //鼠标移出,开始自动轮播
                slider.onmouseout=function () {
                    auto();
                };
            }
            //显示下一张函数
            function sliderPrev() {
                currentIndex--;
                sliderTo(currentIndex);
            }
            //显示前一张函数
            function sliderNext() {
                currentIndex++;
                sliderTo(currentIndex);
            }
            //图片切换
            function sliderTo(index) {
                var list=document.querySelector('.slider .list');
                if(index===len){
                    currentIndex=index=2;
                    list.style.left=-liWidth+"px";
                }
                if(index===-1){
                    currentIndex=index=3;
                    list.style.left=-(4*liWidth)+"px";
                }
                var left=-index*liWidth;
                animate(list,{
                    left:left
                });
                var focusIndex;
                var bullets=document.querySelectorAll('.pagination .bullet');
                for(var i=0;i<bullets.length;i++){
                    if(index===0){
                        focusIndex=bullets.length-1;
                    }else if(index===5){
                        focusIndex=0;
                    }else{
                        focusIndex=index-1;
                    }
                }
                document.querySelector('.focus').className='bullet';
                bullets[focusIndex].className='bullet focus';
    
    
            }
            //自动轮播
            function auto() {
                clearInterval(id);
                id=setInterval(function () {
                    sliderNext();
                },2000)
    
            }
            //停止自动轮播
            function stop() {
                clearInterval(id);
            }
        })()
    </script>
    
    </body>
    </html>

    透明度轮播

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            ul{
                list-style: none;
            }
            .slider{
                width: 700px;
                height: 504px;
                border: 5px solid rebeccapurple;
                position: relative;
            }
            .slider .list .item{
                position: absolute;
                left: 0;
                top: 0;
                opacity: 0;
            }
            .slider .list .item:nth-of-type(1){
                opacity: 1;
            }
            .slider .list .item img{
                width: 700px;
                height: 504px;
                display: block;
            }
            .slider .prev,.slider .next{
                position: absolute;
                top: 245px;
            }
            .slider .next{
                right: 0;
            }
            .slider .pagination{
                position: relative;
                top: 350px;
            }
            .slider .pagination .bullet{
                width: 20px;
                height: 20px;
                background:black;
                border: 2px solid yellow;
                float: left;
                margin-left: 5px;
                color: white;
                text-align: center;
                line-height: 20px;
                cursor: pointer;
            }
            .slider .pagination .bullet.focus{
                background-color: yellow;
            }
    
        </style>
    </head>
    <body>
    <div class="slider">
        <ul class="list">
            <li class="item"><img src="./images/1.jpeg" alt=""></li>
            <li class="item"><img src="./images/2.jpeg" alt=""></li>
            <li class="item"><img src="./images/3.jpeg" alt=""></li>
            <li class="item"><img src="./images/4.jpeg" alt=""></li>
        </ul>
        <button class="prev"><</button>
        <button class="next">></button>
        <ul class="pagination">
            <li class="bullet focus">1</li>
            <li class="bullet">2</li>
            <li class="bullet">3</li>
            <li class="bullet">4</li>
        </ul>
    </div>
    <script src="animation.js"></script>
    <script>
       /* 立即执行函数:声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行;
        (function(){})()
        可以避免污染全局作用域*/
        (function () {
            //切换时前一张的索引,和后一张的索引
          var prevIndex,nextIndex;
          var len;
          var id;
          init();
    
          function init() {
              prevIndex=nextIndex=0;
              len=document.querySelectorAll('.list .item').length;
              document.querySelector('.prev').onclick=function(){
                sliderPrev()
              };
              document.querySelector('.next').onclick=function () {
                  sliderNext()
              };
              var bullets=document.querySelectorAll('.slider .pagination .bullet');
              for(var i=0;i<bullets.length;i++){
                 bullets[i].index=i;
                 bullets[i].onclick=function () {
                     prevIndex=nextIndex;
                     nextIndex=this.index;
                     sliderTo(prevIndex,nextIndex);
                 }
              }
             auto();
              var slider=document.querySelector('.slider');
              //鼠标移入,停止自动轮播
              slider.onmouseover=function () {
                  stop();
              };
              //鼠标移出,开始自动轮播
              slider.onmouseout=function () {
                auto();
              };
          }
    
          //处理点击prev button时的动作,计算prevIndex
          function sliderPrev(){
              prevIndex=nextIndex;
              nextIndex--;
              if(nextIndex===-1){
                    nextIndex=len-1;
              }
              sliderTo(prevIndex,nextIndex);
    
          }
    
          //处理点击next button时的动作,计算nextIndex
          function sliderNext() {
              prevIndex=nextIndex;
              nextIndex++;
              if(nextIndex===len){
                  nextIndex=0;
              }
              sliderTo(prevIndex,nextIndex);
          }
    
          //参数为:前一张图片的索引,和后一张图片的索引
          function sliderTo(prev,next) {
              var lis=document.querySelectorAll('.list .item');
              var bullets=document.querySelectorAll('.slider .pagination .bullet');
    
              bullets[prev].className='bullet';
              bullets[next].className='bullet focus';
    
              animate(lis[prev],{opacity:0});
              animate(lis[next],{opacity:100})
          }
    
          //自动轮播函数
          function auto() {
              clearInterval(id);
              id=setInterval(function () {
                  sliderNext();
              },2000)
          }
    
          //停止自动轮播
          function stop() {
                clearInterval(id);
          }
        })()
    </script>
    </body>
    </html>
  • 相关阅读:
    tidb3.2参数优化配置整个过程
    tidb优化配置
    mysql使用docker安装
    mysql密码规则配置-配置为简单密码123456
    goaccess日志分析器使用
    c# printDialog不显示问题
    short数组写进txt
    txt文件存储问题
    c# 调用c++dll二次总结
    程序员代码开发的自测素养
  • 原文地址:https://www.cnblogs.com/wahaha-/p/14123469.html
Copyright © 2011-2022 走看看