JavaScript中tab切换 下拉框操作

tab切换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/table切换.js" defer></script>
    <style>
        li{
            list-style: none;
        }
        .top ul{
            display: flex;
        }
        .top ul li{
            margin-left: 5px;
        }
        .bottem ul li{
            margin-top: 20px;
            margin-left: 5px;
            display: none;
        }//开始时所有的隐藏 只有第一个显示
        .bottem ul li:first-child{
            display: block;
        }
        .top ul li{
            cursor: pointer;
            //点击之后鼠标变成小手
        }
        .one{
            font-size: 30px;
            color: brown;
        }
    </style>
</head>
<body>
    <div>
       <div class="top">
            <ul>
                <li class="one" index="0">标题1</li>
        //加上index 点击时获得index值以便找到对应的内容
                <li index="1">标题2</li>
                <li index="2">标题3</li>
                <li index="3">标题4</li>
            </ul>
       </div>
       <div class="bottem">
            <ul>
                <li>内容1</li>
                <li>内容2</li>
                <li>内容3</li>
                <li>内容4</li>
            </ul>
       </div>
    </div>
</body>
</html>
var x1=document.querySelectorAll(".top li")
//获取所有标题并返回数组
var x2=document.querySelectorAll(".bottem li")
//获取所有内容并返回标题
for(var i=0;i<x1.length;i++)
{
    x1[i].setAttribute("index",i)
    //给x中每个元素绑定index值
    x1[i].onclick=function()
    {
        for(var j=0;j<x1.length;j++)
        {
           x1[j].className=""
           
        }
        //先让所有的标题点击之后都没有样式
        this.className="one"
        //再唯独让被点击的标题加上样式
        var num=this.getAttribute("index")
        //num是当前被点击标题的index值
        for(var k=0;k<x2.length;k++)
        {
            if(k==num)
            {
                x2[k].style.display="block"
            }
            else  x2[k].style.display="none"
        }
    }
}

效果在主页视频 也可以自己试试

下拉框

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- defer延迟加载 只有外引才有效果 内嵌是不起效果的 -->
    <script src="js/下拉框.js" defer></script>
    <!-- <script>
        window.onload = function() {
            var aa = document.getElementById("aa")
            console.log(aa)
        }
         //这种适合内嵌 外引 都能用 -->
    </script> 
    <style>
        * {
            padding: 0;
            margin: 0;
            transition: all 0.7s ease;
        }
        
        li {
            list-style: none;
        }
        
        a {
            text-decoration: none;
        }
        
        .container {
            width: 80%;
            margin: 20px auto;
            background: rgb(165, 41, 31);
            display: flex;
            justify-content: space-around;
            position: relative;
        }
        
        .container a {
            background: rgb(165, 41, 31);
            padding: 10px;
            display: block;
            color: #fff;
        }
        
        .container a:hover {
            background: #fff;
            color: rgb(165, 41, 31);
        }
        
        .container ul {
            position: absolute;
            height: 0;
            display: none;
        }
    </style>
</head>

<body>
    <div class="container" id="aa">
        <div class="item">
            <a href="#">学校概况</a>
            <ul>
                <li><a href="#">学校简介</a></li>
                <li><a href="#">学校章程</a></li>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">校园风光</a></li>
            </ul>
        </div>
        <div class="item">
            <a href="#">机构设置</a>
            <ul>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">校园风光</a></li>
            </ul>
        </div>
        <div class="item">
            <a href="#">学科专业</a>
            <ul>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">校园风光</a></li>
                <li><a href="#">校园风光</a></li>
                <li><a href="#">校园风光</a></li>
                <li><a href="#">校园风光</a></li>

            </ul>
        </div>
        <div class="item">
            <a href="#">招生信息</a>
            <ul>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">校园风光</a></li>
            </ul>
        </div>
        <div class="item">
            <a href="#">人才招聘</a>
            <ul>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">校园风光</a></li>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">现任领导</a></li>
            </ul>
        </div>
        <div class="item">
            <a href="#">国际合作</a>
            <ul>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
                <li><a href="#">校园风光</a></li>
                <li><a href="#">历任领导</a></li>
                <li><a href="#">现任领导</a></li>
            </ul>
        </div>
    </div>

</body>

</html>
var items=document.getElementsByClassName("item")
for(var i=0;i<items.length;i++)
{
    items[i].onmouseenter=function()
    {
        this.querySelector("ul").style.display="block"
    }
    items[i].onmouseleave=function()
    {
        this.querySelector("ul").style.display="none"
    }
}

这是一个简便的下拉框 他是瞬间展开的

我们需要给他加上点属性让他缓慢展开 这样更美观

这就需要用到transition这个属性了

举个例子

<style>
.demo{
            width: 200px;
            height:100px;
            background-color: red;
            transition: width 4s ease;
            //指的是点击之后背景的宽度会用四秒变化过去 且这个过程由慢到快
            //可以设宽,颜色,高度,也可以是所有all
        }
        .demo:hover{
            width: 400px;
            height:200px;
            background-color: yellow;
        }
</style>

<body>
    <div class="demo">

    </div>
</body>

注意 transition对display属性不识别 所以并不适用 但可以考虑别的角度 比如高度

让初始所有的高度都为0 鼠标放上去之后高度缓慢变为每个li元素的高度之和就可以实现渐变这个过程

不能直接给定值比如放上去变成200px 拿走变成0

这种是不合理的

因为有的li多有的少 每种情况都不相同

改进之后

.container ul {
            position: absolute;
            height: 0;
            /* display: none; */
            height: 0;
            overflow: hidden;
            /* 防止子元素超出 */
        }
var items=document.getElementsByClassName("item")
for(var i=0;i<items.length;i++)
{
    items[i].onmouseenter=function()
    {   
        var arr=this.querySelectorAll("ul a")
        //找到每个item下所有的a标签 知道数量用以计算高度
        var num=0;
        for(var j=0;j<arr.length;j++)
        {
           num+=arr[j].clientHeight
          //获取a标签总高度 这个高度计算了padding
        }
        this.querySelector("ul").style.height=num+"px"//顺序不能颠倒
    }
    items[i].onmouseleave=function()
    {
        this.querySelector("ul").style.height="0px"
    }
}

另一种方式

鼠标点击之后下拉框展开 点击别处时下拉框收回

这里要用到之前发的事件传播机制

var items=document.getElementsByClassName("item")
for(var i=0;i<items.length;i++)
{
    items[i].onclick=function(e)
    {   
        //阻止事件传播
        这是因为document是所有元素的父级 点击document之后事件进行传播相当于也点了ul这个元素
        //也会让他高度变为0 所以要阻止事件传播 防止点击之后下拉框不展示
        /让事件只在自己这里绑定
        e.stopPropagation()
        var ul=document.querySelectorAll("ul")
        var arr=this.querySelectorAll("ul a")
        for(var k=0;k<ul.length;k++)
        {
          ul[k].style.height="0px"
        }
        //唯独让被点击的ul有高度
        var arr=this.querySelectorAll("ul a")
        //找到每个item下所有的a标签 知道数量用以计算高度
        var num=0;
        for(var j=0;j<arr.length;j++)
        {
           num+=arr[j].clientHeight
          //获取a标签总高度 这个高度计算了padding
        }
        this.querySelector("ul").style.height=num+"px"//顺序不能颠倒
    }
   
}
document.onclick=function()
{
    var ul=document.querySelectorAll("ul")
    for(var k=0;k<ul.length;k++)
    {
        ul[k].style.height="0px"
    }
}

不懂得可以粘一下代码自己看看效果实践一下

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值