利用JS制作双层点击选项卡

对原生JS的闭包以及for循环总是有些不理解,今天就利用这两个知识点做了个双层选项卡,对这两个知识点的理解加深了不少,下面为解析代码,先附加个效果图,介绍大体功能.下面这张图(可能有点丑)点击左侧选项卡时跳转到各主体界面,点击1234时会跳转到不同内容区域


代码如下:

关于布局的HTML与CSS:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td {
            margin: 0;
            padding: 0
        }

        table {
            border-collapse: collapse;
            border-spacing: 0
        }

        fieldset, img {
            border: 0
        }

        address, caption, cite, code, dfn, em, strong, th, var {
            font-style: normal;
            font-weight: normal
        }

        ol, ul {
            list-style: none
        }

        caption, th {
            text-align: left
        }

        h1, h2, h3, h4, h5, h6 {
            font-size: 100%;
            font-weight: normal
        }

        q:before, q:after {
            content: ''
        }

        abbr, acronym {
            border: 0;
            font-variant: normal
        }

        sup {
            vertical-align: text-top
        }
        sub {
            vertical-align: text-bottom
        }
        input, textarea, select {
            font-family: inherit;
            font-size: inherit;
            font-weight: inherit;
        }

        input, textarea, select {
            *font-size: 100%
        }
        section{
            position: relative;
            width: 500px;
            height: 400px;
            margin: 50px auto;
            border: 1px solid black;
        }
        #aside{
            display: inline-block;
            width: 80px;
            height: 150px;
            margin-top: 20%;

        }
        #aside div{
            height: 20%;
            margin-top: 20%;
            text-align: center;
            line-height: 2em;
            color: #fff;
            border: 1px solid black;
            background-color: rgba(0,0,0,.5);
            cursor: pointer;
        }
        #aside div:hover{
            background-color: rgba(123,123,56,.5);
        }//上方为侧边栏的布局
        .content{
            display: block;
            position: absolute;
            top: 0;
            right: 0;
            width: 80%;
            height: 400px;
            margin-right: 0;
            border: 1px solid black;
        }
        .active{
            display: block !important;
        }
        /*区块的布局,下方为图片的布局*/
        .food li , .car li , .scenery li{
            display: none;
            width: 100%;
            height: 400px;
        }
        .content li img{
            position: relative;
            z-index: 1;
            width: 100%;
            height: 100%;
        }
//下方是为点击后应达到的效果做铺垫
        .index{
            display: none;
        }
        .no{
            display: none;
        }
        .on{
            position: relative;
            z-index: 4;
            display: flex;
            width: 250px;
            height: 30px;
            margin: -10% auto;
            justify-content: space-around;
        }
        .on li{
            display: block;
            width: 30px;
            height: 30px;
            text-align: center;
            line-height: 30px;
            color: #fff;
            background-color: rgba(0,0,0,.5);
            cursor: pointer;
        }
        .on li:hover{
            background-color: rgba(123,0,56,.5);
        }
    </style>
</head>
<body>

<section>
    <aside id="aside">
        <div>美食</div>
        <div>赛车</div>
        <div>其它</div>
    </aside>

    <div class="content">
        <ul class="car">
            <li class="active"><img src="images/1.jpg" alt=""></li>
            <li><img src="images/2.jpg" alt=""></li>
            <li><img src="images/3.jpg" alt=""></li>
            <li><img src="images/4.jpg" alt=""></li>
        </ul>

        <ol class="index on">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ol>
    </div>

    <div class="content">
        <ul class="food">
            <li><img src="images/m1.jpg" alt=""></li>
            <li><img src="images/m2.jpg" alt=""></li>
            <li><img src="images/m3.jpg" alt=""></li>
            <li><img src="images/m4.jpg" alt=""></li>
            <li><img src="images/m5.jpg" alt=""></li>
        </ul>
        <ol class="index">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
        </ol>
    </div>

    <div class="content">
        <ul class="scenery">
            <li><img src="images/s1.jpg" alt=""></li>
            <li><img src="images/s2.jpg" alt=""></li>
            <li><img src="images/s3.jpg" alt=""></li>
        </ul>
        <ol class="index">
            <li>1</li>
            <li>2</li>
            <li>3</li>
        </ol>
    </div>

</section>

JS部分的代码:

<script type="text/javascript">
    (function(){
        var oAside = document.getElementById('aside'),//获取侧边栏的id
            aDiv = document.getElementsByTagName('div'),//获取图片的大盒子
            oContent = document.getElementsByClassName('content'),//获取图片的内容
            aIndex = document.getElementsByClassName('index');//获取图片的标记
        for(var i = 0;i < oContent.length;i++) {//利用for循环实现对侧边栏的点击效果

            let aUl = oContent[i].getElementsByTagName('ul')[0],//获得侧边栏不同种类中的中的图片
                aLi = aUl.getElementsByTagName('li');
            aUl.index = i;
            aDiv[i].onclick = function(){
                for (var j = 0 ;j<oContent.length;j++){//在进行一次for循环,目的是要将未被选中的图片全部消失
                        let aUl2= oContent[j].getElementsByTagName('ul')[0],
                            aLi2 = aUl2.getElementsByTagName('li')
                        ;
                        if (j===aUl.index){//如果是点击的是侧边栏的某个内容
                            aLi[0].className= "active";//默认第一张图片显示
                            aIndex[j].className = "index on";
                            oContent[j].className= "content";
                            var aImg = aIndex[j].getElementsByTagName('li');
                            for (let k = 0;k<aImg.length;k++){//可以选择其它图片
                                  aImg[k].onclick = function(){
                                      for (let m = 0;m<aImg.length;m++ ){//选中的图片显示,其他消失
                                          if (m===k){
                                              aLi[k].className = "active";
                                          } else{
                                              aLi[m].className ="";
                                          }
                                      }
                                  }
                            }
                        }else{//未被选中的侧边栏内容消失
                            aLi2[0].className="";
                            aIndex[j].className = "index";
                            oContent[j].className="content no";
                        }
                }

            }

        }
    })();
</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_40552152/article/details/80645343