基于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 相关文章推荐
优化 JavaScript 代码的方法小结
Jul 16 Javascript
jQuery 学习6 操纵元素显示效果的函数
Feb 07 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
javascript函数中参数传递问题示例探讨
Jul 31 Javascript
使用javascript实现Iframe自适应高度
Dec 24 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
javascript完美实现给定日期返回上月日期的方法
Jun 15 Javascript
angular2中Http请求原理与用法详解
Jan 11 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
Mar 25 jQuery
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
简单理解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连mysql和oracle数据库性能比较
2006/10/09 PHP
php 字符串函数收集
2010/03/29 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
php网站被挂木马后的修复方法总结
2014/11/06 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
jquery 插件 人性化的消息显示
2008/01/21 Javascript
javascript 类方法定义还是有点区别
2009/04/15 Javascript
js查错流程归纳
2012/05/04 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
Python random模块常用方法
2014/11/03 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
python实现可逆简单的加密算法
2019/03/22 Python
python命令行工具Click快速掌握
2019/07/04 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
python3 使用traceback定位异常实例
2020/03/09 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
革命先烈的英雄事迹材料
2014/02/15 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android
一文搞懂Java中的注解和反射
2022/06/21 Java/Android