漂亮的左侧二级导航菜单(伸缩式)【演示/源码下载】
本文介绍一个伸缩式的左侧二级导航菜单设计。默认显示一级菜单,点击菜单时显示其子菜单。
demodownload
本菜单使用了CSS3+jQuery来实现。
HTML
<div class="sidebar-menu">
<input type="checkbox" name="menu-first-group" id="menu-first-group">
<ul class="menu-first">
<label for="menu-first-1" id="menu-first-1-label"><img src="1.png">一级菜单1</label>
<label for="menu-first-2" id="menu-first-2-label"><img src="2.png">一级菜单2</label>
<label for="menu-first-3" id="menu-first-3-label"><img src="3.png">一级菜单3</label>
<label for="menu-first-4" id="menu-first-4-label"><img src="4.png">一级菜单4</label>
<label for="menu-first-5" id="menu-first-5-label"><img src="5.png">一级菜单5</label>
</ul>
<div class="menu-second">
<input type="checkbox" name="menu-first" id="menu-first-1" />
<ul>
<li class="menu-second-item"><a>子菜单1.1</a></li>
<li class="menu-second-item"><a>子菜单1.2</a></li>
</ul>
<input type="checkbox" name="menu-first" id="menu-first-2" />
<ul>
<li class="menu-second-item"><a>子菜单2.1</a></li>
<li class="menu-second-item"><a>子菜单2.2</a></li>
<li class="menu-second-item"><a>子菜单2.3</a></li>
<li class="menu-second-item"><a>子菜单2.4</a></li>
</ul>
<input type="checkbox" name="menu-first" id="menu-first-3" />
<ul>
<li class="menu-second-item"><a>子菜单3.1</a></li>
<li class="menu-second-item"><a>子菜单3.2</a></li>
</ul>
<input type="checkbox" name="menu-first" id="menu-first-4" />
<ul>
<li class="menu-second-item"><a>子菜单4.1</a></li>
<li class="menu-second-item"><a>子菜单4.2</a></li>
<li class="menu-second-item"><a>子菜单4.3</a></li>
<li class="menu-second-item"><a>子菜单4.4</a></li>
<li class="menu-second-item"><a>子菜单4.5</a></li>
<li class="menu-second-item"><a>子菜单4.6</a></li>
</ul>
<input type="checkbox" name="menu-first" id="menu-first-5" />
<ul>
<li class="menu-second-item"><a>子菜单5.1</a></li>
<li class="menu-second-item"><a>子菜单5.2</a></li>
<li class="menu-second-item"><a>子菜单5.3</a></li>
</ul>
</div>
</div>
菜单盒子(导航区域)是一个DIV
,其class值是sidebar-menu
。
你会发现有很多个INPUT
标签type=checkbox
的复选框,这是显示一级或其子菜单的判断标识。你还会发现每个INPUT
标签后面都跟着一个UL
容器,UL
容器装的是一级菜单或子菜单内容。INPUT
标签永远都是不可见的,其CSS属性display:none
,它的作用是,当INPUT
标签的checked
属性为true
时,紧跟其后的UL
容器便显示出来,而其他的UL
容器便隐藏起来,而显示或隐藏是通过点击菜单来触发,通过Javascript编程来实现。
class值为menu-first
的UL容器是一级菜单,class值是menu-second
的UL
容器是二级菜单。
一级菜单label
标签的for属性值比如menu-first-1
,对应二级菜单中INPUT
标签的id值,通过该id
值来关联父子菜单。二级菜单里的INPUT
标签,name属性值都是menu-first
。li
列表标签的class值都是menu-second-item
。
如何新增或减少菜单项目
二级菜单项的新增或减少非常简单,在实例HTML代码里自己想要的位置新增或减少一个li
标签即可。
一级菜单的项目标签是label
,所以要减少一个一级菜单项目很简单,直接在实例HTML代码里删除一个label
标签即可。
如果想新增一个一级菜单项目,你需要在合适的位置添加几行HTML代码。
1、添加一个label
标签,这是一级菜单。
<label for=”menu-first-1″ id=”menu-first-1-label”><img src=”1.png”>一级菜单1</label>
<label for=”menu-first-2″ id=”menu-first-2-label”><img src=”2.png”>一级菜单2</label>
<label for=”menu-first-3″ id=”menu-first-3-label”><img src=”3.png”>一级菜单3</label>
<label for=”menu-first-4″ id=”menu-first-4-label”><img src=”4.png”>一级菜单4</label>
<label for=”menu-first-5″ id=”menu-first-5-label”><img src=”5.png”>一级菜单5</label>
<!– 下面一行为新增行,注意数字要递增,这里是6 //–>
<label for=”menu-first-6″ id=”menu-first-6-label”><img src=”6.png”>一级菜单6</label>
2、添加一个二级菜单INPUT
标签和UL
标签,这是其子菜单。
<input type=”checkbox” name=”menu-first” id=”menu-first-5″ />
<ul>
<li class=”menu-second-item”><a>子菜单5.1</a></li>
<li class=”menu-second-item”><a>子菜单5.2</a></li>
<li class=”menu-second-item”><a>子菜单5.3</a></li>
</ul>
<!– 新增下面代码,注意input的id值要跟新增的一级菜单的for属性值一致 //–>
<input type=”checkbox” name=”menu-first” id=”menu-first-6″ />
<ul>
<li class=”menu-second-item”><a>子菜单6.1</a></li>
<li class=”menu-second-item”><a>子菜单6.2</a></li>
</ul>
3、新增CSS代码
/*二级菜单项延迟翻转*/
.menu-second > input:checked + ul > li:nth-child(1) {
-webkit-transition-delay: 0ms;
-moz-transition-delay: 0ms;
-ms-transition-delay: 0ms;
-o-transition-delay: 0ms;
transition-delay: 0ms;
}
… …
… …
… …
.menu-second > input:checked + ul > li:nth-child(5) {
-webkit-transition-delay: 400ms;
-moz-transition-delay: 400ms;
-ms-transition-delay: 400ms;
-o-transition-delay: 400ms;
transition-delay: 400ms;
}
<!–
新增如下代码,注意数字的递增,
这里是nth-child(6), delay值是500ms
//–>
.menu-second > input:checked + ul > li:nth-child(6) {
-webkit-transition-delay: 500ms;
-moz-transition-delay: 500ms;
-ms-transition-delay: 500ms;
-o-transition-delay: 500ms;
transition-delay: 500ms;
}
通过以上三处改动,便可新增了一个一级菜单项了。
CSS
/*菜单导航区域*/
.sidebar-menu{
width: 200px;
height: 400px;
display: inline-block;
vertical-align: top;
}
.sidebar-menu input{
display: none;
}
/*一级菜单组*/
.menu-first{
width: 100%;
height: 100%;
background-color: #ddd;
float: left;
transition:width 0.6s;
-moz-transition:width 0.6s;
-webkit-transition:width 0.6s;
-o-transition:width 0.6s;
}
.menu-first img{
width: 40px;
height: 40px;
vertical-align: middle;
}
.menu-first > label{
color: #000;
background-color: #ddd;
border-bottom: 1px solid #bbb;
height:50px;
line-height:50px;
text-align: center;
cursor: pointer;
display: block;
overflow: hidden;
transition:background-color 0.6s;
-moz-transition:background-color 0.6s;
-webkit-transition:background-color 0.6s;
-o-transition:background-color 0.6s;
-ms-transition:background-color 0.6s;
}
.menu-first > label:hover{
background-color: #bbb;
}
.menu-first-selected{
background-color: #bbb !important;
}
/*一级菜单组缩进*/
#menu-first-group:checked + ul{
width: 25%;
}
/*二级菜单区域*/
.menu-second{
vertical-align: top;
height: 100%;
background-color: #bbb;
overflow: hidden;
}
/*二级菜单组*/
.menu-second > ul{
-webkit-perspective: 300px;
-moz-perspective: 300px;
-ms-perspective: 300px;
-o-perspective: 300px;
perspective: 300px;
}
/*二级菜单项*/
.menu-second > ul > li{
height: 0px;
opacity: 0;
overflow: hidden;
transform: rotateY(180deg);
-moz-transform: rotateY(180deg);
-webkit-transform: rotateY(180deg);
-o-transform: rotateY(180deg);
-ms-transform: rotateY(180deg);
transition:opacity 1s,height 1s,transform ease-in-out 0.3s;
-moz-transition:opacity 1s,height 1s,-moz-transform ease-in-out 0.3s;
-webkit-transition:opacity 1s,height 1s,-webkit-transform ease-in-out 0.3s;
-o-transition:opacity 1s,height 1s,-o-transform ease-in-out 0.3s;
-ms-transition:opacity 1s,-ms-transform ease-in-out 0.3s;
}
.menu-second > input:checked + ul > li{
height: 50px;
opacity: 1;
transform: rotateY(0deg);
-moz-transform: rotateY(0deg);
-webkit-transform: rotateY(0deg);
-o-transform: rotateY(0deg);
-ms-transform: rotateY(0deg);
}
/*二级菜单项*/
.menu-second-item > a{
color: #000;
height:50px;
line-height:50px;
border-left: 0px solid #bbb;
border-right: 0px solid #00cc66;
background:-webkit-gradient(linear, 0% 0%, 100% 0%,from(#bbb), to(#00cc66));
background:-moz-linear-gradient(left,#bbb,#00cc66);
background:-ms-linear-gradient(left, #bbb,#00cc66);
background: -o-linear-gradient(left, #bbb,#00cc66);
font-size: 12px;
text-align:center;
display: block;
transition:border 0.5s;
-moz-transition:border 0.5s;
-webkit-transition:border 0.5s;
-o-transition:border 0.5s;
-ms-transition:border 0.5s;
}
.menu-second-item > a:hover{
animation: hover-color 2s infinite;
}
@keyframes hover-color {
0% {
background:-webkit-gradient(linear, 0% 0%, 100% 0%,from(#bbb), to(#00cc00));
background:-moz-linear-gradient(left,#bbb,#00cc00);
background:-ms-linear-gradient(left, #bbb,#00cc00);
background: -o-linear-gradient(left, #bbb,#00cc00);
}
50% {
background:-webkit-gradient(linear, 0% 0%, 100% 0%,from(#bbb), to(#00cc99));
background:-moz-linear-gradient(left,#bbb,#00cc99);
background:-ms-linear-gradient(left, #bbb,#00cc99);
background: -o-linear-gradient(left, #bbb,#00cc99);
}
100% {
background:-webkit-gradient(linear, 0% 0%, 100% 0%,from(#bbb), to(#00cc00));
background:-moz-linear-gradient(left,#bbb,#00cc00);
background:-ms-linear-gradient(left, #bbb,#00cc00);
background: -o-linear-gradient(left, #bbb,#00cc00);
}
}
/*二级菜单项延迟翻转*/
.menu-second > input:checked + ul > li:nth-child(1) {
-webkit-transition-delay: 0ms;
-moz-transition-delay: 0ms;
-ms-transition-delay: 0ms;
-o-transition-delay: 0ms;
transition-delay: 0ms;
}
.menu-second > input:checked + ul > li:nth-child(2) {
-webkit-transition-delay: 100ms;
-moz-transition-delay: 100ms;
-ms-transition-delay: 100ms;
-o-transition-delay: 100ms;
transition-delay: 100ms;
}
.menu-second > input:checked + ul > li:nth-child(3) {
-webkit-transition-delay: 200ms;
-moz-transition-delay: 200ms;
-ms-transition-delay: 200ms;
-o-transition-delay: 200ms;
transition-delay: 200ms;
}
.menu-second > input:checked + ul > li:nth-child(4) {
-webkit-transition-delay: 300ms;
-moz-transition-delay: 300ms;
-ms-transition-delay: 300ms;
-o-transition-delay: 300ms;
transition-delay: 300ms;
}
.menu-second > input:checked + ul > li:nth-child(5) {
-webkit-transition-delay: 400ms;
-moz-transition-delay: 400ms;
-ms-transition-delay: 400ms;
-o-transition-delay: 400ms;
transition-delay: 400ms;
}
.menu-second > input:checked + ul > li:nth-child(6) {
-webkit-transition-delay: 500ms;
-moz-transition-delay: 500ms;
-ms-transition-delay: 500ms;
-o-transition-delay: 500ms;
transition-delay: 500ms;
}
.sidebar-menu{}
是菜单导航区域,设置区域的高和宽。
.menu-first{}
是一级菜单组,设置一级菜单组高、宽、背景颜色等属性。.menu-first img{}
是设置一级菜单的图片css属性(高、宽等)。
#menu-first-group:checked + ul{}
设置一级菜单组缩进的样式(宽度)。
.menu-second{}
是设置二级菜单区域样式(高度:100%、背景颜色等)。
.menu-second > ul{}
是设置二级菜单组样式,这里设置了perspective
属性值。
perspective
属性定义 3D 元素距视图的距离,以像素计。该属性允许您改变 3D 元素查看 3D 元素的视图。
当为元素定义perspective
属性时,其子元素会获得透视效果,而不是元素本身。
注释:perspective
属性只影响 3D 转换元素。
.menu-second > ul > li{}
是设置二级菜单项的样式。这里我们可以试一试改变transform
和transition
的属性值,使用自己喜欢的过渡效果。
transform
属性向元素应用 2D 或 3D 转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜。
transition
用于设置四个过渡属性:transition-property
transition-duration
transition-timing-function
transition-delay
注释:请始终设置transition-duration
属性,否则时长为 0,就不会产生过渡效果。
Javascript
本实例用到少量的jQuery代码。
在编写jQuery程序前,需要引用jQuery库文件。
<script src="jquery-3.2.1.min.js"></script>
$("input:checkbox[name=menu-first]").click(function() {});
$("input:checkbox[name=menu-first]").change(function()
{
var flag = $(this).prop("checked");
$("input:checkbox[name=menu-first]").prop("checked", false);
$("#menu-first-group").prop("checked", flag);
$(this).prop("checked", flag);
if (!flag)
{
$(".menu-first label").removeClass("menu-first-selected");
}
});
$(".menu-first label").click(function()
{
$(".menu-first label").removeClass("menu-first-selected");
$(this).addClass("menu-first-selected");
});
$(window).load(function()
{
$("input:checkbox[name=menu-first]").prop("checked", false);
$("#menu-first-group").prop("checked", true);
$("#menu-first-2").prop("checked", true);
$("#menu-first-2-label").addClass("menu-first-selected");
});
$(window).load(function(){...}
设置菜单初始状态。
前面对HTML代码的解释中,说到INPUT
复选框checked
属性值(true
或false
)是显示一级或子菜单的判断标识。
$("input:checkbox[name=menu-first]").prop("checked", false);
设置子菜单关联的INPUT
复选框checked
属性为false
,意思是隐藏所有子菜单。
$("#menu-first-group").prop("checked", true);
设置一级菜单关联的INPUT
复选框checked
属性为true
,意思是默认显示一级菜单。
您可能对以下文章也感兴趣
- 一款常见的简单大方又实用的移动网页(二级)菜单设计
- 3款有下横线平滑过渡效果的导航栏菜单
- 非常漂亮的响应式导航栏设计
- 简单实用的响应式导航菜单设计
- CSS3实现的可缩进的侧栏导航菜单
- 漂亮的纯CSS3水平导航菜单(有过渡动画效果)
- 可以展开和闭合子菜单的CSS3垂直导航菜单
- 又一个随内容滚动而变化的侧边/左侧目录导航
- 侧边/左侧目录导航随内容滚动而变化
- 纯CSS:非常漂亮的左侧导航/内容目录导航
- 简单却实用的CSS水平和垂直导航栏【演示/源码】
- CSS3+JQuery实现的三级下拉导航菜单