【问题标题】:CSS 3 slide-in from left transitionCSS 3从左过渡滑入
【发布时间】:2013-06-04 02:01:31
【问题描述】:

是否有一个跨浏览器解决方案可以仅使用 CSS 而不使用 javascript 来生成滑入式过渡?以下是html内容的示例:

<div>
    <img id="slide" src="http://.../img.jpg />
</div>

【问题讨论】:

    标签: css css-transitions


    【解决方案1】:

    我喜欢 @mate64 的回答,所以我将重复使用它并稍作修改,在下面创建一个上下滑动动画:

    var $slider = document.getElementById('slider');
    var $toggle = document.getElementById('toggle');
    
    $toggle.addEventListener('click', function() {
        var isOpen = $slider.classList.contains('slide-in');
    
        $slider.setAttribute('class', isOpen ? 'slide-out' : 'slide-in');
    });
    #slider {
        position: absolute;
        width: 100px;
        height: 100px;
        background: blue;
        transform: translateY(-100%);
        -webkit-transform: translateY(-100%);
    }
    
    .slide-in {
        animation: slide-in 0.5s forwards;
        -webkit-animation: slide-in 0.5s forwards;
    }
    
    .slide-out {
        animation: slide-out 0.5s forwards;
        -webkit-animation: slide-out 0.5s forwards;
    }
        
    @keyframes slide-in {
        100% { transform: translateY(0%); }
    }
    
    @-webkit-keyframes slide-in {
        100% { -webkit-transform: translateY(0%); }
    }
        
    @keyframes slide-out {
        0% { transform: translateY(0%); }
        100% { transform: translateY(-100%); }
    }
    
    @-webkit-keyframes slide-out {
        0% { -webkit-transform: translateY(0%); }
        100% { -webkit-transform: translateY(-100%); }
    }
    <div id="slider" class="slide-in">
        <ul>
            <li>Lorem</li>
            <li>Ipsum</li>
            <li>Dolor</li>
        </ul>
    </div>
    
    <button id="toggle" style="position:absolute; top: 120px;">Toggle</button>

    【讨论】:

      【解决方案2】:

      这是另一种使用 css 转换的解决方案(出于手机性能目的,请参阅@mate64 的答案),而无需使用动画和关键帧。

      我创建了两个版本以从任一侧滑入。

      $('#toggle').click(function() {
        $('.slide-in').toggleClass('show');
      });
      .slide-in {
        z-index: 10; /* to position it in front of the other content */
        position: absolute;
        overflow: hidden; /* to prevent scrollbar appearing */
      }
      
      .slide-in.from-left {
        left: 0;
      }
      
      .slide-in.from-right {
        right: 0;
      }
      
      .slide-in-content {
        padding: 5px 20px;
        background: #eee;
        transition: transform .5s ease; /* our nice transition */
      }
      
      .slide-in.from-left .slide-in-content {
        transform: translateX(-100%);
        -webkit-transform: translateX(-100%);
      }
      
      .slide-in.from-right .slide-in-content {
        transform: translateX(100%);
        -webkit-transform: translateX(100%);
      }
      
      .slide-in.show .slide-in-content {
        transform: translateX(0);
        -webkit-transform: translateX(0);
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <div class="slide-in from-left">
        <div class="slide-in-content">
          <ul>
            <li>Lorem</li>
            <li>Ipsum</li>
            <li>Dolor</li>
          </ul>
        </div>
      </div>
      
      <div class="slide-in from-right">
        <div class="slide-in-content">
          <ul>
            <li>One</li>
            <li>Two</li>
            <li>Three</li>
          </ul>
        </div>
      </div>
      
      <button id="toggle" style="position:absolute; top: 120px;">Toggle</button>

      【讨论】:

        【解决方案3】:

        将此用于右向左滑动:

        HTML:

           <div class="nav ">
               <ul>
                <li><a href="#">HOME</a></li>
                <li><a href="#">ABOUT</a></li>
                <li><a href="#">SERVICES</a></li>
                <li><a href="#">CONTACT</a></li>
               </ul>
           </div>
        

        CSS:

        /*nav*/
        .nav{
            position: fixed;
            right:0;
            top: 70px;
            width: 250px;
            height: calc(100vh - 70px);
            background-color: #333;
            transform: translateX(100%);
            transition: transform 0.3s ease-in-out;
        
        }
        .nav-view{
            transform: translateX(0);
        }
        .nav ul{
            margin: 0;
            padding: 0;
        }
        .nav ul li{
            margin: 0;
            padding: 0;
            list-style-type: none;
        }
        .nav ul li a{
            color: #fff;
            display: block;
            padding: 10px;
            border-bottom: solid 1px rgba(255,255,255,0.4);
            text-decoration: none;
        }
        

        JS:

          $(document).ready(function(){
          $('a#click-a').click(function(){
            $('.nav').toggleClass('nav-view');
          });
        });
        

        【讨论】:

          【解决方案4】:

          使用 CSS3 2D transform 避免性能问题(移动)

          常见的陷阱是动画left/top/right/bottom 属性而不是使用 来实现相同的效果。由于各种原因,转换的语义使它们更容易卸载,但left/top/right/bottom 则要困难得多。

          来源:Mozilla Developer Network (MDN)


          演示:

          var $slider = document.getElementById('slider');
          var $toggle = document.getElementById('toggle');
          
          $toggle.addEventListener('click', function() {
              var isOpen = $slider.classList.contains('slide-in');
          
              $slider.setAttribute('class', isOpen ? 'slide-out' : 'slide-in');
          });
          #slider {
              position: absolute;
              width: 100px;
              height: 100px;
              background: blue;
              transform: translateX(-100%);
              -webkit-transform: translateX(-100%);
          }
          
          .slide-in {
              animation: slide-in 0.5s forwards;
              -webkit-animation: slide-in 0.5s forwards;
          }
          
          .slide-out {
              animation: slide-out 0.5s forwards;
              -webkit-animation: slide-out 0.5s forwards;
          }
              
          @keyframes slide-in {
              100% { transform: translateX(0%); }
          }
          
          @-webkit-keyframes slide-in {
              100% { -webkit-transform: translateX(0%); }
          }
              
          @keyframes slide-out {
              0% { transform: translateX(0%); }
              100% { transform: translateX(-100%); }
          }
          
          @-webkit-keyframes slide-out {
              0% { -webkit-transform: translateX(0%); }
              100% { -webkit-transform: translateX(-100%); }
          }
          <div id="slider" class="slide-in">
              <ul>
                  <li>Lorem</li>
                  <li>Ipsum</li>
                  <li>Dolor</li>
              </ul>
          </div>
          
          <button id="toggle" style="position:absolute; top: 120px;">Toggle</button>

          【讨论】:

            【解决方案5】:

            您可以使用 CSS3 过渡或 CSS3 动画来滑动元素。

            浏览器支持:http://caniuse.com/

            我做了两个简单的例子来说明我的意思。

            CSS 过渡(悬停时)

            Demo One

            相关代码

            .wrapper:hover #slide {
                transition: 1s;
                left: 0;
            }
            

            在这种情况下,我只是将位置从left: -100px; 转换为0;,并带有1。期间。也可以使用transform: translate();移动元素

            CSS 动画

            Demo Two

            #slide {
                position: absolute;
                left: -100px;
                width: 100px;
                height: 100px;
                background: blue;
                -webkit-animation: slide 0.5s forwards;
                -webkit-animation-delay: 2s;
                animation: slide 0.5s forwards;
                animation-delay: 2s;
            }
            
            @-webkit-keyframes slide {
                100% { left: 0; }
            }
            
            @keyframes slide {
                100% { left: 0; }
            }
            

            原理同上(Demo One),但动画2s后自动开始,本例我设置animation-fill-modeforwards,会保持结束状态,保持动画时div可见结束。

            就像我说的,两个简单的例子向您展示如何做到这一点。

            编辑: 有关 CSS 动画和过渡的详细信息,请参阅:

            动画

            https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_animations

            过渡

            https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_transitions

            希望这会有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-07-19
              • 2015-07-28
              • 1970-01-01
              • 2017-12-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多