基于Jquery的文章列表特效

1. 实现效果

类似于csdn个人博客,每篇文章都分成一个一个板块,我实现的功能是:随着浏览器滚动条往下滚动,每个文章div都以一个特效出现

2. 所需环境

<link rel="stylesheet" href="//cdn.bootcss.com/animate.css/3.5.1/animate.min.css">
<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js">script>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js">script>

3. 思路来源

诗酒趁年华 【有想开发自己博客的可以模仿一下他的博客,个人认为很好看】

主要是利用animation.css提供的动画 + js监控滚动条的滚动,当div刚出现的时候播放css动画

思路:

在滚动事件中监听每一个div到当前可视窗口最下边的距离,如果到一定的返回内,则设置div可见,并播放动画(通俗点说,等div马上要从底下出现的时候,就播放动画)

简单公式:(当前元素距离顶部的距离offset.top - 浏览器向上滚动的距离scrollTop) < 当前视口的高度, 但是这样有个问题,就是如果根据这个条件进行判断, 那么在当前元素还没露出就会播放动画, 用户体验不好, 于是设置一定的偏移量

4. 代码实现


<html>
	<head>
		<meta charset="utf-8">
		<title>title>
		<link rel="stylesheet" href="//cdn.bootcss.com/animate.css/3.5.1/animate.min.css">
         <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js">script>
         <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js">script>
		<style>
			* {
				margin: 0;
				padding: 0;
			}
			.article {
				width: 50%;
				position: relative;
				left: 50%;
				transform: translateX(-50%);
			}
			.animated {
				height: 150px;
				width: 100%;
				margin-bottom: 10px;
				background-color: green;
			}
			.hidden {
				visibility: hidden;
			}
		style>
	head>
	<body>
		<div class="article">
			<div class="animated">1div>
			<div class="animated">2div>
			<div class="animated">3div>
			<div class="animated">4div>
			<div class="animated">5div>
			<div class="animated">5div>
			<div class="animated">5div>
			<div class="animated">5div>
			<div class="animated">5div>
		div>
		<script>
			$(document).ready(function() {
				// 兼容已经在视口内的div,自动播放动画
				$(".animated").each(function() {
					if (isUnderViewPort($(this).offset().top, $(window).scrollTop(), $(window).height(), 0)) {
						$(this).css("visibitity", "visiable");
						$(this).addClass("bounceInLeft");
					}
				})

				// 监听滚动条,监控每一个div,如果div在视口之内,则播放动画
				let windowHeight = $(window).height();
				$(window).scroll(function() {
					const scrollTop = $(window).scrollTop();
					$(".animated").each(function() {
						const offsetTop = $(this).offset().top;
						if (isUnderViewPort(offsetTop, scrollTop, windowHeight, 30)) {
							$(this).css("visibitity", "visiable");
							$(this).addClass("bounceInLeft");
						}
					})
				})
			})
			/**
			 * 判断div是否在视口(通俗点说就是浏览器可见部分)内
			 * @param {Object} offsetTop dom距离顶部的距离
			 * @param {Object} scrollTop 滚动条滚动的距离
			 * @param {Object} viewportHeight 视口的高度(浏览器高度)
			 * @param {Object} offset 偏移
			 */
			function isUnderViewPort(offsetTop, scrollTop, viewportHeight, offset) {
				if (offsetTop - scrollTop < viewportHeight - offset) return true;
				return false;
			}
		script>
	body>
html>

5. 扩展

由于css动画库用的是animation.css, 因此可以将动画库提供的所有动画写到一个json文件或者一个数组中, 然后产生一些随机数作为动画数组下标, 随机数需要存入cookie中, 否则刷新后会消失,由此可以实现每次刷新效果都不同

你可能感兴趣的:(前端)