为什么我运行jslideLeftRight时第一次是从中间展开,之后还上下铺开

来源:2-9 用js实现其他显示隐藏效果

慕用7018409

2020-07-11 11:40:57

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<style>
 .btnall{
 width:604px;
 height:100px;
 margin:0 auto;}
 .btn{
 width:300px;
 height:100px;
 float:left;
 background-color:green;
 border:1px solid black;
 }
 #box{
 width:602px;
 height:300px;
 background-color:red;
 margin:0 auto;
 display:none;
 }
 .transition{
 transition:all 1s; 
 }
 .fadeout{
 visibility:hidden;
 opacity:0;
 }
 .slideUpDown{
  height:0 !important;}
</style>
<body>
<div class="btnall">
 <button class="btn" id="btn1"></button>
 <button class="btn" id="btn2"></button>
 </div>
 <div class="" id="box"></div>
 <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.js"></script>
 <script>
 //发布订阅
 function init(e,hiddenback){
  if(e.is(':hidden')){
   e.data('status','hidden');
   if(typeof hiddenback==='function'){hiddenback();}
  
  }else{
   e.data('status','shown');
   
  }
 }
 
 function show(e,callback){
  if(e.data('status')==='show')return;
  if(e.data('status')==='shown')return;
  
  
  e.data('status','show').trigger('show');
  callback();
 }
 
 function hide(e,callback){
  if(e.data('status')==='hide')return;
  if(e.data('status')==='hidden')return;
  
  e.data('status','hide').trigger('hide');
  callback();
 }
 var silent={
   init:function(){},
   show:function(e){
    show(e,function(){
     e.show();
     e.data('status','shown').trigger('shown');
    })   
   },
   hide:function(e){
    
    hide(e,function(){
     e.hide();
     e.data('status','hidden').trigger('hidden');
    })
    
   }
   
 };
 
 var css3={
   fade:{
    init:function(e){
     css3._init(e,'fadeout');
    },
    show:function(e){
      css3._show(e,'fadeout');
    },
    hide:function(e){
      css3._hide(e,'fadeout');
    }
   },
   slideUpDown:{
    init:function(e){
     css3._init(e,'slideUpDown');
    },
    show:function(e){
     css3._show(e,'slideUpDown');
   },
    hide:function(e){
     css3._hide(e,'slideUpDown');
   }
   },
   slideLeftRight:{
    show:function(){
     
    },
    hide:function(){
     
    }
   },
   fadeSlideUpDown:{
    show:function(){
     
    },
    hide:function(){
     
    }
   },
   fadeSlideLeftRight:{
    show:function(){
     
    },
    hide:function(){
     
    }
   }
 };
 css3._init=function(e,className){
  e.addClass('transition');
  init(e,function(){
   e.addClass(className);
  });
 };

 
 css3._show=function(e,className){
  show(e,function(){
  e.off('transitionend').one('transitionend',function(){
    e.data('status','shown').trigger('shown');
   })
   e.show();
   setTimeout(function(){
    e.removeClass(className);},30);
  });
  };
 css3._hide=function(e,className){
  hide(e,function(){
  e.off('transitionend').one('transitionend',function(){
   
   e.data('status','hidden').trigger('hidden');
   e.hide();
  })
  
  setTimeout(function(){
   e.addClass(className);},30);
 
 });
 }; 
 var js={
   fade:{
    init:function(e){
     js._init(e);
    },
    show:function(e){
     js._show(e,'fadeIn')
    
    },
    hide:function(e){
     js._hide(e,'fadeOut')
   }
   },
   slideUpDown:{
    init:function(e){
     js._init(e);
    },
    show:function(e){
     js._show(e,'slideDown');    
    },
   hide:function(e){
    js._hide(e,'slideUp');
    }
   },
   slideLeftRight:{
       
    init:function(e){
     var styles={};
     
     styles['width']=e.css('width');
     styles['padding-left']=e.css('padding-left');
     styles['padding-right']=e.css('padding-right');
     
     e.data('styles',styles);
     
     e.removeClass('transition');
     
     init(e,function(){
      e.css({
       'width':0,
       'padding-left':0,
       'padding-right':0
      });
     });
    },
    show:function(e){
     var styles=e.data('styles');
     
     e.show();
     e.stop().animate({
      'width':styles['width'],
      'padding-left':styles['padding-left'],
      'padding-right':styles['padding-right']
     },function(){
      e.data('status','shown').trigger('shown');
     })
    },
    hide:function(e){
    var styles=e.data('styles');
     
     e.hide();
     e.stop().animate({
      'width':0,
      'padding-left':0,
      'padding-right':0
     },function(){
      e.data('status','hidden').trigger('hidden');
     });
    }
    
   }
 };
 
 js._init=function(e){
  e.removeClass('transition');
  init(e);
 }
 js._show=function(e,mode){
  show(e,function(){
   e.stop()[mode](function(){
    e.data('status','shown').trigger('shown');
   });
  });
 }
 js._hide=function(e,mode){
  hide(e,function(){
   e.stop()[mode](function(){
    e.data('status','hidden').trigger('hidden');
   });
  });
 }
 var box=$('#box');
 js.slideLeftRight.init(box);
 
 $('#btn1').on('click',function(){
  js.slideLeftRight.show(box);
 });
 $('#btn2').on('click',function(){
  js.slideUpDown.hide(box);
 });
 
 box.on('show shown',function(e){
  console.log(e.type);
  
 })
 box.on('hide hidden',function(e){
  console.log(e.type);
  
 })
 </script>
</body>
</html>


写回答

1回答

好帮手慕星星

2020-07-11

同学你好,因为第一次的时候box块宽度为0

http://img.mukewang.com/climg/5f09597809ad756006920061.jpg

又设置margin:0 auto;居中显示,所以效果看起来是从中间展开的。而第二次的时候div块有了宽度,只不过隐藏而已

http://img.mukewang.com/climg/5f09598d0904383a07130063.jpg

所以点击的时候是直接显示,没有上下展开的动画。

修改建议:

1、box盒子居中显示可以使用相对定位,这样就没有中间展开的动画了

http://img.mukewang.com/climg/5f095ac409271f8a03920263.jpg

2、如果想要每次点击显示都有动画,需要在点击的时候初始化box盒子宽度为0,因为隐藏的动画中没有改变宽度,改变的是高度

http://img.mukewang.com/climg/5f095af4097c7db004940189.jpg

自己再测试下,祝学习愉快!

0

0 学习 · 14456 问题

查看课程