基于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 struts 验证唯一标识(公用方法)
Mar 27 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
node.js中的buffer.slice方法使用说明
Dec 10 Javascript
javascript实现PC网页里的拖拽效果
Mar 14 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
May 05 Javascript
详解Jquery的事件操作和文档操作
Dec 19 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
May 11 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
Aug 31 Javascript
Vue.js实现备忘录功能
Jun 26 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
Oct 28 Javascript
vue中配置scss全局变量的步骤
Dec 28 Vue.js
简单理解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
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
js模拟支付宝密码输入框
2017/04/11 Javascript
vue绑定的点击事件阻止冒泡的实例
2018/02/08 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
广告设计应届生求职信
2014/03/01 职场文书
保险公司演讲稿
2014/09/02 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
幼儿园家长心得体会
2016/01/21 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android