问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用CSS如何做导航条?

发布网友 发布时间:2022-04-28 12:36

我来回答

3个回答

懂视网 时间:2022-04-28 16:58

本文给大家介绍如何使用纯CSS制作特效导航条,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

先上张图,看看效果:

在继续阅读下文之前,你可以先缓一缓。尝试思考一下上面的效果或者动手尝试一下,不借助 JS ,能否巧妙的实现上述效果。

OK,继续。这个效果是我在业务开发的过程中遇到的一个类似的小问题。其实即便让我借助 Javascript ,我的第一反应也是,感觉很麻烦啊。所以我一直在想,有没有可能只使用 CSS 完成这个效果呢?

定义需求

我们定义一下简单的规则,要求如下:

<ul>
 <li>不可思议的CSS</li>
 <li>导航栏</li>
 <li>光标小下划线跟随</li>
 <li>PURE CSS</li>
 <li>Nav Underline</li>
</ul>
  • 导航栏目的 li 的宽度是不固定的

  • 当从导航的左侧 li 移向右侧 li,下划线从左往右移动。同理,当从导航的右侧 li 移向左侧 li,下划线从右往左移动。

  • 实现需求

    第一眼看到这个效果,感觉这个跟随动画,仅靠 CSS 是不可能完成的。 如果想只用 CSS 实现,只能另辟蹊径,使用一些讨巧的方法。 好,下面就借助一些奇技淫巧,使用 CSS 一步一步完成这个效果。分析一下难点:

    宽度不固定

    第一个难点, li 的宽度是不固定的。所以,我们可能需要从 li 本身的宽度上做文章。 既然每个 li 的宽度不一定,那么它对应的下划线的长度,肯定是是要和他本身相适应的。自然而然,我们就会想到使用它的 border-bottom 。

    li { border-bottom: 2px solid #000;}

    那么,可能现在是这样子的(li 之间是相连在一起的,li 间的间隙使用 padding 产生):

    当然,这里一开始都是没有下划线的,所以我们可能需要把他们给隐藏起来。

    li { border-bottom: 0px solid #000;}

    推翻重来,借助伪元素

    这样好像不行,因为隐藏之后,hover li 的时候,需要下划线动画,而 li 本身肯定是不能移动的。所以,我们考虑借助伪元素。将下划线作用到每个 li 的伪元素之上。

    li::before {
     content: "";
     position: absolute;
     top: 0;
     left: 0;
     width: 100%;
     height: 100%;
     border-bottom: 2px solid #000;
    }

    下面考虑第一步的动画,hover 的时候,下划线要从一侧运动展开。所以,我们利用绝对定位,将 li 的伪元素的宽度设置为0,在 hover 的时候,宽度从 width: 0 -> width: 100%,CSS 如下:

    li::before {
     content: "";
     position: absolute;
     top: 0;
     left: 0;
     width: 0;
     height: 100%;
     border-bottom: 2px solid #000;
    }
    li:hover::before {
     width: 100%;
    }

    得到,如下效果:

    左移左出,右移右出

    OK,感觉离成功近了一步。现在还剩下一个最难的问题:

    如何让线条跟随光标的移动动作,实现当从导航的左侧 li 移向右侧 li,下划线从左往右移动。同理,当从导航的右侧 li 移向左侧 li,下划线从右往左移动。

    我们仔细看看,现在的效果:

    当从第一个 li 切换到第二个 li 的时候,第一个 li 下划线收回的方向不正确。所以,可以能我们需要将下划线的初始位置位移一下,设置为 left: 100%,这样每次下划线收回的时候,第一个 li 就正确了:

    li::before {
     content: "";
     position: absolute;
     top: 0;
     left: 100%;
     width: 0;
     height: 100%;
     border-bottom: 2px solid #000;
    }
    li:hover::before {
     left: 0;
     width: 100%;
    }

    看看效果:

    额,仔细对比两张图,第二种效果其实是捡了芝麻丢了西瓜。第一个 li 的方向是正确了,但是第二个 li 下划线的移动方向又错误了。

    神奇的 ~ 选择符

    所以,我们迫切需要一种方法,能够不改变当前 hover 的 li 的下划线移动方式却能改变它下一个 li 的下划线的移动方式(好绕口)。

    没错了,这里我们可以借助 ~ 选择符,完成这个艰难的使命,也是这个例子中,最最重要的一环。

    对于当前 hover 的 li ,其对应伪元素的下划线的定位是 left: 100%,而对于 li:hover ~ li::before,它们的定位是 left: 0。CSS 代码大致如下:

    li::before {
     content: "";
     position: absolute;
     top: 0;
     left: 100%;
     width: 0;
     height: 100%;
     border-bottom: 2px solid #000;
     transition: 0.2s all linear;
    }
    li:hover::before {
     width: 100%;
     left: 0;
    }
    li:hover ~ li::before {
     left: 0;
    }

    至此,我们想要的效果就实现拉!撒花。看看:

    效果不错,就是有点僵硬,我们可以适当改变缓动函数以及加上一个动画延迟,就可以实现上述开头里的那个效果了。当然,这些都是锦上添花的点缀。(以上非原创,转自网络)

    完整代码实例如下:

    <!DOCTYPE html>
    <html>
     <head>
     <meta charset="UTF-8">
     <title></title>
     </head>
     <style>
     *{margin:0;padding:0;}
     a{text-decoration:none;color:#000;}
     ul{margin-top:100px;}
     li{float:left;list-style:none;padding:0 20px;cursor:pointer;position:relative;}
     li::before {
      content: "";
      position: absolute;
      top: 0;
      left: 100%;
      width: 0;
      height: 100%;
      border-bottom: 2px solid #4C7C9C;
      transition: 0.2s all linear;
      z-index:-1;
     }
     li:hover::before {
      width: 100%;
      left: 0;
     }
     li:hover ~ li::before {
      left: 0;
     } 
     </style>
     <body>
     <ul>
      <li><a href="http://www.baidu.com">11111</a></li>
      <li><a href="http://www.taobao.com">22222</a></li>
      <li><a href="http://www.sina.com">33333</a></li>
      <li><a href="http://www.jd.com">44444</a></li>
      <li><a href="http://www.360.com">55555</a></li>
     </ul>
     </body>
    </html>

    实际项目中若li里面有a标签出现不能点击的情况,注意检查伪类和li的层级关系,设置好各自z-index值。

    总结:

    热心网友 时间:2022-04-28 14:06

    单独的css是无法完成导航条的,需要结合html,一般导航条的制作都是通过一个div包裹着ul,使用li来排列完成导航条的html部分,css中,我们需要给这个div宽高,还需要设置好li的宽,高,还有一个float属性,这样基本上导航条就制作完成,请看代码:
    <html>
    <head>
    <style>
    #div1{
    width:600px;
    height:40px;
    font-size:13px;
    }
    #div1 ul li{
    list-style:none;
    width:50px; //具体的高宽需要根据实际要求
    height:30px;
    }

    </head>
    <body>
    <div id='div1'>
    <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>
    </ul>
    </div>
    </body>
    </html>

    热心网友 时间:2022-04-28 15:24

    你会插入table吧!先插入一个1行13列的table!
    <table align="center" cellpadding="0" cellspacing="0" >
    <tr>
    <td>内容</td>
    <td>竖线</td>
    <td>内容</td>
    <td>竖线</td>
    <td>内容</td>
    <td>竖线</td>
    <td>内容</td>
    <td>竖线</td>
    <td>内容</td>
    <td>竖线</td>
    <td>内容</td>
    <td>竖线</td>
    <td>内容</td>
    </tr>
    </table>
    然后在内容上写上你的菜单,竖线上写上你的竖线!内容上的超链接就定义好超链接颜色!
    例如:a{ text-decoration:none; color:#000000;}
    a:hover{ text-decoration:underline; color:#FF0000;}
    至于每个菜单之间的距离,你在td上面定义,如果定义线颜色,也可以在td上面定义!高度用height,颜色如果在样式上写就color,直接写就用font-color吧!
    PS:你补习下Html的基本知识吧,很多东西很难说!制作就用dreamweaver吧,容易上手
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    如何理解“时间就是空间,空间就是时间”? 办公室副主任竞聘演讲稿范文 学校办公室主任竞聘演讲稿范文 最新办公室主任竞聘演讲稿 办公室主任竞聘演讲稿优秀范文 ...堆墨现象,墨线 接地和粘度都正常,请问应如何解决 ...都正常了开始喷印结果喷一条墨线好恐怖怎么解决呀各位老师 威力喷码机 求一份学生会演讲词 大学学生会个人优秀演讲稿 手机内录? 有个谜语 各位猜猜 有个谜语谁能帮解一下? 来几个谜语 有答案 根据李克特5级评分法设计出来的问卷结果可以用效度分析吗? 如果想进行排序的话,等级排列法和李克特量表在功能上有什么区别呢? 哪里有达赛莱克特草莓苗 急~!30分!李克特5级量表法制作的薪酬满意度调查问卷,用SPSS录入数据后,怎样得出方差、标准差、均值? 李克特量表和语义差异量表有什么区别 有谁知道记忆宫殿的一些资料?(书或什么的内容等)急急急……帮帮忙~~ 求关于记忆力训练的资源,有记忆宫殿的更好~~~谢谢 李克特五分量表可以有不了解这一项吗 读心神探里记忆宫殿是哪种书 沉默的羔羊讲的是什么故事?怎么看不懂? 莱克特5点量表除了加法,还可以怎样计算? 汉尼拔的结局是什么? 想要跑步效果事半功倍,有什么新奇跑步法? 腌制的萝卜发粘了还能吃吗 为什么腌萝卜放了两天就会变酸?是在坛中放着也一样,有什么办法可以不让... 腌的咸菜盐放少变酸了,还能吃吗 装修完保洁费用通常是多少 家政保洁怎么收费标准?厨房、卫生间收费标准? 家庭保洁的费用是怎么收的呢?居住面积还是建筑面积? 请家政人员打扫卫生怎么计费? 添加本行同名借记卡是什么意思 本地同名借记卡是不是同一家银行的同一家支行? 我在工行有两张同名借记卡卡,其中一张卡里的理财能够从一个卡转移到 怎样才算同名卡? 现在听音乐怎么还收费? 银行卡同名进出什么意思 游戏王中什么是同名卡?必须名字全部一样吗? 重名银行卡能办理吗 有借记卡为什么借款还显示需要一张工行柜面办理的记借卡? 现在网上听歌都要付费了,那点歌机怎么进歌的? 融e借提示:您没有满足条件的电子银行注册借记卡,是什么意思啊,要怎么弄,在线急等!!! 灵活金借记卡不是本人名下的储蓄卡行吗? - 信息提示 现在听歌、看剧都要花钱买,这是营销手段还是保护版权? 如何查同名的银行卡 有人说保险是骗人的,可我买了几份保险,每年交十几万元,有没有风险!