【问题标题】:Active CSS animation only when you scroll on the view of the specific div仅当您在特定 div 的视图上滚动时才激活 CSS 动画
【发布时间】:2017-06-20 22:46:09
【问题描述】:

我有一个用 CSS 和 HTML 制作的图表,在这个图表中有一个图表加载动画。我只想在滚动包含图表的 div 视图时启动此动画。

我只想在页面上的图表上收费,我知道我必须使用 javascript 但我是 JS 的初学者,所以我不知道是否可以做某事像这样。

这是图表的小提琴:

https://jsfiddle.net/matteous1/pdL0kbqk/

HTML

<ul class="chart">
  <li>
    <span style="height:5%; background: rgba(0, 102, 255, 0.80);" title="ActionScript"></span>
  </li>
  <li>
    <span style="height:70%; background: rgba(204, 51, 51, 0.80);" title="JavaScript"></span>
  </li>
  <li>
    <span style="height:50%; background: rgba(255, 186, 2, 0.80);" title="CoffeScript"></span>
  </li>
  <li>
    <span style="height:75%; background: rgba(0, 153, 102, 0.80);" title="HTML"></span>
  </li>
  <li>
    <span style="height:90%; background: rgba(0, 102, 255, 0.80);" title="HTML"></span>
  </li>
  <li>
    <span style="height:15%; background: rgba(204, 51, 51, 0.80);" title="HTML"></span>
  </li>
  <li>
    <span style="height:40%; background: rgba(255, 186, 2, 0.80);" title="HTML"></span>
  </li>
  <li>
    <span style="height:55%; background: rgba(0, 153, 102, 0.80);" title="HTML"></span>
  </li>
</ul>   

CSS

.chart {
  display: table;
  table-layout: fixed;
  width: 90%;
  /*max-width: 700px;*/
  height: 65%;
  margin: 0 auto;
  background-image: linear-gradient(to top, rgba(0, 0, 0, 0.1) 2%, rgba(0, 0, 0, 0) 2%);
  background-size: 100% 50px;
  background-position: left top;
}
.chart li {
  position: relative;
  display: table-cell;
  vertical-align: bottom;
  height: 200px;
}
.chart span {
  margin: 0 1em;
  display: block;
  /*background: rgba(209, 236, 250, 0.75);*/
  animation: draw 1s ease-in-out;
}
.chart span:before {
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  padding: 5px 1em 0;
  display: block;
  text-align: center;
  content: attr(title);
  word-wrap: break-word;
}

@keyframes draw {
  0% {
    height: 0;
  }
}

【问题讨论】:

    标签: javascript html css hidden


    【解决方案1】:

    您可以使用 onscroll 事件并检查元素是否在视口中

     document.addEventListener('DOMContentLoaded', function() {
        var charElem = document.querySelector('.chart');
    
        var isVisible = false;
        window.onscroll = function() {
          if(isElementInViewport(charElem) && !isVisible) {
            charElem.className += " anim";
            isVisible = true;
          }
        }
    
        function isElementInViewport (el) {
    
            //special bonus for those using jQuery
            if (typeof jQuery === "function" && el instanceof jQuery) {
                el = el[0];
            }
    
            var rect = el.getBoundingClientRect();
    
            return (
                rect.top >= 0 &&
                rect.left >= 0 &&
                rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */
                rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */
            );
        }
        });
    

    https://jsfiddle.net/karthick6891/pdL0kbqk/1/

    注意:视口代码中的元素引用自此链接How to tell if a DOM element is visible in the current viewport?

    【讨论】:

    • 您还可以使用某种类型的视图内插件。有很多。
    • @sheriffderek:是的,最初我想使用 jquery 编写答案并包含此类参考。但我不确定 OP 是否使用 jquery。
    • 这个解决方案很完美,但我不知道为什么它在我的网站上不起作用
    • 你可能没有先加载DOM(比如JS运行时页面还没有被读取)
    • 如果您使用的是 jquery,则在 dom.ready 中包含我的 sn-p,如果没有 jquery,则创建 document.addEventListener('DOMContentLoaded', fn, false);调用此处理程序中的所有内容
    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多