基于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 相关文章推荐
jquery插件推荐 jquery.cookie
Nov 09 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
Jun 19 Javascript
js限制input标签中只能输入中文
Jun 26 Javascript
深入探讨javascript函数式编程
Oct 11 Javascript
JavaScript使用readAsDataUrl方法预览图片
May 10 Javascript
Javascript 实现匿名递归的实例代码
May 25 Javascript
讲解vue-router之命名路由和命名视图
May 28 Javascript
微信小程序实现弹出层效果
May 26 Javascript
js实现下拉框二级联动
Dec 04 Javascript
vue获取form表单的值示例
Oct 29 Javascript
vue动画—通过钩子函数实现半场动画操作
Aug 09 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
Sep 28 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
JAVA/JSP学习系列之六
2006/10/09 PHP
PHP的几个常用数字判断函数代码
2012/04/24 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
php操作redis缓存方法分享
2015/06/03 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript中&quot;/&quot;运算符常见错误
2010/10/13 Javascript
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
jQuery事件详解
2017/02/23 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
python通过imaplib模块读取gmail里邮件的方法
2015/05/08 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
python 实用工具状态机transitions
2020/11/21 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
人代会标语
2014/06/30 职场文书
女生抽烟检讨书
2014/10/05 职场文书
新人入职感言
2015/07/31 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书