基于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支持firefox,ie7页面布局拖拽效果代码
Dec 20 Javascript
DOM 基本方法
Jul 18 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
Java Mybatis框架入门基础教程
Sep 21 Javascript
基于JQuery实现分隔条的功能
Jun 17 Javascript
JavaScript简单获取页面图片原始尺寸的方法
Jun 21 Javascript
深入浅析javascript中的作用域(推荐)
Jul 19 Javascript
AngularJS+Bootstrap实现多文件上传与管理
Nov 08 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
详解js中let与var声明变量的区别
Apr 05 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
Sep 18 Javascript
基于Vue CSR的微前端实现方案实践
May 27 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 Static关键字实用方法
2010/06/04 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
php获取数组中重复数据的两种方法
2013/06/28 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
jQuery Easyui快速入门教程
2016/08/21 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
Python环境变量设置方法
2016/08/28 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
python感知机实现代码
2019/01/18 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
师范毕业生求职自荐信
2013/09/25 职场文书
最新创业融资计划书
2014/01/19 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
全陪导游词
2015/02/04 职场文书
2015年公司工作总结
2015/04/25 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android