基于CSS3 Media Query与JS实现响应式导航条

作者:纸飞机时间:2026-10-28 11:00:49浏览:240

本文详细介绍如何使用CSS3的Media Query结合JavaScript实现响应式导航条。内容涵盖HTML结构搭建、针对IE6-8的兼容性处理、不同屏幕宽度下的样式调整以及点击收起展开的JS动画实现,提供完整源码下载。

响应式导航条实现概述

本文介绍如何制作一个响应式导航条,该导航条能根据屏幕分辨率或浏览器窗口大小的变化自动调整样式。核心实现依赖于CSS3的Media Query特性。关于响应式布局的更多细节可参考相关文章,此处重点展示导航条的具体构建方法。

需要注意的是,IE6至IE8浏览器不支持CSS3的Media Query。因此,针对这些旧版浏览器需要进行特殊处理,使其保持默认样式,这在布局和样式设计中必须予以考虑。

首先查看HTML布局部分,代码如下:

代码如下:

<div class="navBar">
<div class="nav">
<ul id="menu">
<li class="current"><a href="#">首页</a></li>
<li><a href="#">电影</a></li>
<li><a href="#">电视剧</a></li>
<li><a href="#">动漫</a></li>
<li><a href="#">综艺</a></li>
<li><a href="#">纪录片</a></li>
<li><a href="#">公开课</a></li>
</ul>
<p class="hot">
<a href="#">钢铁侠3</a>
<a href="#">中国合伙人</a>
<a href="#">盛夏晚晴天</a>
<a href="#">陆贞传奇</a>
</p>
<!--判断浏览器是否是IE9,IE10或者是非IE浏览器-->
<!--[if (gt IE 8) | !(IE)]><!-->
<h1 class="title" id="title">
<a href="#">风驰网</a>
<span class="btn" id="btn"></span>
</h1>
<!--<![endif]-->
</div>
</div>

IE6-8兼容性处理

HTML部分还需添加条件注释,当浏览器为IE6-8时,给html标签添加类名"ie6-8",以便在样式表中进行针对性处理:

代码如下:

<!DOCTYPE html>
<!--[if lt IE 9]><html class="ie6-8"><![endif]-->
<html>
...

CSS样式控制与Media Query应用

接下来是样式控制部分,首先处理整体样式及IE6-8的兼容样式:

代码如下:

* {margin: 0; padding: 0;}
body {font: 14px/22px "宋体", arial, serif;}
.navBar {margin-top: 80px; width: 100%; height: 38px; background: #333;}
.nav {margin: 0 auto; border: 0px solid #ccc;}
.nav ul {list-style: none; width: auto;}
.nav ul li {height: 38px; text-align: center;}
.nav ul li a {display: block; font-size: 16px; color: #fff; text-decoration: none; line-height: 39px;}
.ie6-8 .nav {width: 1000px; height: 38px;}
.ie6-8 .nav ul li {float: left;}
.ie6-8 .nav ul li a {padding: 0 30px 0 30px;}
.ie6-8 .nav ul li.current {background: #f60;}
.ie6-8 .nav ul li:hover a {color: #f60;}
.ie6-8 .nav ul li a:hover {_color: #f60;}/*IE6 Hack*/
.ie6-8 .nav ul li.current:hover a {color: #fff;}
.ie6-8 .nav .hot {float: left; margin-left: 20px; padding-top: 8px;}
.ie6-8 .nav .hot a {padding: 0 5px 0 5px; font-size: 12px; color: #fff; text-decoration: none;}
.ie6-8 .nav .hot a:hover {color: #f60; text-decoration: underline;}
.ie6-8 .nav .title {display: none;}

完成基础样式后,接下来应用Media Query。

当屏幕宽度大于1000px时:

代码如下:

@media screen and (min-width: 1000px) {
.nav {width: 1000px; height: 38px;}
.nav ul li {float: left; width: auto;}
.nav ul li a {padding: 0 30px 0 30px;}
.nav ul li.current {background: #f60;}
.nav ul li:hover a {color: #f60;}
.nav ul li.current:hover a {color: #fff;}
.nav .hot {margin-left: 20px; padding-top: 8px;}
.nav .hot a {padding: 0 5px 0 5px; font-size: 12px; color: #fff; text-decoration: none;}
.nav .hot a:hover {color: #f60; text-decoration: underline;}
.nav .title {display: none;}
}

当屏幕宽度在640px到1000px之间时:

代码如下:

@media screen and (min-width: 640px) and (max-width: 1000px) {
.nav {width: auto; height: 38px;}
.nav ul li {float: left; width: 14%; min-width: 50px;}
.nav ul li.current {background: #f60;}
.nav ul li:hover a {color: #f60;}
.nav ul li.current:hover a {color: #fff;}
.nav .hot {display:none;}
.nav .title {display: none;}
}

当屏幕宽度小于640px时:

代码如下:

@media screen and (max-width: 640px) {
.navBar {margin-top: 0; height: auto; background: #444;}
.nav {width: auto; height: auto;}
.nav ul li {margin-top: 1px; width: 100%; min-width: 100px;background: #333;}
.nav ul li a:active {background: #f60;}
.nav .hot {display:none;}
.nav .title {position: relative; width: 100%; height: 38px; border-top: 1px solid #444; background: #333; text-align: center; font:normal 20px/35px "Microsoft YaHei", arial, serif; letter-spacing: 2px;}
.nav .title a {color: #f60; text-decoration: none;}
.nav .title .btn {position: absolute; right: 10px; top: 0; width: 34px; height: 34px; padding: 2px; background: url(btn.png) center center no-repeat; cursor: pointer;}
}

至此,布局和样式控制已完成,三种不同状态下的效果如下图所示:

基于CSS3 Media Query与JS实现响应式导航条 配图

响应式导航条实现概述

响应式导航条实现概述

JavaScript交互与动画实现

对于第三种状态(小屏幕),还需要实现点击右下角图标时菜单收起的效果。这可以通过JavaScript实现:当菜单收起时,点击图片可展开;当菜单展开时,点击图标可收起,并带有动画效果。以下是JS核心代码:

这部分代码用于产生动画效果:

代码如下:

var move = function (obj, target) {
var timer;
clearInterval(timer);
timer = setInterval(function () {
var speed = (target - obj.offsetTop)/3;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if (Math.abs(obj.offsetTop - target) < 4) {
clearInterval(timer);
obj.style.marginTop = target + "px";
} else {
obj.style.marginTop = obj.offsetTop + speed + "px";
        }
}, 30);
}

这个响应式导航条的基本实现就是这样,附上源码:

响应式导航条实现概述css3-js-response-nav(jb51.net).rar

作者最新文章