js轮播图(原生)

博客 分享
0 213
张三
张三 2022-04-16 20:58:03
悬赏:0 积分 收藏

js 轮播图 (原生)

注 : 此处内容较多, 只显示代码, 具体讲解看注释.  具体参考 "黑马 pink老师"   https://www.bilibili.com/video/BV1Sy4y1C7ha?p=328&spm_id_from=pageDriver

html 结构

<!DOCTYPE html><html>    <head>        <meta charset="utf-8">        <title></title>        <link rel="stylesheet" type="text/css" href="css/css.css" />        <link rel="stylesheet" type="text/css" href="css/base.css"/>        <script src="js/animate.js" type="text/javascript" charset="utf-8"></script>        <script src="js/index.js" type="text/javascript" charset="utf-8"></script>    </head>    <body>        <div class="focus fl">            <!-- 左侧按钮 -->            <a href="javascript:;" class="arrow-l">                &lt;            </a>            <!-- 右侧按钮 -->            <a href="javascript:;" class="arrow-r"> ? </a>            <!-- 核心的滚动区域 -->            <ul>                <li>                    <a href="#"><img src="img/1.jpeg" alt=""></a>                </li>                <li>                    <a href="#"><img src="img/2.jpeg" alt=""></a>                </li>                <li>                    <a href="#"><img src="img/3.webp" alt=""></a>                </li>                <li>                    <a href="#"><img src="img/4.webp" alt=""></a>                </li>            </ul>            <!-- 小圆圈 -->            <ol class="circle">                            </ol>        </div>    </body></html>

 

css 样式  css文件

/*这个文件里面放的是 首页的样式*/.main {    width: 980px;    height: 455px;    margin-left: 219px;    margin-top: 10px;}.focus {    position: relative;    width: 500px;    height: 333px;    background-color: purple;    overflow: hidden;}.focus ul {    position: absolute;    top: 0;    left: 0;    width: 600%;}.focus ul li {    float: left;}.arrow-l,.arrow-r {    display: none;    position: absolute;    top: 50%;    margin-top: -20px;    width: 24px;    height: 40px;    background: rgba(0, 0, 0, .3);    text-align: center;    line-height: 40px;    color: #fff;    font-family: 'icomoon';    font-size: 18px;    z-index: 2;}.arrow-r {    right: 0;}.circle {    position: absolute;    bottom: 10px;    left: 50px;}.circle li {    float: left;    width: 8px;    height: 8px;    /*background-color: #fff;*/    border: 2px solid rgba(255, 255, 255, 0.5);    margin: 0 3px;    border-radius: 50%;    /*鼠标经过显示小手*/    cursor: pointer;}.current {    background-color: #fff;}

清除 浏览器默认样式  base文件

/*清除元素默认的内外边距  */* {    margin: 0;    padding: 0;}/*让所有斜体 不倾斜*/em,i {    font-style: normal;}/*去掉列表前面的小点*/li {    list-style: none;}/*图片没有边框   去掉图片底侧的空白缝隙*/img {    border: 0;    /*ie6*/    vertical-align: middle;}/*让button 按钮 变成小手*/button {    cursor: pointer;}/*取消链接的下划线*/a {    color: #666;    text-decoration: none;}a:hover {    color: #e33333;}button,input {    font-family: 'Microsoft YaHei', 'Heiti SC', tahoma, arial, 'Hiragino Sans GB', \\5B8B\4F53, sans-serif;    /*取消轮廓线 蓝色的*/    outline: none;}body {    background-color: #fff;    font: 12px/1.5 'Microsoft YaHei', 'Heiti SC', tahoma, arial, 'Hiragino Sans GB', \\5B8B\4F53, sans-serif;    color: #666;}.hide,.none {    display: none;}/*清除浮动*/.clearfix:after {    visibility: hidden;    clear: both;    display: block;    content: ".";    height: 0;}.clearfix {    *zoom: 1}

 

js index 代码

window.addEventListener('load', function() {    // 1. 获取元素    let arrow_l = document.querySelector('.arrow-l'); // 左侧按钮    let arrow_r = document.querySelector('.arrow-r'); // 右侧按钮    let focus = document.querySelector('.focus'); // 大盒子    let focusWidth = focus.offsetWidth; // 大盒子的宽度    // mouseenter 鼠标划入 不会触发冒泡    focus.addEventListener('mouseenter', function() {        arrow_l.style.display = 'block';        arrow_r.style.display = 'block';        // 清除定时器        clearInterval(timer);        timer = null;    })    focus.addEventListener('mouseleave', function() {        arrow_l.style.display = 'none';        arrow_r.style.display = 'none';        // 开始定时器        timer = setInterval(function() {            // 手动调用事件            arrow_r.click();        }, 2000)    })    // 2. 动态生成小圆圈    let ul = focus.querySelector('ul');    let ol = focus.querySelector('.circle');    for (let i = 0; i < ul.children.length; i++) {        let li = document.createElement('li'); // 创建 li        // 记录当前小圆圆的索引号 通过自定义属性来做        li.setAttribute('index', i);        // 把小li插到 ol 里面        ol.appendChild(li);        // 4. 小圆圈的排他思想 我们可以直接在生成小圆圆的同时直接绑定点击事件        li.addEventListener('click', function() {            // 干掉所有人             for (let j = 0; j < ol.children.length; j++) {                ol.children[j].className = '';            }            // 留下我自己            this.className = 'current';            // 5. 点击小圆圈, 移动图片 当然移动的是 ul            // ul 的移动距离 小圆圆的索引号 乘以 图片的宽度 注意是负值            // 当我们点击了某个小 li 就拿到当前小 li 的索引号            let index = this.getAttribute('index');            // 当我们点击了某个小li 就要把这个li 的索引号给 num             num = index;            // 当我们点击了某个小 li 就要把这个li 的索引号给 circle            circle = index;            console.log(focusWidth);            console.log(index);            animate(ul, -index * focusWidth);        })    }    // 把 ol 里面的第一个小 li 设置类名为 current    ol.children[0].className = 'current';    // 6. 克隆第一张图片 (li) 放到 ul 最后面    let first = ul.children[0].cloneNode(true);    ul.appendChild(first);    // 7. 点击右侧按钮,  图片滚动一张    let num = 0;    let circle = 0;    arrow_r.addEventListener('click', function() {        if (flag) {            flag = false; // 关闭节流阀            if (num == ul.children.length - 1) {                // 如果走到了最后负值的一张图片, 此时 我们的 ul 要快速复原 left 改为 0                ul.style.left = 0;                num = 0;            }            num++;            animate(ul, -num * focusWidth, function() {                flag = true; // 打开节流阀            });            // 8. 点击右侧按钮, 小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放;            circle++;            // 如果 circle == 4 说明走到最后我们克隆的这张图片了 我们就复原            // if (circle == ol.children.length) {            // circle = 0;            // };            circle = circle == ol.children.length ? circle = 0 : circle;            // 调用函数            circleChange();        }    });    // 8. 左侧按钮    arrow_l.addEventListener('click', function() {        if (flag) {            flag = false;            if (num == 0) {                // 如果走到了最后负值的一张图片, 此时 我们的 ul 要快速复原 left 改为 0                num = ul.children.length - 1;                ul.style.left = -num * focusWidth + 'px';            }            num--;            animate(ul, -num * focusWidth, function () {                flag = true;            });            // 8. 点击右侧按钮, 小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放;            circle--;            // 如果 circle < 0 说明张图片, 则小圆圈要改为第四个小圆圈            // if (circle < 0) {            // circle = ol.children.length - 1;            // };            circle = circle < 0 ? circle = ol.children.length - 1 : circle;            // 调用函数            circleChange();        }    })    function circleChange() {        // 先清除其余小圆圆的 current 类名        for (let i = 0; i < ol.children.length; i++) {            ol.children[i].className = '';        }        // 留下当前的小圆圈的 current 类名        ol.children[circle].className = 'current';    }    // 10. 自动播放轮播图    let timer = setInterval(function() {        // 手动调用事件        arrow_r.click();    }, 2000)})

 

js animate代码

function animate(obj, target, callback) {        // obj 对象    target 目标   callback 回调函数    // console.log(callback);  callback = function() {}  调用的时候 callback()    // 先清除以前的定时器,只保留当前的一个定时器执行    clearInterval(obj.timer);    obj.timer = setInterval(function() {        // 步长值写到定时器的里面        // 把我们步长值改为整数 不要出现小数的问题        // var step = Math.ceil((target - obj.offsetLeft) / 10);        var step = (target - obj.offsetLeft) / 10;        step = step > 0 ? Math.ceil(step) : Math.floor(step);        if (obj.offsetLeft == target) {            // 停止动画 本质是停止定时器            clearInterval(obj.timer);            // 回调函数写到定时器结束里面            // if (callback) {            //     // 调用函数            //     callback();            // }            callback && callback();        }        // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10        obj.style.left = obj.offsetLeft + step + 'px';    }, 15);}

 

 

 

img 图片

 

 

 

 

 

 

 

 

文件夹结构

 

 

所有内容 , 复制粘贴直接可用

 

posted @ 2022-04-16 20:27 张铄洋 阅读(14) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员