基于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 相关文章推荐
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
Feb 18 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
Sep 02 Javascript
JS 循环li添加点击事件 (闭包的应用)
Dec 10 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
微信小程序 共用变量值的实现
Jul 12 Javascript
浅谈vue的踩坑路
Aug 31 Javascript
angular中不同的组件间传值与通信的方法
Nov 04 Javascript
vue实现的微信机器人聊天功能案例【附源码下载】
Feb 18 Javascript
通过JavaScript下载文件到本地的方法(单文件)
Mar 17 Javascript
vue 插件的方法代码详解
Jun 06 Javascript
angularjs模态框的使用代码实例
Dec 20 Javascript
JS Canvas接口和动画效果大全
Apr 29 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
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
python网络编程之读取网站根目录实例
2014/09/30 Python
Python下Fabric的简单部署方法
2015/07/14 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
python判断数字是否是超级素数幂
2018/09/27 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
利用Python实现kNN算法的代码
2019/08/16 Python
Python 如何提高元组的可读性
2019/08/26 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
车间班组长岗位职责
2013/11/13 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
社保转移委托书范本
2014/10/08 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
python manim实现排序算法动画示例
2022/08/14 Python