基于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:以前写的xmlhttp池,代码
May 18 Javascript
date.parse在IE和FF中的区别
Jul 29 Javascript
JavaScript将数据转换成整数的方法
Jan 04 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 Javascript
浅析angularJS中的ui-router和ng-grid模块
May 20 Javascript
浅谈angular2路由预加载策略
Oct 04 Javascript
JS手机端touch事件计算滑动距离的方法示例
Oct 26 Javascript
js 数组详细操作方法及解析合集
Jun 01 Javascript
vue中使用props传值的方法
May 08 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
Nov 01 Javascript
微信小程序实现简单文字跑马灯
May 26 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数据类型之布尔型的介绍
2013/04/28 PHP
php的memcache类分享(memcache队列)
2014/03/26 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Python日志处理模块logging用法解析
2020/05/19 Python
python 实现客户端与服务端的通信
2020/12/23 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
计算机维护专业推荐信
2014/02/27 职场文书
《画风》教学反思
2014/04/16 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
python绘制箱型图
2021/04/27 Python
python区块链实现简版工作量证明
2022/05/25 Python