【问题标题】:animate scrolling with CSS3使用 CSS3 动画滚动
【发布时间】:2012-05-02 21:23:24
【问题描述】:

有没有办法用 CSS3 动画滚动?

这样的?

@-webkit-keyframes scrolltoview
{
    0%   { scrollTop: 0; }
    100% { scrollTop: 30%; }
}

如何在css中放入动画的起点在哪里?

【问题讨论】:

  • 不,因为在 css 中没有动画你甚至不能滚动。
  • 你能解释一下“动画滚动”是什么意思吗?滚动虽然很普通,但也是一种动画形式。您将如何进一步对其进行动画处理?
  • @Micha 你说得对,即使没有动画我也做不到。
  • @Anthony 假设你在一个 TextArea 的顶部并且你想将它(在你的代码中)滚动到底部,如果没有动画它只会跳到底部。有了动画,它就会顺利完成。以 iPhone 为例。

标签: javascript html css


【解决方案1】:

正如here 解释的那样,您可以使用margin-top 技巧并动态更新滚动位置来做到这一点。您可以查看demo。代码很简单:

// Define the variables
var easing, e, pos;
$(function(){
  // Get the click event
  $("#go-top").on("click", function(){
    // Get the scroll pos
    pos= $(window).scrollTop();
    // Set the body top margin
    $("body").css({
      "margin-top": -pos+"px",
      "overflow-y": "scroll", // This property is posed for fix the blink of the window width change 
    });
    // Make the scroll handle on the position 0
    $(window).scrollTop(0);
    // Add the transition property to the body element
    $("body").css("transition", "all 1s ease");
    // Apply the scroll effects
    $("body").css("margin-top", "0");
    // Wait until the transition end
    $("body").on("webkitTransitionEnd transitionend msTransitionEnd oTransitionEnd", function(){
      // Remove the transition property
      $("body").css("transition", "none");
    });
  });
});

@AndrewP 基于这个想法提供了一个不错的working example

【讨论】:

  • 是否有一种很好的方法来应用相同的效果,但通过使用像 #home 或 #services 这样的锚散列和此代码?
  • @GerbenVanDijk 我在这个方面已经很晚了,但我构建了我认为你所要求的(一个查找页面上锚点的每个链接并修改他们的点击以通过 CSS3 滚动的功能 + margin-top,测试到 IE 8):codepen.io/acusti/pen/bFBDr
  • @AndrewP 不幸的是,它在 Safari 7.0 中不起作用。它滚动但没有动画
  • @mente 当我修改或调整它时,您可能已经发现它处于尴尬的损坏状态。我刚刚在 Safari 7.0 (9537.71) 中再次检查了它以进行验证,它使滚动动画非常流畅。
  • @mente 敏锐地观察到!奇怪的是,它在编辑 CodePen 视图中对我有用,但它本身就坏了。从那以后,我已经一劳永逸地调试并修复了(我希望)这个问题。我试图在documentElement 上使用scrollTop,这在Safari 中失败了,即使它应该是标准方法。终于通过stackoverflow.com/questions/5371139/…找到了一个适用于Safari、Chrome、Firefox甚至IE 8的解决方案(cdpn.io/bFBDr
【解决方案2】:

css3 动画仅适用于 css 属性。这在 css 的范围内是不可能的。

【讨论】:

    【解决方案3】:

    我发现了一种更好的滚动动画方法,即使用 JavaScript 来翻译文档正文。在边距或位置上使用平移动画的优点是相当 well documented。底线是,在为元素制作动画时,GPU 总是会做得更好。

    这是一个示例,它从窗口顶部计算用户的当前位置,然后平滑地转换回窗口顶部。假设用户点击或触摸事件触发了 backToTop 函数。

    查看实际操作:https://antibland.github.io/starting_point/

    function whichTransitionEvent() {
      var t,
          el          = document.createElement('fakeelement'),
          transitions = {
            'transition':'transitionend',
            'OTransition':'oTransitionEnd',
            'MozTransition':'transitionend',
            'WebkitTransition':'webkitTransitionEnd'
         };
    
      for (t in transitions){
        if (el.style[t] !== undefined){
          return transitions[t];
        }
      }
    }
    
    function backToTop() {
      var pos_from_top  = window.scrollY,
          transitionend = whichTransitionEvent(),
          body          = document.querySelector("body");
    
      function scrollEndHandler() {
        window.scrollTo(0, 0);
        body.removeAttribute("style");
        body.removeEventListener(transitionend, scrollEndHandler);
      }
    
      body.style.overflowY = "scroll";
      window.scrollTop = 0;
    
      body.style.webkitTransition = 'all .5s ease';
      body.style.transition = 'all .5s ease';
    
      body.style.webkitTransform = "translateY(" + pos_from_top + "px)";
      body.style.transform = "translateY(" + pos_from_top + "px)";
    
      transitionend && body.addEventListener(transitionend, scrollEndHandler);
    }
    

    【讨论】:

    • 不要被赞成的票数搞糊涂了,使用 transform over margin-top 可以显着提高性能!
    【解决方案4】:

    我认为 css3 不可能做到这一点,但如果我正确理解您的问题,使用 jquery 就很容易。

    退房:

    http://demos.flesler.com/jquery/scrollTo/

    http://api.jquery.com/scroll/

    【讨论】:

    • 感谢您的回答。我知道它可以用 JQuery 来完成。
    【解决方案5】:

    这是一个非常简单的 .js 函数,用于动画 + 滚动网页。

    var Current_scroll_Y=0;
    var Target_scroll_Y=0;
    var scroll_Speed = 15;
    
    function animate_Scroll(Y)
    {
      Target_scroll_Y = Y;
      screen_Y = Math.floor(window.scrollY);
    
      //Scroll Down
      if(screen_Y<Y)
      {
        var myWindowScroll = setInterval(function(){ screen_Y = screen_Y+scroll_Speed;  if(screen_Y>=Target_scroll_Y){ clearInterval(myWindowScroll); return;}    window.scrollTo(0, screen_Y); }, 3);   
      }
      //Scroll Up
      if(screen_Y>Y)
      {
        var myWindowScroll = setInterval(function(){ screen_Y = screen_Y-scroll_Speed;  if(screen_Y<=Target_scroll_Y){ clearInterval(myWindowScroll); return;}    window.scrollTo(0, screen_Y); }, 3);  
      } 
    
    
    }//End animate_Scroll  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-18
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      相关资源
      最近更新 更多