基于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功能的正确方法(译文)
Apr 12 Javascript
可在线编辑网页文字效果代码(单击)
Mar 02 Javascript
jquery交替变换颜色的三种方法 实例代码
Nov 19 Javascript
JS比较两个时间大小的简单示例代码
Dec 20 Javascript
浅谈javascript语法和定时函数
May 03 Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
Jul 08 Javascript
NW.js 简介与使用方法
Feb 01 Javascript
vue 使用Jade模板写html,stylus写css的方法
Feb 23 Javascript
vue动态子组件的两种实现方式
Sep 01 Javascript
vue组件传值的实现方式小结【三种方式】
Feb 05 Javascript
Vuex的热更替如何实现
Jun 05 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静态新闻列表自动生成代码
2007/06/14 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
PHP实现cookie跨域session共享的方法分析
2019/08/23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
CSS3感应鼠标的背景闪烁和图片缩放动画效果
2014/05/14 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
企业安全生产演讲稿
2014/05/09 职场文书
先进教师个人总结
2015/02/11 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书