如何使用 Vue 视口插件在可见的视口上触发功能

How to trigger function on viewport visible with Vue viewport plugin

我正在使用一个计数器来显示一些数字,但它们会在页面加载时加载,所以它会加载,除非我按下一些按钮来触发它。 找到了这个视口插件 (https://github.com/BKWLD/vue-in-viewport-mixin),但我无法使用它。这就是我需要做的,当我到达某个元素(完全)时触发一个函数,如何实现它?

您不一定需要软件包来执行此操作。添加一个事件监听器来监听滚动事件,并在每次有滚动事件时检查元素是否在视口中。下面的示例代码 - 请注意,我添加了一个动画来强调 "appear if in viewport" 效果。

Codepen here.

new Vue({
  el: '#app',
  created () {
    window.addEventListener('scroll', this.onScroll);
  },
  destroyed () {
    window.removeEventListener('scroll', this.onScroll);
  },
  data () {
    return {
      items: [
        1,
        2,
        3,
        4,
        5,
        6, 
        7, 
        8, 
        9, 
        10, 
        11, 
        12
      ],
      offsetTop: 0
    }
  },
  watch: {
    offsetTop (val) {
       this.callbackFunc()
    }
  },
  methods: {
    onScroll (e) {
      console.log('scrolling')
      this.offsetTop = window.pageYOffset || document.documentElement.scrollTop
    },
    isElementInViewport(el) {
      var rect = el.getBoundingClientRect();
      return (
        rect.top >= 0 &&
        rect.left >= 0 &&
        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
        rect.right <= (window.innerWidth || document.documentElement.clientWidth)
      );
    },
    callbackFunc() {
      let items = document.querySelectorAll(".card");
      for (var i = 0; i < items.length; i++) {
        if (this.isElementInViewport(items[i])) {
          items[i].classList.add("in-view");
        }
      }
    }
  }
})
.card {
  height: 100px;
  border: 1px solid #000;
  visibility: hidden;
  opacity: 0
}
.in-view {
  visibility: visible;
  opacity: 1;
  animation: bounce-appear .5s ease forwards;
}

@keyframes bounce-appear {
  0% {
    transform: translateY(-50%) translateX(-50%) scale(0);
  }
  90% {
    transform: translateY(-50%) translateX(-50%) scale(1.1);
  }
  100% {
    tranform: translateY(-50%) translateX(-50%) scale(1);
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app" onscroll="onScroll">
  <div v-for="item in items" class="card">
    {{item}}
  </div>
</div>

另一种选择是使用路口观察器——我还没有探索过这个,但这个教程看起来不错:鳄鱼。io/vuejs/lazy-image。请注意,您将需要一个用于 IE 的 polyfill。