文章目录

  • 一级基本导航栏
    • 怎么显示?导航栏 = 链接列表
    • 垂直导航栏
    • 水平导航栏
  • 二级导航栏
    • 垂直二级
    • 水平二级
    • 动画效果
    • 考虑导航栏位置和导航栏下方内容位置
  • 行内元素和块级元素的具体区别是什么?inline-block是什么?
    • 行内元素与块级元素的区别
      • block
      • inline
      • inline-block
      • 其他不同
    • 行内元素和块级元素转换
    • inline-block
  • 举个例子

一级基本导航栏

怎么显示?导航栏 = 链接列表

  1. 导航栏需要标准的 HTML 作为基础。在我们的例子中,将用标准的 HTML 列表来构建导航栏。导航栏基本上是一个链接列表,因此使用 ul 和 li 元素是非常合适的:

    <div id="nav"><ul class="firstNav"><li><a href="#">一级菜单1</a></li><li><a href="#">一级菜单2</a></li><li><a href="#">一级菜单3</a></li></ul>
    </div>
    

    以上是标准的导航栏代码。

  2. 去掉list-style-type,去掉默认的项目符号和外边距、内边距:
       ul {list-style-type: none;padding: 0;margin: 0;}
    

垂直导航栏

  • display: block:把链接显示为块元素可使整个链接区域可点击(不仅仅是文本),同时也允许我们规定宽度。行内元素无法设置物理width。inline-block、block、inline分析
  • width: 140px:块元素默认占用全部可用宽度。我们需要规定 140 像素的宽度。
  • line-height:可以用来实现垂直居中效果,水平居中用text-align: center
  • 锚点设置而不是li设置,由此提供更好的浏览器兼容性
<!DOCTYPE html>
<html>
<head><title>导航栏</title><style type="text/css">ul {list-style-type: none;padding: 0;margin: 0;}#nav>ul>li {text-align: center;}a {display: block;  /*垂直排列,且点击区域为方块*/width: 100px;   /*block可设置width*/line-height: 40px; /*获得垂直居中效果*/text-decoration: none;color: white;background-color: black;border: 1px solid white;}</style>
</head>
<body><div id="nav"><ul class="firstNav"><li><a href="#">一级菜单1</a></li><li><a href="#">一级菜单2</a></li><li><a href="#">一级菜单3</a></li></ul></div>
</body>
</html>

水平导航栏

两种方法:行内元素(inline-block)和浮动(float)

  1. 行内元素

        #nav>ul>li {text-align: center;display: inline-block;}
    


    li默认是块内元素,前后有换行,设置成inline-block后,同时具有inline同行水平排列和block可以设置width等属性的特点。
    不足:会有间隔,因为原本的block元素前后有换行,使用inline-block之后,元素之间会有间隔。如何解决看inline-block、block、inline分析

  2. 浮动

       #nav>ul>li {text-align: center;float: left;}
    

  • float:left - 使用 float 来把块元素滑向彼此。
    可以发现,元素之间的间隔仅为设置的border的1px间隔,也就是浮动元素之间是紧挨着的,这点与inline-block区分开。
    不足:float会有副作用,需要设置clear:both清除浮动带来的可能的坍塌后果。

二级导航栏

垂直二级

css:

ul {list-style-type: none;padding: 0;margin: 0;}#nav>ul>li {text-align: center;float: left;/*display: inline-block;*/}a {display: block;   /*垂直排列,且点击区域为方块*/width: 100px;   /*block可设置width*/line-height: 40px; /*获得垂直居中效果*/text-decoration: none;color: rgb(133, 119, 114);background-color: rgb(237, 237, 237);/*border: 1px solid white;*/}.firstNav::after {content: '';clear: both;display: block;}.secondNav a {background-color: rgb(237, 237, 237);border-bottom: 1px solid white;}.secondNav {display: none;}.firstNav>li:hover >a{background-color: rgb(101, 101, 101);color: white;}.firstNav>li:hover .secondNav {display: block;}

结构:

<div id="nav"><ul class="firstNav"><li><a href="#">一级菜单1</a><ul class="secondNav"><li><a href="#">二级菜单1.1</a></li><li><a href="#">二级菜单1.2</a></li><li><a href="#">二级菜单1.3</a></li></ul></li><li><a href="#">一级菜单2</a><ul class="secondNav"><li><a href="#">二级菜单2.1</a></li><li><a href="#">二级菜单2.2</a></li><li><a href="#">二级菜单2.3</a></li></ul></li><li><a href="#">一级菜单3</a><ul class="secondNav"><li><a href="#">二级菜单3.1</a></li><li><a href="#">二级菜单3.2</a></li><li><a href="#">二级菜单3.3</a></li></ul></li></ul></div>

水平二级

由于二级导航栏是水平的,要让多个li同行分布,按照水平基本导航栏的做法(1)float 或者(2)inline-block。注意一级导航要设置relative定位,二级导航设置absolute定位来脱离文档流,此时二级导航的宽度仍然受一级导航的限制(此时一级导航是距离最近的非static定位的元素),否则会有错位情况发生。

css改动:

     .firstNav {position: relative;}.secondNav {display: none;position: absolute;}.secondNav>li {float: left;}

动画效果

css改动:

     .secondNav {/*display: none;*/position: absolute;opacity: 0;transition-property: opacity;transition-duration: 1s;}.firstNav>li:hover .secondNav {/*display: block;*/opacity: 1;}

需要注意:如果display:none没有去掉,最后没有过渡效果,仍为瞬时显示。
这里的动画是通过opacity实现的,有不足:鼠标可以点击到看不见的导航项。

考虑导航栏位置和导航栏下方内容位置


在一级li中添加二级ul,若二级要垂直的导航栏,则对二级ul float:none

使用display: none将二级导航隐藏,这里隐藏式二级导航不占用位置,设置hover将display: block

对整个导航栏加阴影,同时防止hover时二级导航栏拉伸阴影样式,需要将二级导航栏脱离普通文档。这里不能用float,因为一级导航栏已经清除了浮动,故这里用绝对定位脱离文档流。

可以对一级导航栏使用绝对定位,对html使用相对定位,效果不错。
CSS:

html {position: relative;
}
ul.nav {list-style-type: none;padding: 0;margin: 0;/* 清除浮动不用overflow,为了阴影效果 *//* overflow: hidden; */position: absolute;top: 2px;left: 2px;/* 对整个导航栏添加阴影效果 */box-shadow: 2px 5px 5px gray;
}
ul.nav::after {content: '';display: block;clear: both;
}
ul.nav>li {/* 水平导航栏 */float: left; position: relative;
}
ul.nav a {display: block;text-decoration: none;width: 5em;line-height: 3em;text-align: center;background: black;color: white;transition-property: background-color;transition-duration: 0.3s;
}
ul.nav>li>a {border-right: 1px solid grey;
}
ul.nav a:hover {background: lightblue;
}ul.secondNav {padding: 0;margin: 0;list-style-type: none;display: none;transition-property: display;transition-duration: 0.5s;/* 脱离文档流使得导航栏的阴影不会畸变 *//* 不能float,因为ul清除了浮动,hover时二级导航会拉伸阴影 */position: absolute;
}
ul.secondNav a {background: grey;float: none;border-bottom: 0.5px solid white;
}
ul.nav>li:hover ul {/*这里用display而不是opacity,若为opacity,鼠标会点击看不见的导航项*/display: block;
}
div#main {margin: 100px 0;
}

html:

<ul class="nav"><li><a href="">level1</a><ul class="secondNav"><li><a href="">level1.1</a></li><li><a href="">level1.2</a></li><li><a href="">level1.3</a></li></ul></li><li><a href="">level2</a><ul class="secondNav"><li><a href="">level2.1</a></li><li><a href="">level2.2</a></li><li><a href="">level2.3</a></li></ul></li><li><a href="">level3</a></li><li><a href="">level4</a></li><li><a href="">level5</a></li>
</ul>
<div id="main"><p>THIS IS PARAGRAPH</p>
</div>

行内元素和块级元素的具体区别是什么?inline-block是什么?

行内元素与块级元素的区别

block

  • 总在新的一行开始(换行)
  • width、height以及padding、margin可设置
  • 如果不设置width,默认为整个容器的100%
  • 常用块元素:div、p、h1、form、ul、li

inline

  • 和其他元素同一行(不换行)
  • 行高width、height和padding、margin不可设置(img除外,img可设置width、height)
  • widht为文字或图片的宽度,不可改变
  • 常用行内元素:span、a、label、input、img

inline-block

  • 和其他元素同一行(不换行)
  • width、height、margin、padding可设置
  • 默认底部在同一水平线,可使用vertical-align

其他不同

  1. 行内元素会在一条直线上排列(默认宽度只与内容有关),都是同一行的,水平方向排列。
    块级元素各占据一行(默认宽度是它本身父容器的100%(和父元素的宽度一致),与内容无关),垂直方向排列。块级元素从新行开始,结束接着一个断行。

  2. 块级元素可以包含行内元素和块级元素。行内元素不能包含块级元素,只能包含文本或者其它行内元素。

  3. 行内元素与块级元素属性的不同,主要是盒模型属性上:行内元素设置width无效,height无效(可以设置line-height),margin上下无效,padding上下无效。

行内元素和块级元素转换

display:block; (字面意思表现形式设为块级元素)

display:inline; (字面意思表现形式设为行内元素)

inline-block

inline-block 的元素(如input、img)既具有 block 元素可以设置宽高的特性,同时又具有 inline元素默认不换行的特性。当然不仅仅是这些特性,比如 inline-block 元素也可以设置 vertical-align(因为这个垂直对齐属性只对设置了inline-block的元素有效) 属性。
HTML 中的换行符、空格符、制表符等合并为空白符,字体大小不为 0 的情况下,空白符自然占据一定的宽度,使用inline-block 会产生元素间的空隙。
在导航栏中可设置水平导航,与float相比没有浮动副作用。

举个例子

虽然原理很清晰明了,但是实际做的时候总有很多意外情况,这里列举我遇到的关于导航栏的小demo,源自我自己的作业和小练习。

效果:

注意和关键:

  • 记得导航元素的时候,设置锚点的宽度而不是li(这次代码中忘记了);
  • 使用CSS增加后序after的方式清除浮动时,注意是在最外层ul的后面添加,display设置为block
  • 注意base标签为页面上的所有链接规定默认地址href默认目标target
  • 二级导航设置绝对定位脱离文档流可以不受一级导航宽度的限制,前提是一级导航为static元素,否则将会以最近的非static即一级导航为相对位置定位。

代码:

<!DOCTYPE html>
<html>
<head>
<title>menu</title>
<base href="http://www.sysu.edu.cn/2012/cn/">
<style>a:link,a:visited {text-decoration:none;color:blue}ul {list-style-type: none;margin: 0;padding: 0;}ul#nav {background-color: rgb(208, 208, 208);}ul>li {background-color: rgb(208, 208, 208);padding: 4px 6px;}ul#nav::after {content: "";display: block;clear: both;}ul#nav>li {float: left;padding: 0 10px;}ul#nav>li>ul {display: none;position: absolute;border: 1px solid gray;background-color: rgb(208, 208, 208);/*top: 30px;*//*使得二级导航栏的宽度不受一级导航栏的限制*/}span.home {display: inline-block;width: 25px;height: 21px;margin-left: 250px;background-image: url("F:/中大/大三下/专业工程项目实践/js实验2/code/images/home.gif");/*由于使用了base,要用绝对路径*/background-position: -3px -8px;}/*ul#nav>li:hover ul { <!-- hover控制二级导航栏显示隐藏 -->display: block;}*/
</style>
<script></script>
</head>
<body><ul id="nav"><li><a href="index.htm"><span class="home">&nbsp;&nbsp;&nbsp;</span></a></li><li><a href="zdgk/index.htm"><span>学校概况</span></a><ul> <li><a href="zdgk/zdgk01/index.htm">中大简介</a></li><li><a href="zdgk/zdgk02/index.htm">中大校区</a></li><li><a href="zdgk/zdgk03/index.htm">现任领导</a></li><li><a href="zdgk/zdgk04/index.htm">管理服务</a></li><li><a href="zdgk/zdgk06/index.htm">校歌 校训 校徽</a></li><li><a href="zdgk/zdgk07/index.htm">数字中大</a></li><li><a href="zdgk/zdgk05/index.htm">中大校史</a></li><li><a href="zdgk/zdgk08/index.htm">中大图志</a></li></ul></li><li><a href="yx/index.htm"><span>院系设置</span></a></li><li><a href="xksz/index.htm"><span>学科与师资</span></a><ul><li><a href="xksz/xksz01/index.htm">学科建设</a></li><li><a href="xksz/xksz02/index.htm">人才名录</a></li><li><a href="xksz/xksz03/index.htm">名师垂范</a></li></ul></li><li><a href="jyjx/index.htm"><span>教育教学</span></a><ul><li><a href="jyjx/jyjx01/index.htm">本科教育</a></li><li><a href="jyjx/jyjx02/index.htm">研究生教育</a></li><li><a href="jyjx/jyjx03/index.htm">国际教育</a></li><li><a href="jyjx/jyjx04/index.htm">继续教育</a></li></ul></li><li><a href="kxyj/index.htm"><span>科学研究</span></a><ul><li><a href="kxyj/kxyj01/index.htm">重点研究机构</a></li><li><a href="kxyj/kxyj04/index.htm">学术期刊</a></li><li><a href="kxyj/kxyj05/index.htm">博士后科研流动站</a></li></ul></li><li><a href="zsjy/index.htm"><span>招生与就业</span></a><ul><li><a href="zsjy/zsjy01/index.htm">本科招生</a></li><li><a href="zsjy/zsjy02/index.htm">研究生招生</a></li><li><a href="zsjy/zsjy03/index.htm">留学生招生</a></li><li><a href="jyjx/jyjx04/index.htm">继续教育招生</a></li><li><a href="zsjy/zsjy04/index.htm">就业指导与服务</a></li></ul></li><li><a href="http://library.sysu.edu.cn"><span>图书馆</span></a></li><li><a href="rczp/index.htm"><span>人才招聘</span></a></li><li><a href="xyjj/index.htm"><span>校友与基金</span></a></li><li><a href="zjzd/index.htm"><span>走进中大</span></a><ul><li><a href="http://myspace.sysu.edu.cn">5D空间</a><li><a href="zjzd/zjzd02/index.htm">校区地图</a><li><a href="zjzd/zjzd03/index.htm">生活服务</a><li><a href="zjzd/zjzd04/index.htm">中大博物馆</a><li><a href="zjzd/zjzd05/index.htm">校园文化</a></ul></li></ul>
<script>window.onload = function() {<!-- 使用JS控制二级导航栏显示/隐藏 -->var item = document.querySelectorAll("ul#nav>li");for (let i = 0; i < item.length; ++ i) {item[i].addEventListener("mouseover", function() {console.log(item[i].childNodes);if (item[i].childNodes.length > 2)item[i].childNodes[2].style.display = "block";});item[i].addEventListener("mouseout", function() {console.log(item[i].childNodes);if (item[i].childNodes.length > 2) {console.log(item[i].childNodes[2]);item[i].childNodes[2].style.display = "none";}});}}
</script>
</body>
</html>

CSS实现垂直/水平导航栏相关推荐

  1. css垂直+水平导航栏代码实例

    第一种:垂直导航栏 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  2. CSS学习笔记(十二)CSS 水平导航栏

    CSS 水平导航栏 水平导航栏 有两种创建水平导航栏的方法:使用行内或浮动列表项. 行内列表项 构建水平导航栏的一种方法是,除了上一章中的"标准"代码外,还要将 <li> ...

  3. CSS导航栏 水平导航栏出炉

    越往后面这速度就降低下来了,前面的简单可以快速过去. <!DOCTYPE html> <html lang="en"><head><met ...

  4. 使用html,css实现简单的导航栏

    标题:使用html,css实现简单的导航栏 一.实现过程 首先通过ul,li实现一个无序列表,添加背景得到如图所示的样式[文档流] 让li浮动,使得垂直排列–>水平排列,[注意需要开启bfc,让 ...

  5. php导航条css代码生成器,怎么使用css代码制作网站导航栏?(示例)

    本篇文章主要给大家介绍关于如何用css做导航栏的相关知识,希望对有需要的朋友有所帮助.对于任何一个网站来说,导航栏的存在是至关重要的,那么如果仅仅只是用html做出枯燥乏味的导航菜单,效果肯定是不佳的 ...

  6. 水平导航栏+导航栏跟随+导航栏下划线滑动效果

    先放代码: HTML: <!doctype html> <html> <head> <meta charset="utf-8"> & ...

  7. css制作动态按钮导航栏,巧妙使用checkbox制作纯css动态导航栏

    前提:很多时候.我们的网页都需要一个垂直的导航栏.可以分类.有分类.自然就有展开.关闭的功能.你还在使用jquery操作dom来制作吗?那你就out了! 方案:使用checkbox 的 checked ...

  8. 直播app开发搭建,纯css/html实现侧边导航栏

    直播app开发搭建,纯css/html实现侧边导航栏 css代码: *{margin: 0px;padding: 0px;}#box{position: absolute;height: 300px; ...

  9. 精致纯CSS打造绿色漂亮导航栏

    代码简介: 极精致的纯CSS实现的菜单,兼容性非常好,条例WEB标准,能用性好,用到有修饰图片,请根据代码地址自己下载. 代码内容: <!DOCTYPE html PUBLIC "-/ ...

最新文章

  1. jmeter启动警告项解决方案
  2. 静态内部类和非静态内部类区别汇总
  3. HSRP多组基础配置实验
  4. 对Linux系统中的时钟和时间的探讨
  5. php类实例方法静态方法,PHP类中的静态方法使用实例
  6. 生产环境碰到系统CPU飙高和频繁GC,你要怎么排查?
  7. 苹果手机java_iphone手机,苹果手机如何登陆网易163邮箱
  8. python信号分析_Python频谱分析
  9. 技术人的少年感,和年龄无关。
  10. GIT 中同时 push 代码到多个远程仓库
  11. 如何open一个新tab页面
  12. 中国塑料瓶市场趋势报告、技术动态创新及市场预测
  13. spring REST中的内容协商(同一资源,多种展现:xml,json,html)
  14. 配置nginx,Tomcat日志记录请求耗时
  15. 【java】抽象类下有两个具体子类,子类下有两个实例
  16. 【协同任务】基于matlab遗传算法考虑分配次序的多无人机协同任务分配【含Matlab源码 143期】
  17. 用MATLAB画出双极性NRZ,[工学]通信原理MATLAB仿真教程第7章.ppt
  18. 地图测量面积工具app_面积测量精灵手机版下载
  19. postman使用之Tests使用
  20. 前端学习笔记之——使用边框和背景

热门文章

  1. 你知道二维码是什么码吗?目前流行的无线射频识别用的又是什么编码呢?它俩如何转换呢?
  2. PHP内核源码阅读过程(四)
  3. UNIX 时间戳总结
  4. 传智播客 HTTP协议详解
  5. 图解Java服务端Socket建立原理
  6. 一个或多个数据库无法访问,因而不会在数据库访问选项卡中显示
  7. 微信小程序不显示base64位图片
  8. 计算机技术性能指标指的是,计算机主要技术指标通常是指
  9. RX 6500 XT参数 RX6500xt怎么样
  10. vue-cli3 按需引入element-ui