波点轮播图

废话不多说,上效果

主体结构,使用svg标签来构建主体,分别把左右按钮设置好,在使用svg设置时,构建两个svg画布,每个画布花九个圆,每个圆的圆心不变,圆的半径逐步增大,最外面的圆半径最大。两个画布的圆,在y轴上的坐标一致,x轴的坐标是根据图片左右轮播的的状态设置的,svg1是图片往左的波点图,svg2是图片往右的波点图。

 <div class="container">
        <div class="slider">
            <div class="btn btn-left">
                <i class="fa fa-angle-left"></i>
            </div>
            <div class="btn btn-right">
                <i class="fa fa-angle-right"></i>
            </div>
            <svg class="svg1">
                <!-- cx:圆点的x坐标  cy:圆点的y坐标  r:圆的半径 -->
                <circle class="circle1" cx="34px" cy="50%" r="20" />
                <circle class="circle2" cx="34px" cy="50%" r="100" />
                <circle class="circle3" cx="34px" cy="50%" r="180" />
                <circle class="circle4" cx="34px" cy="50%" r="260" />
                <circle class="circle5" cx="34px" cy="50%" r="340" />
                <circle class="circle6" cx="34px" cy="50%" r="420" />
                <circle class="circle7" cx="34px" cy="50%" r="500" />
                <circle class="circle8" cx="34px" cy="50%" r="580" />
                <circle class="circle9" cx="34px" cy="50%" r="660" />
            </svg>
            <svg class="svg2">
                <!-- cx:圆点的x坐标  cy:圆点的y坐标  r:圆的半径 -->
                <circle class="circle1" cx="648px" cy="50%" r="20" />
                <circle class="circle2" cx="648px" cy="50%" r="100" />
                <circle class="circle3" cx="648px" cy="50%" r="180" />
                <circle class="circle4" cx="648px" cy="50%" r="260" />
                <circle class="circle5" cx="648px" cy="50%" r="340" />
                <circle class="circle6" cx="648px" cy="50%" r="420" />
                <circle class="circle7" cx="648px" cy="50%" r="500" />
                <circle class="circle8" cx="648px" cy="50%" r="580" />
                <circle class="circle9" cx="648px" cy="50%" r="660" />
            </svg>
            <!-- 设置图片 -->
            <div class="slide slide1 active"></div>
            <div class="slide slide2"></div>
            <div class="slide slide3"></div>
            <div class="slide slide4"></div>
        </div>
    </div>

css部分

给body设置样式,大小为百分百,在使用flex布局。给包裹住整体的div设置宽高,图片在这个区域显示。再给图片设置样式,給图片绝对定位让其显示在可是窗口区域,然后再给按钮设置好样式,颜色风格统一即可。

 body {
            /* 100%窗口宽高 */
            height: 100vh;
            /* 弹性布局 水平+垂直居中 */
            display: flex;
            justify-content: center;
            align-items: center;
            /* 渐变背景 */
            background: linear-gradient(to top, #c1dfc4, #deecdd);
        }

        .container {
            width: 681px;
            height: 384px;
            /* 阴影 */
            box-shadow: 0 0 50px rgba(0, 0, 0, 0.25);
            /* 相对定位 */
            position: relative;
            /* 溢出隐藏 */
            overflow: hidden;
        }

        .slider {
            /* 绝对定位 */
            position: absolute;
            width: 400%;
            height: 100%;
            display: inline-flex;
            overflow: hidden;
        }

        svg {
            width: 681px;
            height: 384px;
            position: absolute;
            /* 设置堆叠顺序 */
            z-index: 3;
        }

        /* 左右按钮的统一样式 */
        .btn {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            background-color: transparent;
            border: 1px solid #949494;
            color: #949494;
            font-size: 25px;
            display: flex;
            justify-content: center;
            align-items: center;
            box-shadow: 0 0 30px rgba(0, 0, 0, 0.2);
            /* 垂直居中 */
            position: absolute;
            top: 50%;
            z-index: 4;
            transform: translateY(-50%);
            cursor: pointer;
            /* 设置过渡效果 */
            transition: 0.5s;
        }

        .btn:hover {
            background-color: #c1dfc4;
        }

        .btn.btn-left {
            left: 13px;
        }

        .btn.btn-right {
            left: 628px;
        }

接下来设置svg画出来的若干个圆,在给每个圆取消填充,定义成绿色的线,并设置好过度样式。再给svg1和svg2每一个类名(class)相同的设置一样的过度样式,因为一个向左一个向右,是一个镜像结构。

 /* 波浪圆圈 */
        circle {
            /* 取消填充 */
            fill: none;
            /* 定义一条浅绿色的线 */
            stroke: #c1dfc4;
            /* 线的厚度 */
            stroke-width: 0;
            /* 设置过渡动画时长 */
            transition: 0.3s;
            /* 设置过渡动画为线性动画 */
            transition-timing-function: linear;
        }

        .svg1 .circle1,
        .svg2 .circle1 {
            transition-delay: 0.05s;
        }

        .svg1 .circle2,
        .svg2 .circle2 {
            transition-delay: 0.1s;
        }

        .svg1 .circle3,
        .svg2 .circle3 {
            transition-delay: 0.15s;
        }

        .svg1 .circle4,
        .svg2 .circle4 {
            transition-delay: 0.2s;
        }

        .svg1 .circle5,
        .svg2 .circle5 {
            transition-delay: 0.25s;
        }

        .svg1 .circle6,
        .svg2 .circle6 {
            transition-delay: 0.3s;
        }

        .svg1 .circle7,
        .svg2 .circle7 {
            transition-delay: 0.35s;
        }

        .svg1 .circle8,
        .svg2 .circle8 {
            transition-delay: 0.4s;
        }

        .svg1 .circle9,
        .svg2 .circle9 {
            transition-delay: 0.45s;
        }

图片样式代码如下,只需注意点击图片加上放大样式即可

/* 焦点图的统一样式 */
        .slide {
            position: absolute;
            background-position: center;
            background-size: cover;
            width: 25%;
            height: 100%;
            z-index: 1;
            transition: 1.4s;
        }

        /* 分别设置焦点图 */
        .slide1 {
            background-image: url('./img/1.jpg');
        }

        .slide2 {
            background-image: url('./img/2.jpg');
        }

        .slide3 {
            background-image: url('./img/3.jpg');
        }

        .slide4 {
            background-image: url('./img/1.jpg');
        }

        /* 切换时图片放大 */
        .scale {
            transform: scale(1.3);
        }

        /* 设置当前图的堆叠顺序 */
        .active {
            z-index: 2;
        }

        /* 设置波浪圆圈的厚度 */
        .streak {
            stroke-width: 82px;
        }

js部分,具体看代码的注释,每个功能都完善。

​
<script>
        var left = document.querySelector('.btn-left'), //左按钮
            right = document.querySelector('.btn-right'); //右按钮
        // 定义变量
        var curpage = 1, //当前图下标
            sliding = false, //防止多次切换
            click = true, //防止多次点击
            svg = true; //区分svg1和svg2

        // 上一张
        function prev() {
            if (click) {
                //当下标为4时,下标重新赋值为1
                if (curpage == 4) 
                curpage = 1;
                sliding = true;
                curpage--;
                svg = true;
                //开关关闭
                click = false;
                for (i = 1; i <= 4; i++) {
                    //给获取到的图片加上放大功能
                    var a = document.querySelector('.slide' + i);
                    a.classList.add('scale');
                }
                //延迟200毫秒播放
                setTimeout(function() {
                    change();
                }, 200);
                //延迟1400毫秒清楚放大功能
                setTimeout(function() {
                    for (i = 1; i <= 4; i++) {
                        var a = document.querySelector('.slide' + i);
                        a.classList.remove('scale');
                    }
                }, 1400);
            }
        }

        // 下一张
        function next() {
            if (click) {
                if (curpage == 4) curpage = 0;
                sliding = true;
                curpage++;
                svg = false;
                click = false;
                for (i = 1; i <= 4; i++) {
                    var a = document.querySelector('.slide' + i);
                    a.classList.add('scale');
                }
                setTimeout(function() {
                    change();
                }, 200);
                setTimeout(function() {
                    for (i = 1; i <= 4; i++) {
                        var a = document.querySelector('.slide' + i);
                        a.classList.remove('scale');
                    }
                }, 1400);
            }
        }

        // 切换焦点图
        function change() {
            if (sliding) {
                sliding = false;
                if (svg) {
                    for (j = 1; j <= 9; j++) {
                        //给获取出来的圆圈加厚,形成波浪
                        var a = document.querySelector('.svg1 .circle' + j);
                        a.classList.add('streak');
                    }
                } else {
                    for (j = 1; j <= 9; j++) {
                        var a = document.querySelector('.svg2 .circle' + j);
                        a.classList.add('streak');
                    }
                }
                setTimeout(function() {
                    for (i = 1; i <= 4; i++) {
                        if (i == curpage) {
                            //让获取去来的图片显示
                            var a = document.querySelector('.slide' + i);
                            a.classList.add('active');
                        } else {
                            var a = document.querySelector('.slide' + i);
                            a.classList.remove('active');
                        }
                    }
                    sliding = true;
                }, 600);
                setTimeout(function() {
                    click = true;
                }, 1700);
                setTimeout(function() {
                    if (svg) {
                        for (j = 1; j <= 9; j++) {
                            var a = document.querySelector('.svg1 .circle' + j);
                            a.classList.remove('streak');
                        }
                    } else {
                        for (j = 1; j <= 9; j++) {
                            var a = document.querySelector('.svg2 .circle' + j);
                            a.classList.remove('streak');
                        }
                        sliding = true;
                    }
                }, 850);
                setTimeout(function() {
                    click = true;
                }, 1700);
            }
        }

        // 绑定左按钮的点击事件
        left.addEventListener('click', prev);
        // 绑定右按钮的点击事件
        right.addEventListener('click', next);
        // 绑定键盘左右键事件
        document.addEventListener('keydown', function (e) {
            if (e.keyCode == 37) {
                prev();
            } else if (e.keyCode == 39) {
                next();
            }
        })
    </script>

​

代码总结:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            /* 100%窗口宽高 */
            height: 100vh;
            /* 弹性布局 水平+垂直居中 */
            display: flex;
            justify-content: center;
            align-items: center;
            /* 渐变背景 */
            background: linear-gradient(to top, #c1dfc4, #deecdd);
        }

        .container {
            width: 681px;
            height: 384px;
            /* 阴影 */
            box-shadow: 0 0 50px rgba(0, 0, 0, 0.25);
            /* 相对定位 */
            position: relative;
            /* 溢出隐藏 */
            overflow: hidden;
        }

        .slider {
            /* 绝对定位 */
            position: absolute;
            width: 400%;
            height: 100%;
            display: inline-flex;
            overflow: hidden;
        }

        svg {
            width: 681px;
            height: 384px;
            position: absolute;
            /* 设置堆叠顺序 */
            z-index: 3;
        }

        /* 左右按钮的统一样式 */
        .btn {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            background-color: transparent;
            border: 1px solid #949494;
            color: #949494;
            font-size: 25px;
            display: flex;
            justify-content: center;
            align-items: center;
            box-shadow: 0 0 30px rgba(0, 0, 0, 0.2);
            /* 垂直居中 */
            position: absolute;
            top: 50%;
            z-index: 4;
            transform: translateY(-50%);
            cursor: pointer;
            /* 设置过渡效果 */
            transition: 0.5s;
        }

        .btn:hover {
            background-color: #c1dfc4;
        }

        .btn.btn-left {
            left: 13px;
        }

        .btn.btn-right {
            left: 628px;
        }

        /* 波浪圆圈 */
        circle {
            /* 取消填充 */
            fill: none;
            /* 定义一条浅绿色的线 */
            stroke: #c1dfc4;
            /* 线的厚度 */
            stroke-width: 0;
            /* 设置过渡动画时长 */
            transition: 0.3s;
            /* 设置过渡动画为线性动画 */
            transition-timing-function: linear;
        }

        .svg1 .circle1,
        .svg2 .circle1 {
            transition-delay: 0.05s;
        }

        .svg1 .circle2,
        .svg2 .circle2 {
            transition-delay: 0.1s;
        }

        .svg1 .circle3,
        .svg2 .circle3 {
            transition-delay: 0.15s;
        }

        .svg1 .circle4,
        .svg2 .circle4 {
            transition-delay: 0.2s;
        }

        .svg1 .circle5,
        .svg2 .circle5 {
            transition-delay: 0.25s;
        }

        .svg1 .circle6,
        .svg2 .circle6 {
            transition-delay: 0.3s;
        }

        .svg1 .circle7,
        .svg2 .circle7 {
            transition-delay: 0.35s;
        }

        .svg1 .circle8,
        .svg2 .circle8 {
            transition-delay: 0.4s;
        }

        .svg1 .circle9,
        .svg2 .circle9 {
            transition-delay: 0.45s;
        }

        /* 焦点图的统一样式 */
        .slide {
            position: absolute;
            background-position: center;
            background-size: cover;
            width: 25%;
            height: 100%;
            z-index: 1;
            transition: 1.4s;
        }

        /* 分别设置焦点图 */
        .slide1 {
            background-image: url('./img/1.jpg');
        }

        .slide2 {
            background-image: url('./img/2.jpg');
        }

        .slide3 {
            background-image: url('./img/3.jpg');
        }

        .slide4 {
            background-image: url('./img/2.jpg');
        }

        /* 切换时图片放大 */
        .scale {
            transform: scale(1.3);
        }

        /* 设置当前图的堆叠顺序 */
        .active {
            z-index: 2;
        }

        /* 设置波浪圆圈的厚度 */
        .streak {
            stroke-width: 82px;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="slider">
            <div class="btn btn-left">
                <i class="fa fa-angle-left">&lt;</i>
            </div>
            <div class="btn btn-right">
                <i class="fa fa-angle-right">&gt;</i>
            </div>
            <svg class="svg1">
                <!-- cx:圆点的x坐标  cy:圆点的y坐标  r:圆的半径 -->
                <circle class="circle1" cx="34px" cy="50%" r="20" />
                <circle class="circle2" cx="34px" cy="50%" r="100" />
                <circle class="circle3" cx="34px" cy="50%" r="180" />
                <circle class="circle4" cx="34px" cy="50%" r="260" />
                <circle class="circle5" cx="34px" cy="50%" r="340" />
                <circle class="circle6" cx="34px" cy="50%" r="420" />
                <circle class="circle7" cx="34px" cy="50%" r="500" />
                <circle class="circle8" cx="34px" cy="50%" r="580" />
                <circle class="circle9" cx="34px" cy="50%" r="660" />
            </svg>
            <svg class="svg2">
                <!-- cx:圆点的x坐标  cy:圆点的y坐标  r:圆的半径 -->
                <circle class="circle1" cx="648px" cy="50%" r="20" />
                <circle class="circle2" cx="648px" cy="50%" r="100" />
                <circle class="circle3" cx="648px" cy="50%" r="180" />
                <circle class="circle4" cx="648px" cy="50%" r="260" />
                <circle class="circle5" cx="648px" cy="50%" r="340" />
                <circle class="circle6" cx="648px" cy="50%" r="420" />
                <circle class="circle7" cx="648px" cy="50%" r="500" />
                <circle class="circle8" cx="648px" cy="50%" r="580" />
                <circle class="circle9" cx="648px" cy="50%" r="660" />
            </svg>
            <!-- 设置图片 -->
            <div class="slide slide1 active"></div>
            <div class="slide slide2"></div>
            <div class="slide slide3"></div>
            <div class="slide slide4"></div>
        </div>
    </div>

    <script>
        var left = document.querySelector('.btn-left'), //左按钮
            right = document.querySelector('.btn-right'); //右按钮
        // 定义变量
        var curpage = 1, //当前图下标
            sliding = false, //防止多次切换
            click = true, //防止多次点击
            svg = true; //区分svg1和svg2

        // 上一张
        function prev() {
            if (click) {
                //当下标为4时,下标重新赋值为1
                if (curpage == 4) 
                curpage = 1;
                sliding = true;
                curpage--;
                svg = true;
                //开关关闭
                click = false;
                for (i = 1; i <= 4; i++) {
                    //给获取到的图片加上放大功能
                    var a = document.querySelector('.slide' + i);
                    a.classList.add('scale');
                }
                //延迟200毫秒播放
                setTimeout(function() {
                    change();
                }, 200);
                //延迟1400毫秒清楚放大功能
                setTimeout(function() {
                    for (i = 1; i <= 4; i++) {
                        var a = document.querySelector('.slide' + i);
                        a.classList.remove('scale');
                    }
                }, 1400);
            }
        }

        // 下一张
        function next() {
            if (click) {
                if (curpage == 4) curpage = 0;
                sliding = true;
                curpage++;
                svg = false;
                click = false;
                for (i = 1; i <= 4; i++) {
                    var a = document.querySelector('.slide' + i);
                    a.classList.add('scale');
                }
                setTimeout(function() {
                    change();
                }, 200);
                setTimeout(function() {
                    for (i = 1; i <= 4; i++) {
                        var a = document.querySelector('.slide' + i);
                        a.classList.remove('scale');
                    }
                }, 1400);
            }
        }

        // 切换焦点图
        function change() {
            if (sliding) {
                sliding = false;
                if (svg) {
                    for (j = 1; j <= 9; j++) {
                        //给获取出来的圆圈加厚,形成波浪
                        var a = document.querySelector('.svg1 .circle' + j);
                        a.classList.add('streak');
                    }
                } else {
                    for (j = 1; j <= 9; j++) {
                        var a = document.querySelector('.svg2 .circle' + j);
                        a.classList.add('streak');
                    }
                }
                setTimeout(function() {
                    for (i = 1; i <= 4; i++) {
                        if (i == curpage) {
                            //让获取去来的图片显示
                            var a = document.querySelector('.slide' + i);
                            a.classList.add('active');
                        } else {
                            var a = document.querySelector('.slide' + i);
                            a.classList.remove('active');
                        }
                    }
                    sliding = true;
                }, 600);
                setTimeout(function() {
                    click = true;
                }, 1700);
                setTimeout(function() {
                    if (svg) {
                        for (j = 1; j <= 9; j++) {
                            var a = document.querySelector('.svg1 .circle' + j);
                            a.classList.remove('streak');
                        }
                    } else {
                        for (j = 1; j <= 9; j++) {
                            var a = document.querySelector('.svg2 .circle' + j);
                            a.classList.remove('streak');
                        }
                        sliding = true;
                    }
                }, 850);
                setTimeout(function() {
                    click = true;
                }, 1700);
            }
        }

        // 绑定左按钮的点击事件
        left.addEventListener('click', prev);
        // 绑定右按钮的点击事件
        right.addEventListener('click', next);
        // 绑定键盘左右键事件
        document.addEventListener('keydown', function (e) {
            if (e.keyCode == 37) {
                prev();
            } else if (e.keyCode == 39) {
                next();
            }
        })
    </script>
</body>

</html>

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值