Web前端之路

原生JS实现图片轮播及二级菜单的绑定

2020-03-05  本文已影响0人  梁文璇

我们在各个电商网站上都可以看到图片轮播,当然框架实现的话,想必对大家来说是 so easy 的,那么该如何用原生JS来实现呢?请开始我的show~~~

动起来 做出来的效果是这样滴

HTML

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<link rel="stylesheet" href="css/style.css">

</head>

<body>

<div class="main" id="main">

<div class="menu-box">

</div>

<!--内容-->

<div class="sub-menu hide" id="sub-menu">

<div class="inner-box">

<div class="sub-inner-box">

<div class="title">手机、配件</div>

<div class="sub-row">

<span class="bold mr10">手机通讯:</span>

<a href="">手机</a>

<span class="ml10 mr10">/</span>

<a href="">手机维修</a>

<span class="ml10 mr10">/</span>

<a href="">以旧换新</a>

</div>

<div class="sub-row">

<span class="bold mr10">手机配件:</span>

<a href="">手机壳</a>

<span class="ml10 mr10">/</span>

<a href="">手机存储卡</a>

<span class="ml10 mr10">/</span>

<a href="">数据线</a>

<span class="ml10 mr10">/</span>

<a href="">充电器</a>

<span class="ml10 mr10">/</span>

<a href="">电池</a>

</div>

<div class="sub-row">

<span class="bold mr10">运营商:</span>

<a href="">中国联通</a>

<span class="ml10 mr10">/</span>

<a href="">中国移动</a>

<span class="ml10 mr10">/</span>

<a href="">中国电信</a>

</div>

<div class="sub-row">

<span class="bold mr10">智能设备:</span>

<a href="">智能手环</a>

<span class="ml10 mr10">/</span>

<a href="">智能家居</a>

<span class="ml10 mr10">/</span>

<a href="">智能手表</a>

<span class="ml10 mr10">/</span>

<a href="">其他配件</a>

</div>

<div class="sub-row">

<span class="bold mr10">娱乐:</span>

<a href="">耳机</a>

<span class="ml10 mr10">/</span>

<a href="">音响</a>

<span class="ml10 mr10">/</span>

<a href="">收音机</a>

<span class="ml10 mr10">/</span>

<a href="">麦克风</a>

</div>

</div>

</div>

<div class="inner-box">

<div class="sub-inner-box">

<div class="title">电脑</div>

<div class="sub-row">

                      <span class="bold mr10">电脑:</span>

                      <a href="">笔记本</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">平板</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">一体机</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">电脑配件:</span>

                      <a href="">显示器</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">CPU</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">主板</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">硬盘</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">电源</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">显卡</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">其他配件</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">游戏设备:</span>

                      <a href="">游戏机</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">耳机</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">游戏软件</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">网络产品:</span>

                      <a href="">路由器</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">网络机顶盒</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">交换机</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">存储卡</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">网卡</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">外部产品:</span>

                      <a href="">鼠标</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">键盘</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">U盘</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">移动硬盘</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">鼠标垫</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">电脑清洁</a>

</div>

</div>

</div>

<div class="inner-box">

<div class="sub-inner-box">

<div class="title">家用电器</div>

<div class="sub-row">

                      <span class="bold mr10">电视:</span>

                      <a href="">国产品牌</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">韩国品牌</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">欧美品牌</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">空调:</span>

                      <a href="">显示器</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">柜式</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">中央</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">壁挂式</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">冰箱:</span>

                      <a href="">多门</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">对开门</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">三门</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">双门</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">洗衣机:</span>

                      <a href="">滚筒式洗衣机</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">迷你洗衣机</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">洗烘一体机</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">厨房电器:</span>

                      <a href="">油烟机</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">洗碗机</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">燃气灶</a>

</div>

</div>

</div>

<div class="inner-box">

<div class="sub-inner-box">

<div class="title">家具</div>

<div class="sub-row">

                      <span class="bold mr10">家纺:</span>

                      <a href="">被子</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">枕头</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">四件套</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">床垫</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">灯具:</span>

                      <a href="">台灯</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">顶灯</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">节能灯</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">应急灯</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">厨具:</span>

                      <a href="">烹饪锅具</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">餐具</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">菜板刀具</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">家装:</span>

                      <a href="">地毯</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">沙发垫套</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">装饰字画</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">照片墙</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">窗帘</a>

</div>

<div class="sub-row">

                      <span class="bold mr10">生活日用:</span>

                      <a href="">收纳用品</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">浴室用品</a>

                      <span class="ml10 mr10">/</span>

                      <a href="">雨伞雨衣</a>

</div>

</div>

</div>

</div>

<!-- 菜单 -->

<div class="menu-content" id="menu-content">

<div class="menu-item">

<a href="">

<span>手机、配件</span>

<i class="icon">&#xe665;</i>

</a>

</div>

<div class="menu-item">

<a href="">

<span>电脑</span>

<i class="icon">&#xe665;</i>

</a>

</div>

<div class="menu-item">

<a href="">

<span>家用电器</span>

<i class="icon">&#xe665;</i>

</a>

</div>

<div class="menu-item">

<a href="">

<span>家具</span>

<i class="icon">&#xe665;</i>

</a>

</div>

</div>

<div class="banner" id="banner">

<a href="">

<div class="banner-slide slide1 slide-active"></div>

</a>

<a href="">

<div class="banner-slide slide2"></div>

</a>

<a href="">

<div class="banner-slide slide3"></div>

</a>

</div>

<a href="javascript:void(0)" class="button prev" id="prev"></a>

<a href="javascript:void(0)" class="button next" id="next"></a>

<div class="dots" id="dots">

<span class="active"></span>

<span></span>

<span></span>

</div>

</div>

<script src="js/script.js"></script>

</body>

</html>

CSS样式

*{margin:0;padding:0;}

@font-face {font-family: 'iconfont';

  src: url('../img/font/iconfont.eot');

  src: url('../img/font/iconfont.eot') format('embedded-opentype'),

  url('../img/font/iconfont.woff') format('woff'),

  url('../img/font/iconfont.ttf') format('truetype'),

  url('../img/font/iconfont.svg#iconfont') format('svg');}

a{text-decoration: none;}

a:link,a:visited{color:#5e5e5e;}

body{font-family:"微软雅黑";color: #14191e;}

.main{width:1200px;height:460px;margin:30px auto;position:relative;overflow:hidden}

.banner{width:1200px;height:460px;overflow:hidden;position:relative}

.banner-slide{width:1200px;height:460px;background-repeat:no-repeat;float:left;display:none}

.slide-active{display:block}

.slide1{background-image:url(../img/bg1.jpg);}

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

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

.button{position: absolute;transform:rotate(180deg);top: 50%;left: 244px;height: 80px;width: 40px;margin-top:-40px;background:url(../img/arrow.png) center center no-repeat;}

.next{transform:rotate(0deg);left:auto;right:0;}

.button:hover{background-color:#333;opacity: 0.8;filter:alpha(opacity=80);}

.dots {position: absolute;bottom: 24px;right: 0;text-align: right;padding-right: 24px;line-height: 12px;}

.dots span {display: inline-block;width: 12px;height: 12px;border-radius: 50%;margin-left: 8px;background-color: rgba(7, 17, 27, 0.4);cursor: pointer;box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.8) inset;}

.dots span.active{box-shadow: 0 0 0 2px rgba(7, 17, 27, 0.4) inset;background-color: #ffffff;}

/* menu-box */

.menu-box {background:rgba(7, 17, 27, 0.5);opacity: 0.5;position: absolute;left: 0px;top: 0px;width: 244px;height: 460px;z-index: 1;}

.menu-content{position: absolute;left: 0px;top: 0px;width: 244px;height: 460px;z-index: 2;padding-top: 6px}

.menu-item{height: 64px;line-height: 66px;font-size: 12px;cursor: pointer;padding: 0 24px;position: relative}

.menu-item a{display: block;color: #fff;padding: 0 8px;border-bottom: 1px solid rgba(255, 255, 255, 0.2);height: 63px;font-size:16px}

.menu-item:last-child a{border-bottom:none}

.menu-item i{position: absolute;right: 32px;top: 24px;color: rgba(255,255,255,0.5);font-size: 24px;top: 2px;font-style:normal;font-weight:normal;font-family:"iconfont";}

.sub-menu {border:1px solid #d9dde1;background:#fff;position: absolute;left: 244px;top: 0px;width: 730px;height: 458px;z-index: 581;box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.1);}

.hide{display:none;}

.inner-box{width:100%;height:100%;background:url(../img/fe.png) no-repeat;display:none;}

.sub-inner-box{width: 652px;margin-left: 40px;overflow: hidden;}

.title{color: #f01414;font-size: 16px;line-height: 16px;margin-top: 28px;font-weight: bold;margin-bottom: 30px;}

.sub-row{margin-bottom:25px;}

.bold{font-weight:700;}

.mr10{margin-right:10px;}

.ml10{margin-left:10px;}

JS代码

var timer = null,

    index = 0,

    pics = byId("banner").getElementsByTagName("div"),

    dots = byId("dots").getElementsByTagName("span"),

    size = pics.length,

    prev = byId("prev"),

    next = byId("next"),

    menuItems = byId("menu-content").getElementsByTagName("div"),

    subMenu = byId("sub-menu"),

    subItems = subMenu.getElementsByClassName("inner-box");

function addHandler(element, type, handler) {

    if (element.addEventListener) {

        element.addEventListener(type, handler, true);

    }

    else if (element.attachEvent) {

        element.attachEvent('on' + type, handler);

    }

    else {

        element['on' + type] = handler;

    }

}

function byId(id){

return typeof(id)==="string"?document.getElementById(id):id;

}

// 清除定时器,停止自动播放

function stopAutoPlay(){

if(timer){

      clearInterval(timer);

}

}

// 图片自动轮播

function startAutoPlay(){

  timer = setInterval(function(){

      index++;

      if(index >= size){

          index = 0;

      }

      changeImg();

  },3000)

}

function changeImg(){

  for(var i=0,len=dots.length;i<len;i++){

      dots[i].className = "";

      pics[i].style.display = "none";

  }

  dots[index].className = "active";

  pics[index].style.display = "block";

}

function slideImg(){

    startAutoPlay();

    var main = byId("main");

    var banner = byId("banner");

    var menuContent = byId("menu-content");

    addHandler(main,"mouseover",stopAutoPlay);

    addHandler(main,"mouseout",startAutoPlay);

    // 点击导航切换

    for(var i=0,len=dots.length;i<len;i++){

      dots[i].id = i;

      addHandler(dots[i],"click",function(){

          index = this.id;

          changeImg();

      })

    }

    // 下一张

    addHandler(next,"click",function(){

      index++;

      if(index>=size) index=0;

      changeImg();

    })

    // 上一张

    addHandler(prev,"click",function(){

      index--;

      if(index<0) index=size-1;

      changeImg();

    })

    // 菜单

    for(var m=0,mlen=menuItems.length;m<mlen;m++){

        menuItems[m].setAttribute("data-index",m);

        addHandler(menuItems[m],"mouseover",function(){

            subMenu.className = "sub-menu";

            var idx = this.getAttribute("data-index");

            for(var j=0,jlen=subItems.length;j<jlen;j++){

              subItems[j].style.display = 'none';

              menuItems[j].style.background = "none";

            }

            subItems[idx].style.display = "block";

            menuItems[idx].style.background = "rgba(0,0,0,0.1)";

        });

    }

    addHandler(subMenu,"mouseover",function(){

        this.className = "sub-menu";

    });

    addHandler(subMenu,"mouseout",function(){

        this.className = "sub-menu hide";

    });

    addHandler(banner,"mouseout",function(){

        subMenu.className = "sub-menu hide";

    });

    addHandler(menuContent,"mouseout",function(){

        subMenu.className = "sub-menu hide";

    });

}

addHandler(window,"load",slideImg);

监听方法:

addEventListener() 和 removeEventListener() 有三个参数

第一个参数:事件名

第二个参数:事件处理函数

第三个参数:true为在捕获阶段调用,false为在冒泡阶段调用

功能: addEventListener() 可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用

removeEventListener() 移除事件处理程序,但不能移除匿名添加的函数

attachEvent() 可以为元素添加多个事件处理程序,触发时会按照添加顺序从后往前依次调用

detachEvent()  移除事件处理程序,但不能移除匿名添加的函数

附上 流程图

二级菜单流程图 图片轮播流程图

今天就到这里啦·····everybody 疫情要结束了,是否准备好开始你的向上之路呢?看得出来想要开学的小伙伴们内心非常迫切呀,按时报平安,你想要的就会到来滴~   

see you again
上一篇下一篇

猜你喜欢

热点阅读