美文网首页
JavaScript 【02】jQuery做轮播

JavaScript 【02】jQuery做轮播

作者: Qingelin | 来源:发表于2019-08-22 22:51 被阅读0次

    1. 内容 (html) 样式(css) 行为(JavaScript) 分离

    • 内容、样式、行为分离的个人总结:(反向思考)
      (1). 如果不把这三者分离,比如html负责内容和样式会使得html结构有很多无用的标签,变得很复杂,看不清标签的逻辑结构;
      (2).如果用css表示内容会导致用户选不中、js访问不到;
      (3).(以前IE6)css负责行为的话,会让页面变慢;
      (4). js尽量不要控制样式,比进制jQuery里面两个函数 jQuerydiv.show() / $div.hide(),如果
      jQuerydiv.show()之后不知道它的display是什么(block/flex/inline-flex等),jQueryaddClass() 或jQueryremoveClass()来代替;

    2. 轮播的思路

    1. 思路一:滚来滚去

    轮播图就是在页面中指定范围内把几张图片滚来滚去,设置一些细节(比如过度时间等)。

    2. 思路二:用局部画面骗用户

    实现几张图片切换的效果是只把一张图片放到可视范围内,页面内部实现图片位置切换到可视范围就能实现轮播。
    下面的代码块就是理解轮播思路最好的例子:(是新手实现的代码块,没有做到内容、样式、行为分离)

    <!DOCTYPE html>
    <html>
    <head>
    <script src="//code.jquery.com/jquery-2.1.1.min.js"></script>
      <meta charset="utf-8">
      <title>理解轮播思路实例</title>
    
    
    <style>
    *{
      margin:0;
      padding:0;
    }
    .window{
      width: 259px;
      border:4px solid green;
      overflow: hidden;
    }
    .images{
      display: flex;
      align-items: flex-start;
      border: 1px solid red;
      transition: transform 0.5s;
    }
    .red{
        color:red;
    }
    </style>
    
    
    </head>
    <body>
     
    
     <div class="window">
    <div class="images" id="images">
       <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRprIjdHtQjJ7szfv8KY28bK4c5iBE-VcyLBKcGFBLJ3ATtM5Ue1w " alt="">
       <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSU0FjBCflAtiPwMlLcYGq-hfTZ_Fgq59TBAzQ7XIqgKHmona_XwQ" alt="">
       <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTgIEazZi69dK62PhhZ57wOMqT1Mj3L5exJqwW39_T66lHHNie2dw" alt="">
    </div>
    </div>
    <span>
      <span>第1张</span>
      <span>第2张</span>
      <span>第3张</span>
    </span>
    
    <script>
        $(p1).on('click', function(){
         $(images).css({
           transform:"transLateX(0)"
         })
     })
    $(p2).on('click', function(){
         $(images).css({   //.css是jQuery语法,添加样式
           transform:"transLateX(-259px)"
         })
     })
    $(p3).on('click', function(){   //on API : on('事件函数名',function(存储所有信息的参数){})是jQuery推荐的语法
         $(images).css({
           transform:"transLateX(-518px)"
         })
     })
    </script>
    
    </body>
    </html>
    

    js代码改进一:可以存放无限多个图片按钮,都能完成轮播

    <script>
            var allButtons = $('#buttons > span')
    for(let i=0;i<allButtons.length;i++){
      $(allButtons[i]).on('click', function(x){
             
        /*   需要知道被点击的几个span元素的DOM方法 
        var n 
            var childern = span.parentNode.childern
            for(let i=0;i<childern.length;i++){
              if(childern[i] === span){
                span = i
                break
              }
            }
        */
        
        //jQuery实现
        var index = $(x.currentTarget).index()
        
        //遍历样式
        var n = index * -259
        $(images).css({
          transform:'translate('+ n +'px)'
        })
       })
    }
    
    </script>
    
    

    js代码改进二:实现自动播放

         var n = 0
        var size = allButtons.length
        console.log(n%size)  //3 4 5对应的余数是 0 1 2
        // 获取一个元素的第n个儿子的DOm API
        // parent.children[n]
        // 获取一个元素的第n个儿子的jQuery API
        //eq就是equal的意思,他会找出DOM对应的节点,并封装成jQuery对象
        //triggerAPI会触发事件函数,后面接函数名
        allButtons.eq(n%size).trigger('click')
        .addClass('red')
        .siblings('.red').removeClass('red')
        setInterval( ()=>{
          n += 1
          allButtons.eq(n%size).trigger('click')
          .addClass('red')
          .siblings('.red').removeClass('red')
        },1000)
    

    js代码改进三:用户hover到window后会停止轮播,高亮按钮

          var allButtons = $('#buttons > span')
    for(let i=0;i<allButtons.length;i++){
      $(allButtons[i]).on('click', function(x){
             
        /*   需要知道被点击的几个span元素的DOM方法 
        var n 
            var childern = span.parentNode.childern
            for(let i=0;i<childern.length;i++){
              if(childern[i] === span){
                span = i
                break
              }
            }
        */
        
        //jQuery实现
        var index = $(x.currentTarget).index()
        
        //遍历样式
        var n = index * -259
        $(images).css({
          transform:'translate('+ n +'px)'
        })
        n = index
        allButtons.eq(n)
        .addClass('red')
        .siblings('.red').removeClass('red')
        })
    }
    
    
    
    //实现自动播放
    var n = 0
    var size = allButtons.length
    // 获取一个元素的第n个儿子的DOm API
    // parent.children[n]
    // 获取一个元素的第n个儿子的jQuery API
    //eq就是equal的意思,他会找出DOM对应的节点,并封装成jQuery对象
    //triggerAPI会触发事件函数,后面接函数名
    allButtons.eq(n%size).trigger('click')
    .addClass('red')
    .siblings('.red').removeClass('red')
    
    var timerId = setInterval( ()=>{
      n += 1
      allButtons.eq(n%size).trigger('click')
      .addClass('red')
      .siblings('.red').removeClass('red')
    },1000)
    
    
    $('.window').on('mouseenter', function(){
      window.clearInterval(timerId)
    })
    
    
    $('.window').on('mouseleave', function(){
      timerId = setInterval( ()=>{
      n += 1
      allButtons.eq(n%size).trigger('click')
      .addClass('red')
      .siblings('.red').removeClass('red')
    },1000)
    })
    

    3. 封装思路

    1. API角度思考

    2. 尽量简介

    相关文章

      网友评论

          本文标题:JavaScript 【02】jQuery做轮播

          本文链接:https://www.haomeiwen.com/subject/jgugsctx.html