supce's blog

CSS学习笔记之导航栏

导航栏结构分析


有的网页导航栏直接将a标签放在div中,比如:百度和网易等。

<div id="nav">
    <a href="#">Home</a>
    <a href="#">About</a>
    <a href="#">Contact</a>
</div>

有的网页导航栏将a标签放在li中,比如搜狐和B站等

<div id="nav">
   <ul>
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Contact</a></li>
  </ul>
</div>

导航经常会有好几级的情况,li可以很好的展现项目级别关系,直接用a无法突出元素之间的关联,同时使用ul+li方式可以增加对搜索引擎的友好度。但在单级导航栏直接用a标签也不是不可以。下面几个简单例子直接使用a标签的方式,利用纯CSS,不引入JavaScript和jQuery。

引入CSS精灵的导航栏

首先用上之前的CSS Sprite。这里引用下别人的图
简单的HTML框架:

<div id="nav">
    <a href="#" class="index">首页</a> 
    <a href="#" class="intro">公司简介</a> 
    <a href="#" class="honor">企业荣誉</a> 
    <a href="#" class="flow">工艺流程</a> 
    <a href="#" class="product">产品展示</a> 
    <a href="#" class="sale">销售网络</a> 
    <a href="#" class="buy">网上订购</a> 
    <a href="#" class="contact">联系我们</a>
</div>

然后是CSS

<style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    #nav{
        width: 800px;
        height: 31px;
        margin: 10px auto;
        padding-left: 21px;
        background: url(images/nav/bg_nav1.png) no-repeat 0 0;
        overflow: hidden;
    }
    #nav a{
        float: left;
        width: 92px;
        height: 31px;
        text-indent: -9999px; /*将文本缩进进行隐藏*/
        text-decoration: none;
        background: url(images/nav/bg_nav1.png) no-repeat 1000px 1000px;
    }
    #nav a:hover {
        position:relative;
        width:120px;
    } 
    #nav a.index:hover {
        margin-left:-10px;
        background-position:-11px -31px;
    }
    #nav a.intro:hover {
        margin-left:-10px;
        background-position:-103px -62px;
    } 
    #nav a.honor:hover {
        margin-left:-10px;
        background-position:-195px -93px;
    } 
    #nav a.flow:hover {
        margin-left:-10px;
        background-position:-287px -124px;
    } 
    #nav a.product:hover {
        margin-left:-10px;
        background-position:-379px -155px;
    } 
    #nav a.sale:hover {
        margin-left:-10px;
        background-position:-471px -186px;
    } 
    #nav a.buy:hover {
        margin-left:-10px;
        background-position:-563px -217px;
    } 
    #nav a.contact:hover {
        margin-left:-10px;
        background-position:-655px -248px;
    } 

刷新下页面,效果还是不错的:

引入绝对定位的导航栏

在上一个例子中,锚点a设置为浮动的,在a的边缘处可能会指向相邻的a锚点,这时候可以尝试使用绝对定位的方式,使每个a锚点准确“空降”到指定位置,从而避免这个问题。保持HTML结构不变,对CSS稍加修改即可。

<style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    #nav{
        position: relative;
        width: 800px;
        height: 31px;
        margin: 10px auto;
        padding-left: 21px;
        background: url(images/nav/bg_nav1.png) no-repeat 0 0;
        overflow: hidden;
    }
    #nav a{
        position: absolute;
        top: 0;
        width: 92px;
        height: 31px;
        text-indent: -9999px; /*将文本缩进进行隐藏*/
        text-decoration: none;
        background: url(images/nav/bg_nav1.png) no-repeat 1000px 1000px;
    }
    #nav a:hover {
        width:120px;
    } 
    #nav div a.index {
        left:21px;    
    }
    #nav a.index:hover {
        margin-left:-10px;
        background-position:-11px -31px;
    }
    #nav a.intro {
        left:113px;    /*21+92*/
    }
    #nav a.intro:hover {
        margin-left:-10px;
        background-position:-103px -62px;
    } 
    #nav a.honor {
        left:205px; 
    }
    #nav a.honor:hover {
        margin-left:-10px;
        background-position:-195px -93px;
    } 
    #nav a.flow {
        left:297px; 
    }
    #nav a.flow:hover {
        margin-left:-10px;
        background-position:-287px -124px;
    } 
    #nav a.product {
        left:389px; 
    }
    #nav a.product:hover {
        margin-left:-10px;
        background-position:-379px -155px;
    } 
    #nav a.sale {
        left:481px; 
    }
    #nav a.sale:hover {
        margin-left:-10px;
        background-position:-471px -186px;
    } 
    #nav a.buy {
        left:573px; 
    }
    #nav a.buy:hover {
        margin-left:-10px;
        background-position:-563px -217px;
    } 
    #nav a.contact {
        left:665px; 
    }
    #nav a.contact:hover {
        margin-left:-10px;
        background-position:-655px -248px;
    } 
</style>

效果跟刚才是一个的,好麻烦的说,感觉还是用JS与JQuery比较好。这种纯CSS就当练手了

涉及层叠的导航栏

有一些导航栏具有层叠的效果,因为这里用了层叠,所以把a标签放在li中比直接使用a更好控制。上次B站登录页在关于图片和文字的部分使用了层叠属性。
关于CSS的层叠级别介绍以后会专门写一篇来介绍
先是HTML

<div id="nav">
    <ul>
        <li><a href="#">导航1</a></li>
        <li><a href="#">导航2</a></li>
        <li><a href="#">导航3</a></li>
        <li><a href="#">导航4</a></li>
        <li><a href="#">导航5</a></li>
        <li><a href="#">导航6</a></li>
        <li><a href="#">导航7</a></li>
        <li><a href="#">导航8</a></li>
    </ul>
</div>

为我们的HTML框架添加样式

<style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    #nav {
        width: 700px;
        margin: 10px auto;
    }
    ul{
        height: 25px;
        list-style: none;
    }
    a{
        text-decoration: none;
    }
    #nav li{
        float: left;

        height: 25px;
        margin: 0 -7px; /*利用负边距产生层叠属性*/
        text-align: center;
    }
    #nav a {
        float: left; 
        width: 86px;
        height: 25px;
        line-height: 25px;
        color: #FFFFFF;
        background: url(images/nav/btn2.gif) center center no-repeat;
    }
    #nav a:hover {
        position: relative; /*设置容器为相对定位,是元素获得层叠属性*/
        z-index: 99; /* 提升锚点a标签的层叠级别 */
        color: #000000;
        background: url(images/nav/btn1.gif) 0 0 no-repeat; 
    }

对于包含有position:relative/position:absolute的定位元素,当其z-index值不是auto的时候,会创建层叠上下文。

刷新下页面效果如下:

零零碎碎的时间凑出来真是不容易 时间真是越来越不够用了 咕~~(╯﹏╰)b