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


Posted in Javascript onNovember 01, 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 组件之旅(二)编码实现和算法
Oct 28 Javascript
Javascript中获取出错代码所在文件及行数的代码
Sep 23 Javascript
JavaScript实现数组随机排序的方法
Jun 26 Javascript
浅析node连接数据库(express+mysql)
Nov 30 Javascript
jQuery+css实现的换页标签栏效果
Jan 27 Javascript
JavaScript数据结构之数组的表示方法示例
Apr 12 Javascript
Javascript中prototype与__proto__的关系详解
Mar 11 Javascript
vue组件 keep-alive 和 transition 使用详解
Oct 11 Javascript
vue实现element表格里表头信息提示功能(推荐)
Nov 20 Javascript
Vue脚手架编写试卷页面功能
Mar 17 Javascript
基于PHP pthreads实现多线程代码实例
Jun 24 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
Aug 13 Javascript
AngularJS入门教程之数据绑定用法示例
Nov 01 #Javascript
jQuery动态生成Bootstrap表格
Nov 01 #Javascript
AngularJs入门教程之环境搭建+创建应用示例
Nov 01 #Javascript
jQuery双向列表选择器select版
Nov 01 #Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 #Javascript
JS button按钮实现submit按钮提交效果
Nov 01 #Javascript
Javascript 动态改变imput type属性
Nov 01 #Javascript
You might like
php中目录,文件操作详谈
2007/03/19 PHP
linux iconv方法的使用
2011/10/01 PHP
PHP获取时间排除周六、周日的两个方法
2014/06/30 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
php发送与接收流文件的方法
2015/02/11 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
利用VUE框架,实现列表分页功能示例代码
2017/01/12 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
英国家庭和商业健身器材购物网站:Fitness Options
2018/07/05 全球购物
优秀交警事迹材料
2014/01/26 职场文书
十佳护士获奖感言
2014/02/18 职场文书
《太阳》教学反思
2014/02/21 职场文书
小组口号大全
2014/06/09 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
基于angular实现树形二级表格
2021/10/16 Javascript
使用MybatisPlus打印sql语句
2022/04/22 SQL Server