基于JS快速实现导航下拉菜单动画效果附源码下载


Posted in Javascript onOctober 27, 2016

这是一个带变形动画特效的下拉导航菜单特效。该导航菜单在菜单项之间切换时,下拉菜单会快速的根据菜单内容的大小来动态变形,显示合适的下拉菜单大小,效果非常棒。

快速的导航下拉菜单动画效果如下所示:

基于JS快速实现导航下拉菜单动画效果附源码下载

效果演示         源码下载

HTML

该导航菜单的HTML结构如下:

<header class="cd-morph-dropdown"> 
<a href="#0" class="nav-trigger">Open Nav<span aria-hidden="true"></span></a> 
<nav class="main-nav"> 
<ul> 
<li class="has-dropdown gallery" data-content="about"> 
<a href="#0">About</a> 
</li> 
<li class="has-dropdown links" data-content="pricing"> 
<a href="#0">Pricing</a> 
</li> 
<li class="has-dropdown button" data-content="contact"> 
<a href="#0">Contact</a> 
</li> 
</ul> 
</nav> 
<div class="morph-dropdown-wrapper"> 
<div class="dropdown-list"> 
<ul> 
<li id="about" class="dropdown gallery"> 
<!-- dropdown content here --> 
</li> 
<li id="pricing" class="dropdown links"> 
<!-- dropdown content here --> 
</li> 
<li id="contact" class="dropdown button"> 
<!-- dropdown content here --> 
</li> 
</ul> 
<div class="bg-layer" aria-hidden="true"></div> 
</div> <!-- dropdown-list --> 
</div> <!-- morph-dropdown-wrapper --> 
</header>

CSS样式请参照源码中的css/style.css文件。

Javascript

为了实现这个导航菜单,特效中创建了一个morphDropdown对象。并使用bindEvents ()方法来处理元素的事件。

function morphDropdown( element ) { 
this.element = element; 
this.mainNavigation = this.element.find('.main-nav'); 
this.mainNavigationItems = this.mainNavigation.find('.has-dropdown'); 
this.dropdownList = this.element.find('.dropdown-list'); 
//... 
this.bindEvents(); 
}
bindEvents()方法用于在.has-dropdown和.dropdown元素上检测鼠标进入和鼠标离开事件。
morphDropdown.prototype.bindEvents = function() { 
var self = this; 
this.mainNavigationItems.mouseenter(function(event){ 
//hover over one of the nav items -> show dropdown 
self.showDropdown($(this)); 
}).mouseleave(function(){ 
//if not hovering over a nav item or a dropdown -> hide dropdown 
if( self.mainNavigation.find('.has-dropdown:hover').length == 0 && self.element.find('.dropdown-list:hover').length == 0 ) self.hideDropdown(); 
}); 
//... 
}; 
showDropdown方法用于处理宽度、高度和.dropdown-list元素的translateX值,以及放大和缩小.bg-layer元素。
morphDropdown.prototype.showDropdown = function(item) { 
var selectedDropdown = this.dropdownList.find('#'+item.data('content')), 
selectedDropdownHeight = selectedDropdown.innerHeight(), 
selectedDropdownWidth = selectedDropdown.children('.content').innerWidth(), 
selectedDropdownLeft = item.offset().left + item.innerWidth()/2 - selectedDropdownWidth/2; 
//update dropdown and dropdown background position and size 
this.updateDropdown(selectedDropdown, parseInt(selectedDropdownHeight), selectedDropdownWidth, parseInt(selectedDropdownLeft)); 
//add the .active class to the selected .dropdown and .is-dropdown-visible to the .cd-morph-dropdown 
//... 
}; 
morphDropdown.prototype.updateDropdown = function(dropdownItem, height, width, left) { 
this.dropdownList.css({ 
'-moz-transform': 'translateX(' + left + 'px)', 
'-webkit-transform': 'translateX(' + left + 'px)', 
'-ms-transform': 'translateX(' + left + 'px)', 
'-o-transform': 'translateX(' + left + 'px)', 
'transform': 'translateX(' + left + 'px)', 
'width': width+'px', 
'height': height+'px' 
}); 
this.dropdownBg.css({ 
'-moz-transform': 'scaleX(' + width + ') scaleY(' + height + ')', 
'-webkit-transform': 'scaleX(' + width + ') scaleY(' + height + ')', 
'-ms-transform': 'scaleX(' + width + ') scaleY(' + height + ')', 
'-o-transform': 'scaleX(' + width + ') scaleY(' + height + ')', 
'transform': 'scaleX(' + width + ') scaleY(' + height + ')' 
}); 
};

以上所述是小编给大家介绍的基于JS快速实现导航下拉菜单动画效果附源码下载,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
alixixi runcode.asp的代码不错的应用
Aug 08 Javascript
关于Mozilla浏览器不支持innerText的解决办法
Jan 01 Javascript
MooTools 页面滚动浮动层智能定位实现代码
Aug 23 Javascript
由点击页面其它地方隐藏div所想到的jQuery的delegate
Aug 29 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
Jun 05 Javascript
jquery解析json格式数据的方法(对象、字符串)
Nov 24 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
JS实现的简单四则运算计算器功能示例
Sep 27 Javascript
javaScript 连接打印机,打印小票的实例
Dec 29 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 Javascript
Element Input组件分析小结
Oct 11 Javascript
vue-router为激活的路由设置样式操作
Jul 18 Javascript
简单理解vue中el、template、replace元素
Oct 27 #Javascript
深入理解JavaScript定时机制
Oct 27 #Javascript
解析javascript图片懒加载与预加载的分析总结
Oct 27 #Javascript
js实现加载更多功能实例
Oct 27 #Javascript
Vue.js一个文件对应一个组件实践
Oct 27 #Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
Oct 27 #Javascript
node.js文件上传处理示例
Oct 27 #Javascript
You might like
新浪微博API开发简介之用户授权(PHP基础篇)
2011/09/25 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
JS中数组重排序方法
2016/11/11 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
用Python的urllib库提交WEB表单
2009/02/24 Python
python写的一个squid访问日志分析的小程序
2014/09/17 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
python plotly绘制直方图实例详解
2019/07/22 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
浅析python redis的连接及相关操作
2019/11/07 Python
Python绘图实现显示中文
2019/12/04 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
python time()的实例用法
2020/11/03 Python
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
自荐信包含哪些内容
2013/10/30 职场文书
工程测量与监理专业应届生求职信
2013/11/27 职场文书
商务英语专业求职信
2014/06/26 职场文书
格林童话读书笔记
2015/06/30 职场文书
CAD实训总结范文
2015/08/03 职场文书
感恩主题班会教案
2015/08/12 职场文书