美文网首页
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