轮播图-渐隐渐现版

轮播图-渐隐渐现版

导语

插件封装:

量级有点太大了,很多功能是用不上的。

节省代码量,自己拿js封装轮播

能够用css不用js

多参数如何处理

扩展性且功能强大

实现思路&结构样式

dfa1f20ed0a7fd59fd7d6dfbca8b8f66.png

css方敏:

position:absolute之后宽度是内容撑开的,而不是100%的

定位之后不设置默认是z-index为0

让盒子水平排列的几种方法,各自优缺点

float, display:inline-block, display:flex

回调函数

定义:把一个函数作为实参传给另外一个方法,再另外一个方法执行到某个阶段的时候,把传进来的这个函数执行。

平常用到的场景:

arr.forEach(() => { ...... })

把一个函数作为值传给forEach。每循环数组中的一项,就把这个函数执行

replace:捕获到一项,就把传过去的回调执行一次

回调的应用:

在某个函数执行到了某个阶段,需要去做其他事情。其他事情作为回调函数

5a35eaca06974ebabe67680e6d6ce4db.png

数据绑定和自动轮播

transitionend特点:

当transition动画结束后,触发事件

有几个样式属性改变,就会触发几次

真实项目中实现动画:

一般使用css3动画,控制transition样式,设置transitionend事件监听

swiper动画基于transition来实现

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="../js/jquery-1.11.3.min.js"></script>
    <style>
        *{
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }
        .container{
            width: 1226px;
            height: 460px;
            margin: 0 auto;
            overflow: hidden;
            position: relative;
        }
        .wrapper{
            position: relative;
            height: 100%;
        }
        .wrapper .slider{
            width: 100%;
            height: 100%;
            position: absolute;
            left: 0;
            top: 0;
            z-index: 0;
            opacity: 0;
            transition: all 0.8s ease 0s;
        }
        .wrapper .slider:nth-child(1){
            z-index: 1;
            opacity: 1;
        }
        .slider img{
            width: 100%;
            height: 100%;
        }
        .pagination {
            position: absolute;
            bottom: 20px;
            height: 20px;
            padding: 5px;
            right: 30px;
            z-index: 999;
            font-size: 0;
        }
        .pagination span{
            box-sizing: content-box;
            cursor: pointer;
            display: inline-block;
            width: 6px;
            height: 6px;
            background: rgba(0,0,0,.4);
            border: 2px solid #fff;
            border-color: rgba(255,255,255,.3);
            border-radius: 50%;
            z-index: 999;
            float: left;
            margin: 0 4px;
        }
        .pagination span.active{
            background: rgba(255,255,255,.3);
            border-color: rgba(0,0,0,.4);
        }
        .button-pre,.button-next{
            width: 41px;
            height: 69px;
            position: absolute;
            top: 50%;
            cursor: pointer;
            transform: translateY(-50%);
            z-index: 999;
            background-image: url("../img/icon-slides.png");
        }
        .button-pre{
            left: 0;
            background-position: -84px 0;
        }
        .button-pre:hover{
            background-position: 0 0;
        }
        .button-next{
            right: 0;
            background-position: -125px 0;
        }
        .button-next:hover{
            background-position: -43px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="wrapper">
<!--            <div class="slider"><img src="../img/banner-mi-0.jpg" alt=""></div>-->
<!--            <div class="slider"><img src="../img/banner-mi-1.jpg" alt=""></div>-->
<!--            <div class="slider"><img src="../img/banner-mi-2.jpg" alt=""></div>-->
<!--            <div class="slider"><img src="../img/banner-mi-3.jpg" alt=""></div>-->
        </div>
        <!--宽度和高度让里面的li撑开,定位之后为内容的宽高-->
        <ul class="pagination">
<!--            <span class="active"></span>-->
<!--            <span></span>-->
<!--            <span></span>-->
<!--            <span></span>-->
        </ul>
        <div class="button-pre">
        </div>
        <div class="button-next">
        </div>

    </div>
    <script>
        let timer=null,carouselItems=[];
        let $container=$('.container'),$wrapper=$container.find('.wrapper'),$pagination=$container.find('.pagination'),$slideList=null,$paginationList=null;
        let step=0,interval=3000;
        let carousel=(function () {


            let fetch=function(callback){
               $.ajax({
                   url:'../json/banner.json',
                   method:'get',
                   success:function (res) {
                       callback && callback(res);
                   }
               })
            }
            let paint=function (data) {
                console.log(data);
                carouselItems=data;
                let wrapper='',pagination='';
                data.forEach((item)=>{
                    wrapper+=`<div class="slider"><img src="${item.url}" alt=""></div>`;
                    pagination+='<span></span>';
                })
                $wrapper.html(wrapper);
                $pagination.html(pagination);
                $pagination.children('span:first-child').addClass('active');
                // 赋值
                $slideList=$wrapper.children('.slider');
                $paginationList=$pagination.children('span');
            }
            let autoPlay=function () {
                step++;
                if(step>=carouselItems.length){
                    step=0;
                }
                $slideList.each((index,item)=>{
                    $(item).css({
                        zIndex:0,
                        opacity:0,
                    })
                    if(step===index){
                        $(item).css({
                            zIndex:1,
                            opacity:1,
                        })
                    }
                })
                $paginationList.each((index,item)=>{
                    $(item).removeClass('active')
                    if(step===index){
                        $(item).addClass('active')
                    }
                })

            }


            return {
                init:function () {
                   fetch(function (data) {
                       paint(data);
                       timer=window.setInterval(autoPlay,interval);
                   });
               }
            }
        })()
        carousel.init();
    </script>
</body>
</html>

最终完成版*

降低频率:

防抖你只要一直频繁操作,只有第一次触发一次,其他都不触发,只执行一次。只有停下来再来。

节流:频繁次操作的情况下,间隔多长时间就来一次。把触发的频率降低了

与左右运动版的区别:

本质就是切换不一样。

渐隐渐现控制z-index和opacity

wrapper的left。把第一个克隆一份到末尾,slider数量比焦点数量多一个。

基于jQuery封装插件*

封装插件思想

b4d4aedceea4c7fd43ca55c8ced9b180.png

只要把最外层容器重新指定下

插件封装:把公共地方进行提取,以后实现轮播图只要一调这个插件,只要指定容器

基于jQuery

extend: 像jQuery扩展方法

  • 获取数据

  • 数据绑定

  • 自动轮播

  • 焦点对齐

  • 焦点触发

  • 左右按钮触发

容器的结构和样式都准备好的前提下,去调轮播插件;具体的数据和数据绑定不应该出现在插件里。

插件的功能很单纯:自动切换,焦点切换,左右按钮切换……

默认数据已经绑定完了,建立在数据已经出来的基础上

是建立在结构、样式、数据都已经有的基础上的,调这个插件

  1. 把我们之前写的方法统一放到一个方法里面,然后把这个方法extend到jQuery的原型链上

  2. 之后你想让哪个容器轮播,那么你就先获得这个容器,然后调这个方法

把之前单例东西搬进来

保证插件功能的唯一性,强大:适配不同场景的轮播效果

只完成一件主体功能思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值