广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >原生JS如何实现导航下拉菜单效果
  • 274
分享到

原生JS如何实现导航下拉菜单效果

2024-04-02 19:04:59 274人浏览 八月长安
摘要

这篇文章主要介绍了原生js如何实现导航下拉菜单效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。这个导航下拉菜单需要实现的功能是:下拉菜单的

这篇文章主要介绍了原生js如何实现导航下拉菜单效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

这个导航下拉菜单需要实现的功能是:下拉菜单的宽度与浏览器视口的宽度一样宽;一级导航只有两项,当鼠标移到一级导航上的导航项时,相应的二级导航出现。在本案例中通过改变二级导航的高度来实现二级导航的显示和消失。为了便于理解我画了一个图,如下:

原生JS如何实现导航下拉菜单效果

在这个案例主要用到的知识有:设置定时器,清除定时器,mouseout和mouseover事件,另外还有CSS中position相关知识。本案例分为两部分讲解。第一部分html和css,第二部分js。

一. html和css

将导航这个导航条包裹在一个div中,这个div的position值为relative,高度为50px(导航条的高度为50px),宽度为100%,将最外层的div的position属性设置为relative是因为二级导航要根据这个div来定位。这个导航条的结构是二级嵌套无序列表。每一个一级导航项li都嵌套了它对应的无序列表。需要将嵌套的无序列表移除文档流。所以嵌套的无序列表的position值为absolute,top:50px(导航条的高度)。left:0;right:0;通过设置这些值可以使嵌套的无序列表宽度为浏览器视口的宽度。通过将li的display值设置inline-block并且将外层div的text-align设置为center使得导航项居中显示。

注:在这个案例中一定要将嵌套的无序列表的position的值设置为absolute,使它移除文档流。

html和css代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>下拉菜单</title>
  <link rel="stylesheet" type="text/css" href="index.css" rel="external nofollow" >
</head>
<body>
  <div class='header'>
    <ul class='outer' id='outer'>
      <li class='outerList' id='outerList1'><a href='#' id='link1' class='link'>产品<span></span></a>
        <ul class='inter' id='inter1'>
          <li>
            <a href='#'>
              <img src='img/01fea55541ed73000001714a430253.jpg'>
              <strong>纳斯</strong>
            </a>
          </li>
          <li>
            <a href='#'>
              <img src='img/thumb_image3.jpg'>
              <strong>纯色</strong>
            </a>
          </li>
          <li>
            <a href='#'>
              <img src='img/白胡子.jpg'>
              <strong>保温杯</strong>
            </a>
          </li>
          <li>
            <a href='#'>
              <img src='img/宠物.jpg'>
              <strong>设计周边</strong>
            </a>
          </li>
        </ul>
      </li>
      <li class='outerList' id='outerList2'><a href='#' id='link2' class='link'>服务<span></span></a>
        <ul class='inter' id = 'inter2'>
          <li>
            <a href='#'>
              <img src='img/狮子座.jpg'>
              <strong>售后服务</strong>
            </a>
          </li>
          <li>
            <a href='#'>
              <img src='img/莲花禅.jpg'>
              <strong>设计师</strong>
            </a>
          </li>
        </ul>
      </li>
    </ul>
  </div>
  <script type="text/javascript" src='index.js'></script>
</body>
</html>

css代码如下: 

*{
  padding: 0;
  margin: 0;
}
.header{
  position: relative;
  width: 100%;
  height: 50px;
  background-color: #000000;
  text-align: center;
  z-index: 2;
}
.header .outer li{
  display: inline-block;
  list-style: none;
}
.outerList{
  height: 50px;
  line-height: 50px;

}
.outerList a{
  display: block;
  padding: 0 15px;
  color: #fff;
  text-decoration: none;
}
.outerList:hover a{
  color: #EDECEC;

}
.outerList .link span{
  display: block;
  height: 0;
  width: 100%;
  position: relative;
  top: -10px;
  left: 0;
  background-color: #fff;

}
.outerList:hover .link span{
  height: 1px;
}
.outerList .inter{
  position: absolute;
  left: 0;
  height: 0;
  overflow: hidden;
  top: 50px;
  right: 0;
  background-color:rgba(0,0,0,0.5);
}
.outerList .inter li{
  margin-top: 30px;
}
.outerList .inter strong{
  display:block;
  height: 25px;
  line-height: 25px;
  text-align: center;
}

二. js部分

在js部分涉及到的知识主要有:设置定时器,清除定时器,mouseout和mouseover事件。

mouseout事件当鼠标从一个元素上移入另一个元素的上时,会在失去鼠标的那个元素上触发mouseout事件。获得鼠标的那个元素可能是失去鼠标的元素的父元素或子元素,获得鼠标的那个元素也可能位于失去鼠标元素的外部。当在一级导航项上触发mouseout事件时,我们需要判断获得鼠标的元素是不是一级导航项的子孙元素。当一个元素触发了mouseout事件时,去鼠标的元素为目标元素(target),获得鼠标的元素为相关元素(relatedTarget)。所以需要判断相关元素是否为一级导航项的子孙元素,如果是子孙元素,则相应的导航项的二级导航项高度不变。如果不是子孙元素,则相应的二级导航项消失。判断是否为子孙元素的代码如下:

var flag1 = false,flag2 = false;

if(relatedTarget !== null){
    var parented = relatedTarget.parentnode;
    do{
      if(parented === outerList1 || relatedTarget === outerList1){
        flag1 = true;
        break;
      }else if(parented === outerList2 || relatedTarget === outerList2){
        flag2 = true;
        break;
      }else{
        parented = parented.parentNode;
      }
    }while(parented !== null);
  }

注:通过判断flag1和flag2的值来确定是否该把二级菜单的高度变为0,如果flag1的值为false则让outerList1对应的二级菜单消失,如果flag2为false则将outerList2对应的二级菜单消失。

mouseover事件当鼠标移入一个元素内部时,获得鼠标的元素上触发这个事件,获得鼠标的元素可能位于失去鼠标的外部,也可能位于失去鼠标元素的内部。获得鼠标的元素是目标元素,失去鼠标的元素为相关元素。在这个案例中我们只需要判断mouseover的目标元素,但是对于mouseout事件我们需要判断相关元素。

注:在支持DOM的浏览器中,mouseout和mouseover的相关元素都保存在事件对象(event)的relatedTagrget属性中,但是在IE浏览器中,对于mouseout事件而言,相关事件保持在事件对象(event)的toElement属性中,对于mouseover事件而言,相关事件保存在事件对象(event)的fromElement属性中。

设置定时器和清除定时器在这个案例中嵌套无序列表的消失和出现是通过改变它的高度实现的,它的高度是逐渐变化,所以我使用的setTimeout这个定时器,为了能够清除定时器还要将定时器标识保存在一个变量中。清除定时器的目的是为了防止当快速移动鼠标时嵌套无序列表的高度抖动(即:一个定时器里的回调函数让高度增加,另一个定时器的回调函数让高度减小)。

js代码如下: 

var untilEvent = {
  addEvent:function(element,type,hander){
    if(element.addEventListener){
      element.addEventListener(type,hander,false);
    }else if(element.attachEvent){
      element.attachEvent('on'+type,hander);
    }else{
      element['on'+type] = hander;
    }
  },
  getEvent:function(event){
    return event?event:window.event;
  },
  getTarget:function(event){
    return event.target||event.srcElement;
  },
  getRelated:function(event){
    if(event.relatedTarget){
      //兼容DOM的浏览器将相关元素保持在relatedTarget属性中
      return event.relatedTarget;
    }else if(event.toElement){
      //在IE浏览器中mouseout事件的相关元素保存在toElement属性中
      return event.toElement;
    }else if(event.fromElement){
      //在IE浏览器中mouseover事件的相关元素保持在fromElement属性中
      return event.fromElement;
    }else{
      return null;
    }
  }

};
//下面这四个元素用于表示四个定时器的标识,最开始我只使用两个定时器,当快速移动时
//动画会乱。
var timeDec1,timeAdd1,timeAdd2,timeDec2;//定时器标识
function getOuter(){
  var outer = document.getElementById('outer');
  untilEvent.addEvent(outer,'mouseover',callBackOver);
  untilEvent.addEvent(outer,'mouseout',callBackOut);
}
//mouseout事件:当鼠标从一个元素移入另一个元素时在鼠标离开的那个元素
//上触发,获得鼠标的元素可能在失去鼠标元素的外部也可能在失去鼠标元素的
//内部.所以需要判断mouseout事件的相关元素是否为外部li(即id为outerList或id为outerList2)元素
//的子孙元素,如果是子孙元素,则内部无序列表无须收起。
function callBackOut(event){
  var event = untilEvent.getEvent(event);
  var relatedTarget = untilEvent.getRelated(event);
  var outerList1 = document.getElementById('outerList1');
  var inter1 = document.getElementById('inter1');
  var outerList2 = document.getElementById('outerList2');
  var inter2 = document.getElementById('inter2');
  var flag1 = false,flag2 = false;
  if(relatedTarget !== null){
    var parented = relatedTarget.parentNode;
    do{
      if(parented === outerList1 || relatedTarget === outerList1){
        flag1 = true;
        break;
      }else if(parented === outerList2 || relatedTarget === outerList2){
        flag2 = true;
        break;
      }else{
        parented = parented.parentNode;
      }
    }while(parented !== null);
  }
  if(!flag1){
    var str1 = 'flag1';
    changeHeightDec(inter1,timeAdd1,str1);
  }
  if(!flag2){
    var str2 = 'flag2';
    changeHeightDec(inter2,timeAdd2,str2);
  }
}
function changeHeightDec(element,timer,flag){
  var offHeight = 70;
  var inverTimer = 10;
  clearTimeout(timer);
  change();
  function change(){
    var height = parseInt(element.style.height);
    if(!height)height = 0;
    if(height > 0){
      if(height - offHeight > 0){
      element.style.height = height - offHeight +'px';
      }else{
        element.style.height = 0+'px';
      }
      if(flag === 'flag1'){
       timeDec1= setTimeout(change,inverTimer);
      }else{
        timeDec2 = setTimeout(change,inverTimer);
      }
    }
  }
}
function callBackOver(event){
  var event = untilEvent.getEvent(event);
  var target = untilEvent.getTarget(event);
  var inter1 = document.getElementById('inter1');
  var inter2 = document.getElementById('inter2');
  if(target.id == 'outerList1' || target.id == "link1"){
    var str1 = "flag1";
    changeHeight(inter1,timeDec1,str1);
  }
  if(target.id == 'outerList2' || target.id == 'link2'){
    var str2 = "flag2";
    changeHeight(inter2,timeDec2,str2);
  }
}
function changeHeight(element,timer,flag){
  var totalHeight = 160;
  var inverHeight = 10;
  var inverTimer = 10;
  clearTimeout(timer);
  //当鼠标移入时清除让内部ul长度减小的定时器,保证鼠标移入后
  //内部ul长度立即增加
  change();
  function change(){
    var height = parseInt(element.style.height);
    if(!height) height = 0;
    if(height < totalHeight){
      if(height + inverHeight > totalHeight){
        element.style.height = totalHeight + "px";
      }else{
        element.style.height = height + inverHeight +'px';
      }
      if(flag === 'flag1'){
        timeAdd1 = setTimeout(change,inverTimer);
        }else{
          timeAdd2 = setTimeout(change,inverTimer);
        }
    }
  }
}
untilEvent.addEvent(window,'load',getOuter);

感谢你能够认真阅读完这篇文章,希望小编分享的“原生JS如何实现导航下拉菜单效果”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网node.js频道,更多相关知识等着你来学习!

--结束END--

本文标题: 原生JS如何实现导航下拉菜单效果

本文链接: https://www.lsjlt.com/news/66607.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 原生JS如何实现导航下拉菜单效果
    这篇文章主要介绍了原生JS如何实现导航下拉菜单效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。这个导航下拉菜单需要实现的功能是:下拉菜单的...
    99+
    2022-10-19
  • 原生js实现下拉菜单
    下拉菜单在实际生活中也挺常见的,它实现的js代码与tab选卡,手风琴几乎一样,在此不过多赘述。 我仿照苏宁易购官网写了一个下拉菜单,实现代码如下: <!DOCTYPE ht...
    99+
    2022-11-12
  • js如何实现下拉菜单效果
    这篇文章将为大家详细讲解有关js如何实现下拉菜单效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果图:代码如下:<!DOCTYPE html> ...
    99+
    2022-10-19
  • 原生JS实现悬停下拉菜单
    JS实现悬停下拉菜单,这个是前端面试中遇到的场景题,原理就是修改菜单样式的display属性的属性值从none=>block,具体实现见下,重点关注下面几个部分。 给...
    99+
    2022-11-12
  • 如何通过纯CSS实现导航栏的下拉菜单效果
    如何通过纯CSS实现导航栏的下拉菜单效果在Web设计中,导航栏是一个非常常见的组件,而下拉菜单则是导航栏中的一种常见效果。在本文中,我们将学习如何仅使用CSS来实现导航栏的下拉菜单效果,并提供详细的代码示例。首先,我们需要一个基本的导航栏结...
    99+
    2023-10-27
    导航栏 纯CSS 下拉菜单效果
  • js如何实现省份下拉菜单效果
    这篇文章给大家分享的是有关js如何实现省份下拉菜单效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。2个下拉框,选择1级菜单后,2级菜单出现相应的备选项。如果没有选择则不能提交。...
    99+
    2022-10-19
  • 原生js实现波浪导航效果
    本文实例为大家分享了原生js实现波浪导航效果的具体代码,供大家参考,具体内容如下 展示效果: 源码展示: <!doctype html> <html> &l...
    99+
    2022-11-13
  • Bootstrap3.3.7如何实现导航栏下拉菜单鼠标滑过展开效果
    这篇文章将为大家详细讲解有关Bootstrap3.3.7如何实现导航栏下拉菜单鼠标滑过展开效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Bootstrap是Twitt...
    99+
    2022-10-19
  • HTML+JS模拟实现QQ下拉菜单效果
    功能: 1、点击我的好友会展开下拉出具体的好友 2、再次点击,会折叠内容 3、首次点击某个具体的好友,只有当前这个好友高亮 4、再次点击这个好友时,高亮状态就会消失 主要练习:js绑...
    99+
    2022-11-13
  • PHP导航下拉菜单的实现如此简单
    复制代码 代码如下: <style> #sddm li a:hover { background: #49A3FF} #sddm div { position: abso...
    99+
    2022-11-15
    PHP导航 下拉菜单
  • Android仿今日头条APP实现下拉导航选择菜单效果
    本文实例为大家分享了在Android中如何实现下拉导航选择菜单效果的全过程,供大家参考,具体内容如下 关于下拉导航选择菜单效果在新闻客户端中用的比较多,当然也可以用在其他的项目...
    99+
    2022-06-06
    菜单 选择 app Android
  • css3如何实现下拉菜单效果
    本文小编为大家详细介绍“css3如何实现下拉菜单效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“css3如何实现下拉菜单效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先来看核心的HTML片断代码:<...
    99+
    2023-07-04
  • 如何使用JS组件Bootstrap实现下拉菜单效果
    这篇“如何使用JS组件Bootstrap实现下拉菜单效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用JS组件Boo...
    99+
    2023-07-04
  • jQuery如何实现Nav导航菜单效果
    这篇文章给大家分享的是有关jQuery如何实现Nav导航菜单效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。自己写的一个简单的导航菜单,先看效果:鼠标悬浮时菜单项向上移动成蓝底...
    99+
    2022-10-19
  • css3怎么实现的多级渐变下拉菜单导航效果代码
    这篇文章主要介绍“css3怎么实现的多级渐变下拉菜单导航效果代码”,在日常操作中,相信很多人在css3怎么实现的多级渐变下拉菜单导航效果代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2022-10-19
  • 纯CSS实现响应式导航栏的下拉菜单效果的实现步骤
    现如今,随着移动设备的普及,响应式设计已经成为网页设计的一个重要因素。在网页的导航栏设计中,为了提供更好的用户体验,通常需要使用下拉菜单来呈现更多的导航选项。本文将介绍如何使用纯CSS来实现响应式导航栏的下拉菜单效果,并附有具体的代码示例。...
    99+
    2023-10-21
    响应式导航栏 纯CSS实现 下拉菜单效果
  • js如何实现下拉菜单点击旁边收起效果
    这篇文章主要为大家展示了“js如何实现下拉菜单点击旁边收起效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何实现下拉菜单点击旁边收起效果”这篇文章吧。演...
    99+
    2022-10-19
  • js如何实现平滑过渡大型下拉菜单效果
    本篇内容主要讲解“js如何实现平滑过渡大型下拉菜单效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js如何实现平滑过渡大型下拉菜单效果”吧!代码:<!D...
    99+
    2022-10-19
  • vue2.0如何实现导航菜单切换效果
    这篇文章将为大家详细讲解有关vue2.0如何实现导航菜单切换效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下css*{   margin...
    99+
    2022-10-19
  • 纯CSS实现响应式导航栏的下拉子菜单效果的实现步骤
    纯CSS实现响应式导航栏的下拉子菜单效果的实现步骤随着移动设备的普及,响应式设计变得越来越重要,而导航栏是网站中一个非常重要的组成部分。本文将介绍如何使用纯CSS实现一个响应式导航栏的下拉子菜单效果,让网站在不同屏幕尺寸下都能有良好的用户体...
    99+
    2023-10-27
    CSS 响应式导航栏 下拉子菜单效果
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作