toggle和layer的显示和隐藏的动画不同步
dropdown-toggle和dropdown-layer的显示和隐藏的动画不同步什么原因?toggle比layer消失的慢
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>导航栏</title>
<link rel="stylesheet" href="./CSS/base.css">
<link rel="stylesheet" href="./CSS/common.css">
<link rel="stylesheet" href="./CSS/index.css">
</head>
<body>
<div class="nav-site">
<div class="wrap">
<ul class="fl">
<li class="fl"><a href="javascript:;" class="nav-site-login">亲,请登录</a></li>
<li class="fl"><a href="javascript:;" class="nav-site-signup link">免费注册</a></li>
<li class="fl"><a href="javascript:;" class="nav-site-mobile link">手机逛慕淘</a></li>
</ul>
<ul class="fr">
<li class="menu dropdown fl" data-active="menu">
<a href="###" target="_blank" class="dropdown-toggle link transition">我的慕淘<i class="dropdown-arrow transition icon"></i></a>
<ul class="dropdown-layer dropdown-left transition">
<li ><a href="###" target="_blank" class="menu-item">已买到的宝贝</a></li>
<li ><a href="###" target="_blank" class="menu-item">我的足迹</a></li>
</ul>
</li>
<li class="menu dropdown fl" data-active="menu">
<a href="###" target="_blank" class="dropdown-toggle link transition">收藏夹<i class="dropdown-arrow transition icon"></i></a>
<ul class="dropdown-layer dropdown-left">
<li ><a href="###" target="_blank" class="menu-item">收藏的宝贝</a></li>
<li><a href="###" target="_blank" class="menu-item">收藏的店铺</a></li>
</ul>
</li>
<li class="fl">
<a href="###" target="_blank" class="nav-site-category link">商品分类<i class="dropdown-arrow transition"></a>
</li>
<li class="menu dropdown fl" data-active="menu">
<a href="###" target="_blank" class="dropdown-toggle link transition">卖家中心<i class="dropdown-arrow transition icon"></i></a>
<ul class="dropdown-layer dropdown-left">
<li><a href="###" target="_blank" class="menu-item">免费开店</a></li>
<li><a href="###" target="_blank" class="menu-item">已卖出的宝贝</a></li>
<li><a href="###" target="_blank" class="menu-item">出售中的宝贝</a></li>
<li><a href="###" target="_blank" class="menu-item">卖家服务市场</a></li>
<li><a href="###" target="_blank" class="menu-item">卖家培训中心</a></li>
<li><a href="###" target="_blank" class="menu-item">体验中心</a></li>
</ul>
</li>
<li class="menu dropdown fl" data-active="menu">
<a href="###" target="_blank" class="dropdown-toggle link transition">联系客服<i class="dropdown-arrow transition icon"></i></a>
<ul class="dropdown-layer dropdown-right">
<li><a href="###" target="_blank" class="menu-item">消费者客服</a></li>
<li><a href="###" target="_blank" class="menu-item">卖家客服</a></li>
</ul>
</li>
</ul>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
window.jQuery||document.write('<script src="./JS/jquery.js"><\/script>');
</script>
<script src="./JS/transition.js"></script>
<script src="./JS/showHide.js"></script>
<script src="./JS/dorpdown.js"></script>
<script src="./JS/index.js"></script>
</body>
</html>commom.css
.wrap{
margin: 0 auto;
width: 1200px;
}
a.link{
color: #4d555d;
}
a.link:hover{
/* 链接经过的颜色 */
color: #f01414;
}
.menu .dropdown-toggle{
display: block;
height: 100%;
padding: 0 13px 0 12px;
border-left: 1px solid #f3f5f7;
border-right: 1px solid #f3f5f7;
}
.menu-item:hover {
background-color: #f3f5f7;
}
.menu-active .dropdown-toggle {
background-color: #fff;
border-color: #cdd0d4;
}
[class*="active"] .dropdown-arrow{
-o-transform: rotate(180deg);
-ms-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-webkit-transform: rotate(180deg);
transform: rotate(180deg);
}
.transition {
-o-transition: all 0.5s;
-ms-transition: all 0.5s;
-moz-transition: all 0.5s;
-webkit-transition: all 0.5s;
transition: all 0.5s;
}
@font-face {
font-family: 'iconfont';
src: url('../font/iconfont.eot');
src: url('../font/iconfont.eot') format('embedded-opentype'),
url('../font/iconfont.woff') format('woff'),
url('../font/iconfont.ttf') format('truetype'),
url('../font/iconfont.svg') format('svg');
}
.icon {
font-family: "iconfont" !important;
font-size: 14px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}
.menu-active .dropdown-layer {
display: block;
}
.fadeOut{
visibility: hidden !important;
opacity: 0 !important;
}
.slideUpDownCollapse{
height: 0 !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.slideLeftRightCollapse{
width: 0 !important;
padding-left: 0 !important;
padding-right: 0 !important;
}
.menu-active .dropdown-toggle {
background-color: #fff;
border-color: #cdd0d4;
}index.css
/* nav-site */
.nav-site{
width:100%;
background-color: #f3f5f7;
height: 45px;
}
.nav-site .wrap{
height: 44px;
line-height: 44px;
border-bottom: 1px solid #cdd0d4;
}
.nav-site-login{
color: #f01414;
margin-left:15px;
}
.nav-site-signup,.nav-site-mobile{
margin-left: 10px;
}
.nav-site-category{
margin:0 10px;
}
/* dropdown */
.dropdown{
position: relative;
}
.dropdown-arrow{
margin-left: 5px;
display: inline-block;
}
.dropdown-toggle{
display: block;
position: relative;
padding: 0 13px 0 12px;
border-left: 1px solid #f3f5f7;
border-right: 1px solid #f3f5f7;
border-color: #cdd0d4;
height: 100%;
}
.dropdown-layer{
position: absolute;
/* height: 100%; */
background-color: #fff;
border: 1px solid #cdd0d4;
/* border: 1px solid #828385; */
display:none;
overflow: hidden;
}
.menu-item{
display: block;
color: #4d555d;
height: 30px;
line-height: 30px;
padding: 0 12px;
white-space: nowrap;
/* border: 1px solid #cdd0d4; */
/* border-bottom: 1px solid #cdd0d4; */
}
.fr{
margin-right: 15px;
height: 44px;
}
.dropdown-left{
left:0;
}
.dropdown-right{
right:0;
}transition.js
(function () {
var transitionEndEventName={
transition:'transitionend',
MozTransition:'transitiond',
WebkitTransition:'WebkitTransitionEnd',
OTransition:'oTransitionEnd oTransitionend'
}
var transitionEnd=""
isSupport=false;
for(var name in transitionEndEventName){
if(document.body.style[name]!==undefined){
transitionEnd=transitionEnd[name];
isSupport=true;
break
}
}
window.mt=window.mt || {};
window.mt.transition = {
end:transitionEnd,
isSupport:isSupport
}
})()index.js
(function($) {
$(".dropdown").dropdown({
css:true,
js:true,
});
})(jQuery);dropdown.js
(function($) {
'use strict'
function Dropdown($elem,options){
this.$elem=$elem;
this.options=options;
this.$layer=this.$elem.find('.dropdown-layer')
this.activeClass=options.active+'-active'
this._init();
}
Dropdown.prototype._init=function () {
var self = this;
this.$layer.showHide(this.options);
this.$layer.on('show shown hide hidden',function(e){
self.$elem.trigger('dropdonw'+e.type);
});
if(this.options.event==='click'){
this.$elem.on('click',function (e) {
self.show();
e.stopPropagation();
});
$(document).on('click',this.hide,this);
}else{
this.$elem.hover($.proxy(this.show,this),$.proxy(this.hide,this));
}
}
Dropdown.prototype.show=function () {
var self = this;
if(this.options.delay){
this.timer=setTimeout( function() {
_show();
}, this.options.delay);
}else{
_show();
}
function _show(){
self.$elem.addClass(self.activeClass);
self.$layer.showHide('show');
}
}
Dropdown.prototype.hide=function () {
if(this.options.delay){
clearTimeout(this.timer);
}
this.$elem.removeClass(this.activeClass);
this.$layer.showHide('hide');
}
Dropdown.DEFAULTS={
event:"hover",
css3:'true',
js:'true',
animation:'fade',
delay:'0',
active:'dropdown'
};
$.fn.extend({
dropdown:function(option){
return this.each(function(){
var $this=$(this),
dropdown=$this.data('dropdown'),
options = $.extend({},Dropdown.DEFAULTS,$(this).data(),typeof option==='object'&&option);
if(!dropdown){
$this.data('dropdown',dropdown=new Dropdown($this,options));
}
if(typeof dropdown[option]==='function'){
dropdown[option]();
}
});
}
});
})(jQuery);showHide.js
13
收起
正在回答 回答被采纳积分+1
4回答
陈立天
2020-05-06 18:44:23
(function($) {
var transition =window.mt.transition;
// init公共部分
function init($elem,hiddenCallback){
if($elem.is(':hidden')){
$elem.data('status','hidde');
if(typeof hideCallback=='function') hiddenCallback();
}else{
$elem.data('status','shown');
}
}
// show公共部分
function show($elem,callback){
if ($elem.data('status')==='show') return;
if ($elem.data('status')==='shown') return;
$elem.data('status','show').trigger('show');
callback();
}
// hide公共部分
function hide($elem,callback){
if ($elem.data('status')==='hide') return;
if ($elem.data('status')==='hidden') return;
$elem.data('status','hide').trigger('hide');
callback();
}
// 正常显示和隐藏
var silent={
init:init,
show:function($elem){
show($elem,function(){
$elem.show();
$elem.data('status','shown').trigger('shown');
});
},
hide:function($elem){
hide($elem,function(){
$elem.hide();
$elem.data('status','hidden').trigger('hidden')
})
}
// silent结束
}
var css3={
// 淡入淡出
fade:{
init:function($elem){
css3._init($elem,'fadeOut');
},
show:function($elem){
css3._show($elem,'fadeOut');
},
hide:function($elem){
css3._hide($elem,'fadeOut');
}
},
// 上下滚动
slideUpDown:{
init:function($elem){
$elem.height($elem.height());
css3._init($elem,'sildeUpDownCollapse');
},
show:function($elem){
css3._show($elem,'sildeUpDownCollapse');
},
hide:function($elem){
css3._hide($elem,'sildeUpDownCollapse');
}
},
// 左右滚动
slideLeftRight:{
init:function(){
$elem.width($elem.width());
css3._init($elem,'slideLeftRightCollapse');
},
show:function($elem){
css3._show($elem,'slideLeftRightCollapse');
},
hide:function(){
css3._hide($elem,'slideLeftRightCollapse');
}
},
// 淡入淡出上下滚动
fadeslideUpDown:{
init:function(){
$elem.height($elem.height());
css3._init($elem,'fadeOut sildeUpDownCollapse');
},
show:function(){
css3.show($elem,'fadeOut sildeUpDownCollapse');
},
hide:function(){
css3.hide($elem,'fadeOut sildeUpDownCollapse');
}
},
// 淡入淡出左右滚动
fadeslideLeftRight:{
init:function(){
$elem.width($elem.width());
css3._init($elem,'fadeOut sildeLeftRightCollapse');
},
show:function(){
css3.show($elem,'fadeOut sildeLeftRightCollapse');
},
hide:function(){
css3.hide($elem,'fadeOut sildeLeftRightCollapse');
}
}
}
// CSS3结束
css3._init = function($elem,className){
$elem.addClass('transition');
init($elem,function(){
$elem.addClass(className)
});
};
css3._show=function($elem,className){
show($elem,function () {
$elem.off(transition.end).one(transition.end,function () {
$elem.data('status','shown').trigger('shown');
});
$elem.show();
setTimeout(function() {
$elem.removeClass(className);
}, 20);
})
}
css3._hide=function($elem,className){
hide($elem,function(){
$elem.off(transition.end).one(transition.end,function(){
$elem.data('status','hidden');
})
$elem.addClass(className);
})
}
var js={
fade:{
init:function($elem){
js._init($elem);
},
show:function($elem){
js._show($elem,'fadeIn');
},
hide:function($elem){
js._hide($elem,'fadeOut');
}
},
slideUpDown:{
init:function($elem){
js._init($elem);
},
show:function($elem){
js._show($elem,'slideUpDown');
},
hide:function($elem){
js._show($elem,'slideUpDown');
}
},
slideLeftRight:{
init:function($elem){
js._customInit($elem,{
'width':0,
'padding-left':0,
'padding-right':0
});
},
show:function($elem){
js._customShow($elem);
},
hide:function($elem){
js._customhide($elem,{
'width':0,
'padding-left':0,
'padding-right':0
})
}
},
fadeSlideUpDown:{
init:function($elem){
js._customInit($elem,{
'opacity': 0,
'height': 0,
'padding-top': 0,
'padding-bottom': 0
});
},
show:function($elem){
js._customShow($elem);
},
hide:function($elem){
js._customhide($elem,{
'opacity': 0,
'height': 0,
'padding-top': 0,
'padding-bottom': 0
})
}
},
fadeSlideLeftRight:{
init:function($elem){
js._customInit($elem,{
'opacity':0,
'width':0,
'padding-left':0,
'padding-right':0
});
},
show:function($elem){
js._customShow($elem);
},
hide:function($elem){
js._customhide($elem,{
'opacity':0,
'width':0,
'padding-left':0,
'padding-right':0
});
}
}
};
js._init=function($elem,hiddenCallBack){
$elem.removeClass('transition');
init($elem,hiddenCallBack)
}
js._show=function($elem,mode){
show($elem,function(){
$elem.stop()[mode](function(){
$elem.data('status','shown').trigger('shown');
});
});
}
js._hide=function($elem,mode){
show($elem,function(){
$elem.stop()[mode](function(){
$elem.data('status','hidden').trigger('hidden');
});
});
}
js._customInit=function($elem,options){
var styles={};
for(var p in options){
styles[p]=$elem.css(p);
}
$elem.data('styles',styles);
js._init($elem,function(){
$elem.css(options);
});
}
js._customShow=function($elem){
show($elem,function(){
$elem.show();
$elem.stop().animate($elem.data('styles'),function(){
$elem.data('status','shown').trigger('shown');
});
});
}
js._customHide=function($elem,options){
hide($elem,function(){
$elem.stop().animate(options,function(){
$elem.hide();
$elem.data('status','hidden').trigger('hidden')
})
})
}
var defaults={
css3:true,
js:true,
animation:'fade'
}
function showHide($elem,options){
var mode=null;
if(options.css3 && transition.isSupport){
mode=css3[options.animation]||css3[defaults.animation]
}else if(options.js){
mode=js[options.animation]||js[defaults.animation]
}else{
mode=silent;
}
mode.init($elem);
return{
show:$.proxy(mode.show,this,$elem),
hide:$.proxy(mode.hide,this,$elem)
}
}
$.fn.extend({
showHide:function(option){
return this.each(function(){
var $this=$(this),
options=$.extend({},defaults,typeof option ==='object'&& option),
mode=$this.data('showHide');
if(!mode){
$this.data('showHide',mode=showHide($this,options));
}
if(typeof mode[option]==='function'){
mode[option]();
}
});
}
});
})(jQuery);
好帮手慕慕子
2020-05-06 12:00:31
同学你好,可以去掉common.css中给layer设置display:block;属性,通过js设置下拉框显示。如下所示:

由于同学没有粘贴showHide.js文件,老师用源码测试下,经过上面的修改后就可以了。
但是因为toggle是直接通过css的过渡实现效果,layer的显示和隐藏是通过js控制添加删除类名实现效果,所以可能会有一定时间误差,不过这个并不影响效果的最终实现。
同学可以在隐藏下拉层时,添加一个定时器,适当的调整元素隐藏过程的时间,让效果实现的更美观,示例:

同学可以修改后,清除浏览器缓存再测试下,如果还有问题,可以将你的showHide.js文件也粘贴过来,老师在帮助同学测试下。
祝学习愉快~

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星