以前学前端的时候都没教CSS3,而因为主要方向是后端,所以一直没有关注CSS3的内容
曾经实现的菜单折叠,是使用了JS来实现的.最近复习前端,直接使用CSS3,无JS的方式实现一个菜单折叠.
记录一下大概思路和提醒不能停下学习.
先是介绍思路点
- 折叠可以想象成开关,而开关就能想到
CheckBox
- css存在
:checked
选择器,这个可以设置CheckBox
选中时的效果 - 因为
transition
不能直接从0
高度变成auto
,但可以用max-w/h
来代替
↓可以点击尝试,点击文字和选中框都能触发
!!!
!!!
我这边有一个已有的下拉折叠Demo代码,更多的样式是为了看上去好看,核心依然是选中框+for
+:checked
css的'+'是相邻兄弟选择器,这里是为了css能选择 选中框 后面的文字
Html代码:
<div className="MenuBody">
<ul className="MenuBox">
<hr/>
<input type="checkbox" name="" id="MenuCheckBox1" />
<label htmlFor="MenuCheckBox1" className="MenuName">菜单二</label>
<div className="MenuList">
<li className="MenuItem">子菜单</li>
<li className="MenuItem">子菜单</li>
<li className="MenuItem">子菜单</li>
</div>
</ul>
<ul className="MenuBox">
<hr/>
<input type="checkbox" id="MenuCheckBox2" />
<label htmlFor="MenuCheckBox2" className="MenuName">菜单二</label>
<div className="MenuList">
<li className="MenuItem">子菜单</li>
<li className="MenuItem">子菜单</li>
<li className="MenuItem">子菜单</li>
</div>
</ul>
</div>
CSS代码:
.MenuBody{
width:13em;
background-color: rgb(243, 243, 243);
height: 100%;
border-right: rgb(168, 168, 168) solid 1px;
cursor:default;
box-sizing:border-box
}
.MenuBox{
display: flex;
flex-direction: column;
}
.MenuName{
margin: 0em;
padding: .6em;
padding-left: 2em;
transition:all 0.5s;
}
.MenuName:hover{
background-color: rgb(199, 199, 199);
padding-left: 2.3em;
transition:all 0.5s ;
}
.MenuName::after{
content: '';
width: 0;
height: 0;
border-top: 7px solid transparent;
border-bottom: 7px solid transparent;
border-left: 7px solid rgb(109, 109, 109);
position: absolute;
margin-left: 6em;
margin-top: .5em;
transform: rotate(0deg);
transition:margin-left 0.5s,transform 0.2s ;
}
.MenuName:hover::after{
margin-left: 5.7em;
}
.MenuBox input{
display: none;
}
.MenuBox hr{
border: none;
height: 1px;
}
.MenuList{
max-height: 0;
overflow: hidden;
transition:all 0.5s ;
}
input:checked + .MenuName {
background-color: rgb(211, 222, 224);
}
input:checked + .MenuName::after {
transform: rotate(90deg);
}
input:checked ~ .MenuList {
max-height: 20em;
background-color: rgb(217, 225, 228);
transition:all 0.5s ease-in;
}
input:checked ~ .MenuList .MenuItem{
padding:7px 0 7px 40px;
transition-delay: 0s;
}
.MenuItem{
font-size: 1em;
margin: 0px 0;
padding:7px 0 7px 25px;
transition:all 0.5s;
transition-delay: 0.5s;
}
.MenuItem:hover{
background-color: rgb(199, 199, 199);
}
Q.E.D.