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 相关文章推荐
JQuery 操作Javascript对象和数组的工具函数小结
Jan 22 Javascript
js时间日期格式化封装函数
Dec 02 Javascript
jQuery进行组件开发完整实例
Dec 15 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
Jul 04 Javascript
JS 仿支付宝input文本输入框放大组件的实例
Nov 14 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
JavaScript中发出HTTP请求最常用的方法
Jul 12 Javascript
React 项目迁移 Webpack Babel7的实现
Sep 12 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
Oct 12 Javascript
js模拟F11页面全屏显示
Sep 17 Javascript
node.js express框架实现文件上传与下载功能实例详解
Oct 15 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
redis 队列操作的例子(php)
2012/04/12 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
ansible作为python模块库使用的方法实例
2017/01/17 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
机械制造与自动化应届生求职信
2013/11/16 职场文书
普通党员对照检查材料
2014/09/24 职场文书
学校领导班子成员查摆问题及整改措施
2014/10/28 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
教师调动申请报告
2015/05/18 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript
python高温预警数据获取实例
2022/07/23 Python