这是一款jQuery和css3滑动显示面板特效插件。在你需要创建内容,又不适合使用tooltips时,你可能会创建一个新的页面。但是作为良好的用户体验,应该尽量避免页面的刷新。这时候,从侧边滑出一个面板将是很好的解决方案。

有很多网站都使用了这个解决方案。你可以去看看 Feedly Spotify web player

HTML结构

html结构相当简单,不多做解释。

<main class="cd-main-content">
  <!-- your main content here -->
</main>
 
<div class="cd-panel from-right">
  <header class="cd-panel-header">
    <h1>Title Goes Here</h1>
    <a href="#0" class="cd-panel-close">Close</a>
  </header>
 
  <div class="cd-panel-container">
    <div class="cd-panel-content">
      <!-- your side content here -->
    </div> <!-- cd-panel-content -->
  </div> <!-- cd-panel-container -->
</div> <!-- cd-panel -->
                

CSS样式

首先解释一下为什么要将header从panel容器中分离出来。我们为panel使用了一个CSS3 transformation(准确的说是 translateX )来使它滑动显示。使用CSS3 transformation要比改变position的左右位置的效果要好(参考:Why Moving Elements With Translate() Is Better Than Pos:abs Top/left)。header元素的位置是fixed 的,固定位置的元素再你对它们进行CSS3 transformation时会发生跳动。这是将header从panel容器中分离出来的原因。

.cd-panel {
  /*...*/
    visibility: hidden;
  transition: visibility 0s 0.6s;
}
 
.cd-panel.is-visible {
  visibility: visible;
  transition: visibility 0s 0s;
}
 
.cd-panel-header {
  /*...*/
  position: fixed;
  top: -50px;
  width: 90%;
  height: 50px;
  transition: top 0.3s 0s;
}
 
.is-visible .cd-panel-header {
  top: 0;
  transition: top 0.3s 0.3s;
}
 
.cd-panel-container {
  /*...*/
  position: fixed;
  width: 90%;
  height: 100%;
  top: 0;
  right: 0;
 
  transition-property: transform;
  transition-duration: 0.3s;
  transition-delay: 0.3s;
 
  transform: translate3d(100%, 0, 0);
}
 
.is-visible .cd-panel-container {
  transform: translate3d(0, 0, 0);
  transition-delay: 0s;
}
                

在上面的代码中注意观察transition-delay属性。当你在页面上使某些元素产生动画,这时如果你想要一些延时或者不同的transition/animation durations,那么transition-delay就派上用场了。如果你想了解更多关于animations 和 transitions的知识,请参阅:Google Material documentation

JAVASCRIPT

通过jQuery来为面板切换.is-visible 类使其显示和隐藏。

jQuery(document).ready(function($){
  //open the lateral panel
  $('.cd-btn').on('click', function(event){
    event.preventDefault();
    $('.cd-panel').addClass('is-visible');
  });
  //clode the lateral panel
  $('.cd-panel').on('click', function(event){
    if( $(event.target).is('.cd-panel') || $(event.target).is('.cd-panel-close') ) { 
      $('.cd-panel').removeClass('is-visible');
      event.preventDefault();
    }
  });
});