监听元素进入视口的函数
Element.getBoundingClientRect() 方法返回元素的大小及其相对于视口的位置。

通过这个方法可以判断元素是否在视口中,如果元素在视口中的话就执行函数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | isElementVisible(el, animationFn) {
 const rect = el.getBoundingClientRect()
 const vWidth = window.innerWidth || document.documentElement.clientWidth
 const vHeight = window.innerHeight || document.documentElement.clientHeight
 
 if(rect.right < 0 || rect.bottom < 0 || rect.left > vWidth || rect.top > vHeight) {
 return false
 } else {
 animationFn(el)
 }
 }
 
 | 
关于(rect.right < 0 || rect.bottom < 0 || rect.left > vWidth || rect.top > vHeight)判断的解释

css transition
html 结构
| 12
 3
 
 | <p class="brief-text slide-tran slide-bottom">牛津大学成立的确切日期尚不清楚,但该校的历史至少可以追溯到1096年。牛津大学位于伦敦西北约60英里处,该校大约45%的学生是研究生。一半以上的研究生把研究作为他们学习的一部分。牛津大学的研究在其所有四个学术部门进行:人文学科;数学、物理和生命科学;医学科学和社会科学。牛津大学的校历分为三个学期——米迦勒节(秋季)、希拉里节(春季)和三一节(夏季)——每个学期八周。大学的教学语言是英语。牛津大学包括一所中央大学,38所学院,还有六个永久性私人礼堂,它们的规模通常比大学还小,开设的科目更少。
 </p>
 
 | 
css 类名
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | .slide-tran {
 transition: all 0.6s;
 }
 
 .slide-bottom {
 transform: translateY(100px);
 opacity: 0;
 }
 
 .slide-top-in {
 opacity: 1;
 transform: translateY(0);
 }
 
 .slide-left {
 transform: translateX(-100px);
 opacity: 0;
 }
 
 .slide-right-in {
 opacity: 1;
 transform: translateX(0);
 }
 
 | 
页面滚动到元素的位置时,修改元素 class
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | slideFromBottom(el) {if(el.classList.contains('slide-top-in')) return
 el.classList.remove('slide-bottom')
 el.classList.add('slide-top-in')
 }
 slideFromLeft(el) {
 if(el.classList.contains('slide-right-in')) return
 el.classList.remove('slide-left')
 el.classList.add('slide-right-in')
 }
 
 | 
完整的 JavaScript 代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 
 | window.onload = () => {class PageSlideIn {
 constructor() {
 this.initPage();
 this.bindDocScroll();
 }
 
 initPage() {
 var that = this;
 var slideElements = document.querySelectorAll(".slide-tran");
 slideElements.forEach((el) => {
 if (el.classList.contains("slide-bottom")) {
 that.isElementVisible(el, that.slideFromBottom);
 } else if (el.classList.contains("slide-left")) {
 that.isElementVisible(el, that.slideFromLeft);
 }
 });
 }
 
 bindDocScroll() {
 var that = this;
 window.addEventListener("scroll", function () {
 that.isElementVisible(
 document.querySelector(".brief-text"),
 that.slideFromBottom
 );
 that.isElementVisible(
 document.querySelector(".brief-imgbox"),
 that.slideFromLeft
 );
 that.isElementVisible(
 document.querySelector(".advabox"),
 that.slideFromBottom
 );
 that.isElementVisible(
 document.querySelector(".prodbox"),
 that.slideFromLeft
 );
 that.isElementVisible(
 document.querySelector(".table"),
 that.slideFromBottom
 );
 });
 }
 
 isElementVisible(el, animationFn) {
 const rect = el.getBoundingClientRect();
 const vWidth = window.innerWidth || document.documentElement.clientWidth;
 const vHeight =
 window.innerHeight || document.documentElement.clientHeight;
 
 if (
 rect.right < 0 ||
 rect.bottom < 0 ||
 rect.left > vWidth ||
 rect.top > vHeight
 ) {
 return false;
 } else {
 animationFn(el);
 }
 }
 
 slideFromBottom(el) {
 if (el.classList.contains("slide-top-in")) return;
 el.classList.remove("slide-bottom");
 el.classList.add("slide-top-in");
 }
 slideFromLeft(el) {
 if (el.classList.contains("slide-right-in")) return;
 el.classList.remove("slide-left");
 el.classList.add("slide-right-in");
 }
 }
 new PageSlideIn();
 };
 
 | 
Codepen