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 相关文章推荐
让您的菜单不离网站
Oct 03 Javascript
JavaScript写的一个DIV 弹出网页对话框
Aug 14 Javascript
javascript 模式设计之工厂模式详细说明
May 10 Javascript
iframe实用操作锦集
Apr 22 Javascript
js实现class样式的修改、添加及删除的方法
Jan 20 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
Sep 10 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
浅谈angularJS中的事件
Jul 12 Javascript
js如何编写简单的ajax方法库
Aug 02 Javascript
详解JS模块导入导出
Dec 20 Javascript
javascript实现移动端轮播图
Dec 09 Javascript
原生JS实现音乐播放器
Jan 26 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
js 连续赋值的简单实现
2016/06/13 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
js实现加载页面就自动触发超链接的示例
2017/08/31 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
Python中optparser库用法实例详解
2018/01/26 Python
Python之list对应元素求和的方法
2018/06/28 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
Jar包的作用是什么
2014/03/30 面试题
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
小区门卫工作职责
2013/12/14 职场文书
教师产假请假条范文
2014/04/10 职场文书
运动员加油词
2015/07/18 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android