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"
}
}
不懂得可以粘一下代码自己看看效果实践一下