基于Masonry的网格瀑布流
效果展示
Demo
下载地址: https://download.csdn.net/download/qq_39668819/12460677
编码实现
js依赖:这三个js由于篇幅问题,就不在本文中引入了,可以自行下载;或者直接下载我的demo。
<script src="js/imagesloaded.pkgd.min.js"></script>
<script src="js/masonry.pkgd.min.js"></script>
<script src="js/anime.min.js"></script>
anime.html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>基于Masonry的网格瀑布流加载动画特效</title>
<link href="https://fonts.googleapis.com/css?family=Roboto+Mono:300,500,700" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="./css/normalize.css"/>
<link rel="stylesheet" type="text/css" href="./css/anime.css"/>
<script>document.documentElement.className = 'js';</script>
</head>
<body class="loading">
<svg class="">
<symbol id="icon-arrow" viewBox="0 0 24 24">
<title>arrow</title>
<polygon points="6.3,12.8 20.9,12.8 20.9,11.2 6.3,11.2 10.2,7.2 9,6 3.1,12 9,18 10.2,16.8 "/>
</symbol>
<symbol id="icon-drop" viewBox="0 0 24 24">
<title>drop</title>
<path d="M12,21c-3.6,0-6.6-3-6.6-6.6C5.4,11,10.8,4,11.4,3.2C11.6,3.1,11.8,3,12,3s0.4,0.1,0.6,0.3c0.6,0.8,6.1,7.8,6.1,11.2C18.6,18.1,15.6,21,12,21zM12,4.8c-1.8,2.4-5.2,7.4-5.2,9.6c0,2.9,2.3,5.2,5.2,5.2s5.2-2.3,5.2-5.2C17.2,12.2,13.8,7.3,12,4.8z"/>
<path d="M12,18.2c-0.4,0-0.7-0.3-0.7-0.7s0.3-0.7,0.7-0.7c1.3,0,2.4-1.1,2.4-2.4c0-0.4,0.3-0.7,0.7-0.7c0.4,0,0.7,0.3,0.7,0.7C15.8,16.5,14.1,18.2,12,18.2z"/>
</symbol>
</svg>
<main>
<div class="content content--side content--right">
<div class="control control--effects">
<span class="control__title">run effect</span>
<button class="control__btn" data-fx="Hapi">Hapi</button>
<button class="control__btn" data-fx="Amun">Amun</button>
<button class="control__btn" data-fx="Kek">Kek</button>
<button class="control__btn" data-fx="Isis">Isis</button>
<button class="control__btn" data-fx="Montu">Montu</button>
<button class="control__btn" data-fx="Osiris">Osiris</button>
<button class="control__btn" data-fx="Satet">Satet</button>
<button class="control__btn" data-fx="Atum">Atum</button>
<button class="control__btn" data-fx="Ra">Ra</button>
<button class="control__btn" data-fx="Sobek">Sobek</button>
<button class="control__btn" data-fx="Ptah">Ptah</button>
<button class="control__btn" data-fx="Bes">Bes</button>
<button class="control__btn" data-fx="Seker">Seker</button>
<button class="control__btn" data-fx="Nut">Nut</button>
<button class="control__btn" data-fx="Shu">Shu</button>
</div>
</div>
<!--瀑布流图片-->
<div class="content content--center">
<div id="grid--type" class="grid grid--type">
</div>
</div>
</main>
<script src="../../../statics/plug-in/hexo/js/jquery.min.js"></script>
<script type="text/javascript">
loading();
function loading() {
var data = '<div class="grid__sizer"></div>';
for (var i = 0; i < 197; i++) {
data += '<div class="grid__item">'
+'<a class="grid__link" href="#"><img class="grid__img" src="./img/webp/akieay_cartoon'+i+'.webp" alt="Some image"/></a>'
+' </div>'
}
$("#grid--type").html(data);
}
</script>
<script src="js/imagesloaded.pkgd.min.js"></script>
<script src="js/masonry.pkgd.min.js"></script>
<script src="js/anime.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>
normalize.css
article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {
display: block;
}
audio, canvas, video {
display: inline-block;
}
audio:not([controls]) {
display: none;
height: 0;
}
[hidden] {
display: none;
}
html {
font-family: sans-serif;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
}
a:focus {
outline: thin dotted;
}
a:active, a:hover {
outline: 0;
}
h1 {
font-size: 2em;
margin: 0.67em 0;
}
abbr[title] {
border-bottom: 1px dotted;
}
b, strong {
font-weight: bold;
}
dfn {
font-style: italic;
}
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
mark {
background: #ff0;
color: #000;
}
code, kbd, pre, samp {
font-family: monospace, serif;
font-size: 1em;
}
pre {
white-space: pre-wrap;
}
q {
quotes: "\201C" "\201D" "\2018" "\2019";
}
small {
font-size: 80%;
}
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
img {
border: 0;
}
svg:not(:root) {
overflow: hidden;
}
figure {
margin: 0;
}
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
legend {
border: 0;
padding: 0;
}
button, input, select, textarea {
font-family: inherit;
font-size: 100%;
margin: 0;
}
button, input {
line-height: normal;
}
button, select {
text-transform: none;
}
button, html input[type="button"], input[type="reset"], input[type="submit"] {
-webkit-appearance: button;
cursor: pointer;
}
button[disabled], html input[disabled] {
cursor: default;
}
input[type="checkbox"], input[type="radio"] {
box-sizing: border-box;
padding: 0;
}
input[type="search"] {
-webkit-appearance: textfield;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
button::-moz-focus-inner, input::-moz-focus-inner {
border: 0;
padding: 0;
}
textarea {
overflow: auto;
vertical-align: top;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
anime.css
*,
*::after,
*::before {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
body {
font-family: 'Roboto Mono', monospace;
font-size: 14px;
font-weight: 500;
color: #82888a;
background: #2c2d31;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
}
.js .loading::before,
.js .loading::after {
content: '';
position: fixed;
z-index: 1000;
}
.loading::before {
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #2c2d31;
}
.loading::after {
top: 50%;
left: 50%;
width: 40px;
height: 40px;
margin: -20px 0 0 -20px;
border: 8px solid #383a41;
border-bottom-color: #565963;
border-radius: 50%;
animation: animLoader 0.8s linear infinite forwards;
}
@keyframes animLoader {
to { transform: rotate(360deg); }
}
a {
text-decoration: none;
color: #f2f2f2;
outline: none;
}
a:hover,
a:focus {
color: #e6629a;
}
.hidden {
position: absolute;
overflow: hidden;
width: 0;
height: 0;
pointer-events: none;
}
main {
display: flex;
flex-wrap: wrap;
}
/* Icons */
.icon {
display: block;
width: 1.5em;
height: 1.5em;
margin: 0 auto;
fill: currentColor;
}
.content--side {
position: relative;
z-index: 100;
width: 15vw;
min-width: 130px;
max-height: 100vh;
padding: 0 1em;
order: 2;
}
.content--center {
flex: 1;
max-width: calc(100vw - 260px);
order: 3;
margin-top: 10px;
}
.content--right {
order: 4;
}
.content--related {
display: flex;
flex-wrap: wrap;
justify-content: center;
width: 100%;
padding: 8em 1em 3em;
text-align: center;
order: 5;
}
.media-related {
width: 100%;
}
.media-item {
padding: 1em;
}
.media-item__img {
max-width: 100%;
opacity: 0.7;
transition: opacity 0.3s;
}
.media-item:hover .media-item__img,
.media-item:focus .media-item__img {
opacity: 1;
}
.media-item__title {
font-size: 1em;
max-width: 220px;
padding: 0.5em;
margin: 0 auto;
}
/* Header */
.codrops-header {
position: relative;
z-index: 100;
display: flex;
align-items: center;
width: 100%;
padding: 3em 1em 4em;
order: 1;
}
.codrops-header__title {
font-size: 1em;
font-weight: normal;
flex: 1;
margin: 0 7em 0 0;
text-align: center;
text-transform: lowercase;
}
.codrops-header__title::before,
.codrops-header__title::after {
font-size: 22px;
font-weight: bold;
display: inline-block;
padding: 0 0.25em;
color: #42454c;
}
.codrops-header__title::after {
content: '\2309';
vertical-align: sub;
}
.codrops-header__title::before {
content: '\230A';
}
/* GitHub corner */
.github-corner {
position: absolute;
top: 0;
right: 0;
}
.github-corner__svg {
fill: #82888a;
color: #2c2d31;
position: absolute;
top: 0;
border: 0;
right: 0;
}
.github-corner:hover .octo-arm {
animation: octocat-wave 560ms ease-in-out;
}
@keyframes octocat-wave {
0%,
100% {
transform: rotate(0);
}
20%,
60% {
transform: rotate(-25deg);
}
40%,
80% {
transform: rotate(10deg);
}
}
@media (max-width:500px) {
.github-corner:hover .octo-arm {
animation: none;
}
.github-corner .octo-arm {
animation: octocat-wave 560ms ease-in-out;
}
}
/* Top Navigation Style */
.codrops-links {
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
height: 2.75em;
margin: 0 0 0 2.25em;
text-align: center;
white-space: nowrap;
background: #1f2125;
}
.codrops-links::after {
content: '';
position: absolute;
top: -10%;
left: calc(50% - 1px);
width: 2px;
height: 120%;
background: #2c2d31;
transform: rotate3d(0,0,1,22.5deg);
}
.codrops-icon {
display: inline-block;
padding: 0 0.65em;
}
/* Controls */
.control--grids {
margin: 0 0 2.5em;
text-align: right;
}
.control__title {
font-size: 0.85em;
display: block;
width: 100%;
margin: 0 0 1em;
color: #e6629a;
}
.control__item {
position: relative;
display: block;
margin: 0 0 0.5em;
}
.control__radio {
position: absolute;
z-index: 10;
top: 0;
left: 0;
width: 100%;
height: 100%;
cursor: pointer;
opacity: 0;
}
.control__label {
white-space: nowrap;
}
.control__radio:checked + .control__label {
color: #fff;
background: #673ab7;
}
.control__radio:not(:checked):hover + .control__label,
.control__btn:hover {
color: white;
}
.control__btn {
display: block;
width: 100%;
margin: 0 0 0.5em;
padding: 0;
text-align: left;
color: inherit;
border: none;
background: none;
}
.control__btn:focus {
outline: none;
}
/* Grid */
.grid {
position: relative;
z-index: 2;
display: block;
margin: 0 auto;
width: 75%;
margin: 20px auto;
}
.grid--hidden {
position: fixed !important;
z-index: 1;
top: 0;
left: 0;
width: 100%;
pointer-events: none;
opacity: 0;
}
.js .grid--loading::before,
.js .grid--loading::after {
content: '';
z-index: 1000;
}
.js .grid--loading::before {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: #2c2d31;
}
.js .grid--loading::after {
position: absolute;
top: calc(25vh - 20px);
left: 50%;
width: 40px;
height: 40px;
margin: 0 0 0 -20px;
border: 8px solid #383a41;
border-bottom-color: #565963;
border-radius: 50%;
animation: animLoader 0.8s linear forwards infinite;
}
.grid__sizer {
margin-bottom: 0 !important;
}
.grid__link,
.grid__img {
display: block;
border-radius: 6px;
}
.grid__img {
width: 100%;
}
.grid__deco {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
}
.grid__deco path {
fill: none;
stroke: #fff;
stroke-width: 2px;
}
.grid__reveal {
position: absolute;
z-index: 50;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
opacity: 0;
background-color: #2c2d31;
}
.grid .grid__item,
.grid .grid__sizer {
width: calc(50% - 20px);
margin: 0 10px 20px;
}
@media screen and (min-width: 60em) {
.grid .grid__item,
.grid .grid__sizer {
width: calc((100% / 3) - 20px);
margin: 0 10px 20px;
}
}
@media screen and (min-width: 70em) {
.grid .grid__item,
.grid .grid__sizer {
width: calc(25% - 30px);
margin: 0 15px 30px;
}
.grid--type .grid__item,
.grid--type .grid__sizer {
width: calc(25% - 16px);
margin: 3px 3px;
border-radius: 8px;
}
}
@media screen and (max-width: 50em) {
main {
display: block;
}
.codrops-header {
padding: 1em;
flex-wrap: wrap;
}
.codrops-links {
margin: 0;
}
.codrops-header__title {
width: 100%;
text-align: left;
flex: none;
margin: 1em 0;
}
.content--side {
width: 100%;
}
.content--right {
order: 3;
}
.content--center {
max-width: 100vw;
}
.control {
margin: 0 0 1em;
text-align: left;
}
.control__item,
.control__btn {
display: inline-block;
}
.control__btn {
width: auto;
}
}
main.js
;(function(window) {
/**
* GridLoaderFx obj.
*/
function GridLoaderFx(el, options) {
this.el = el;
this.items = this.el.querySelectorAll('.grid__item > .grid__link');
}
/**
* Effects.
*/
GridLoaderFx.prototype.effects = {
'Hapi': {
animeOpts: {
duration: function(t,i) {
return 600 + i*75;
},
easing: 'easeOutExpo',
delay: function(t,i) {
return i*50;
},
opacity: {
value: [0,1],
easing: 'linear'
},
scale: [0,1]
}
},
'Amun': {
// Sort target elements function.
sortTargetsFn: function(a,b) {
var aBounds = a.getBoundingClientRect(),
bBounds = b.getBoundingClientRect();
return (aBounds.left - bBounds.left) || (aBounds.top - bBounds.top);
},
animeOpts: {
duration: function(t,i) {
return 500 + i*50;
},
easing: 'easeOutExpo',
delay: function(t,i) {
return i * 20;
},
opacity: {
value: [0,1],
duration: function(t,i) {
return 250 + i*50;
},
easing: 'linear'
},
translateY: [400,0]
}
},
'Kek': {
sortTargetsFn: function(a,b) {
return b.getBoundingClientRect().left - a.getBoundingClientRect().left;
},
animeOpts: {
duration: 800,
easing: [0.1,1,0.3,1],
delay: function(t,i) {
return i * 20;
},
opacity: {
value: [0,1],
duration: 600,
easing: 'linear'
},
translateX: [-500,0],
rotateZ: [15,0]
}
},
'Isis': {
animeOpts: {
duration: 900,
elasticity: 500,
delay: function(t,i) {
return i*15;
},
opacity: {
value: [0,1],
duration: 300,
easing: 'linear'
},
translateX: function() {
return [anime.random(0,1) === 0 ? 100 : -100,0];
},
translateY: function() {
return [anime.random(0,1) === 0 ? 100 : -100,0];
}
}
},
'Montu': {
perspective: 800,
origin: '50% 0%',
animeOpts: {
duration: 1500,
elasticity: 400,
delay: function(t,i) {
return i*75;
},
opacity: {
value: [0,1],
duration: 1000,
easing: 'linear'
},
rotateX: [-90,0]
}
},
'Osiris': {
perspective: 3000,
animeOpts: {
duration: function() {
return anime.random(500,1000)
},
easing: [0.2,1,0.3,1],
delay: function(t,i) {
return i*50;
},
opacity: {
value: [0,1],
duration: 700,
easing: 'linear'
},
translateZ: {
value: [-3000,0],
duration: 1000
},
rotateY: ['-1turns',0]
}
},
'Satet': {
animeOpts: {
duration: 800,
elasticity: 600,
delay: function(t,i) {
return i*100;
},
opacity: {
value: [0,1],
duration: 600,
easing: 'linear'
},
scaleX: {
value: [0.4,1]
},
scaleY: {
value: [0.6,1],
duration: 1000
}
}
},
'Atum': {
sortTargetsFn: function(a,b) {
var docScrolls = {top : document.body.scrollTop + document.documentElement.scrollTop},
y1 = window.innerHeight + docScrolls.top,
aBounds = a.getBoundingClientRect(),
ay1 = aBounds.top + docScrolls.top + aBounds.height/2,
bBounds = b.getBoundingClientRect(),
by1 = bBounds.top + docScrolls.top + bBounds.height/2;
return Math.abs(y1-ay1) - Math.abs(y1-by1);
},
perspective: 1000,
origin: '50% 0%',
animeOpts: {
duration: 800,
easing: [0.1,1,0.3,1],
delay: function(t,i) {
return i*35;
},
opacity: {
value: [0,1],
duration: 600,
easing: 'linear'
},
translateX: [100,0],
translateY: [-100,0],
translateZ: [400,0],
rotateZ: [10,0],
rotateX: [75,0]
}
},
'Ra': {
origin: '50% 0%',
animeOpts: {
duration: 500,
easing: 'easeOutBack',
delay: function(t,i) {
return i * 100;
},
opacity: {
value: [0,1],
easing: 'linear'
},
translateY: [400,0],
scaleY: [
{value: [3,0.6], delay: function(t,i) {return i * 100 + 120;}, duration: 300, easing: 'easeOutExpo'},
{value: [0.6,1], duration: 1400, easing: 'easeOutElastic'}
],
scaleX: [
{value: [0.9,1.05], delay: function(t,i) {return i * 100 + 120;}, duration: 300, easing: 'easeOutExpo'},
{value: [1.05,1], duration: 1400, easing: 'easeOutElastic'}
]
}
},
'Sobek': {
animeOpts: {
duration: 600,
easing: 'easeOutExpo',
delay: function(t,i) {
return i*100;
},
opacity: {
value: [0,1],
duration: 100,
easing: 'linear'
},
translateX: function(t,i) {
var docScrolls = {left : document.body.scrollLeft + document.documentElement.scrollLeft},
x1 = window.innerWidth/2 + docScrolls.left,
tBounds = t.getBoundingClientRect(),
x2 = tBounds.left +docScrolls.left + tBounds.width/2;
return [x1-x2,0];
},
translateY: function(t,i) {
var docScrolls = {top : document.body.scrollTop + document.documentElement.scrollTop},
y1 = window.innerHeight + docScrolls.top,
tBounds = t.getBoundingClientRect(),
y2 = tBounds.top + docScrolls.top + tBounds.height/2;
return [y1-y2,0];
},
rotate: function(t,i) {
var x1 = window.innerWidth/2,
tBounds = t.getBoundingClientRect(),
x2 = tBounds.left + tBounds.width/2;
return [x2 < x1 ? 90 : -90,0];
},
scale: [0,1]
}
},
'Ptah': {
itemOverflowHidden: true,
sortTargetsFn: function(a,b) {
return b.getBoundingClientRect().left - a.getBoundingClientRect().left;
},
origin: '100% 0%',
animeOpts: {
duration: 500,
easing: 'easeOutExpo',
delay: function(t,i) {
return i * 20;
},
opacity: {
value: [0,1],
duration: 400,
easing: 'linear'
},
rotateZ: [45,0]
}
},
'Bes': {
revealer: true,
revealerOrigin: '100% 50%',
animeRevealerOpts: {
duration: 800,
delay: function(t,i) {
return i*75;
},
easing: 'easeInOutQuart',
scaleX: [1,0]
},
animeOpts: {
duration: 800,
easing: 'easeInOutQuart',
delay: function(t,i) {
return i*75;
},
opacity: {
value: [0,1],
easing: 'linear'
},
scale: [0.8,1]
}
},
'Seker': {
revealer: true,
revealerOrigin: '50% 100%',
animeRevealerOpts: {
duration: 500,
delay: function(t,i) {
return i*50;
},
easing: [0.7,0,0.3,1],
translateY: [100,0],
scaleY: [1,0]
},
animeOpts: {
duration: 500,
easing: [0.7,0,0.3,1],
delay: function(t,i) {
return i*50;
},
opacity: {
value: [0,1],
duration: 400,
easing: 'linear'
},
translateY: [100,0],
scale: [0.8,1]
}
},
'Nut': {
revealer: true,
revealerColor: '#1d1d1d',
itemOverflowHidden: true,
animeRevealerOpts: {
easing: 'easeOutCubic',
delay: function(t,i) {
return i*100;
},
translateX: [
{value: ['101%','0%'], duration: 400 },
{value: ['0%','-101%'], duration: 400}
]
},
animeOpts: {
duration: 900,
easing: 'easeOutCubic',
delay: function(t,i) {
return 400+i*100;
},
opacity: {
value: 1,
duration: 1,
easing: 'linear'
},
scale: [0.8,1]
}
},
'Shu': {
lineDrawing: true,
animeLineDrawingOpts: {
duration: 800,
delay: function(t,i) {
return i*150;
},
easing: 'easeInOutSine',
strokeDashoffset: [anime.setDashoffset, 0],
opacity: [
{value: [0,1]},
{value: [1,0], duration: 200, easing: 'linear', delay:500}
]
},
animeOpts: {
duration: 800,
easing: [0.2,1,0.3,1],
delay: function(t,i) {
return i*150 + 800;
},
opacity: {
value: [0,1],
easing: 'linear'
},
scale: [0.5,1]
}
}
};
GridLoaderFx.prototype._render = function(effect) {
// Reset styles.
this._resetStyles();
var self = this,
effectSettings = this.effects[effect],
animeOpts = effectSettings.animeOpts
if( effectSettings.perspective != undefined ) {
[].slice.call(this.items).forEach(function(item) {
item.parentNode.style.WebkitPerspective = item.parentNode.style.perspective = effectSettings.perspective + 'px';
});
}
if( effectSettings.origin != undefined ) {
[].slice.call(this.items).forEach(function(item) {
item.style.WebkitTransformOrigin = item.style.transformOrigin = effectSettings.origin;
});
}
if( effectSettings.lineDrawing != undefined ) {
[].slice.call(this.items).forEach(function(item) {
// Create SVG.
var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
path = document.createElementNS('http://www.w3.org/2000/svg', 'path'),
itemW = item.offsetWidth,
itemH = item.offsetHeight;
svg.setAttribute('width', itemW + 'px');
svg.setAttribute('height', itemH + 'px');
svg.setAttribute('viewBox', '0 0 ' + itemW + ' ' + itemH);
svg.setAttribute('class', 'grid__deco');
path.setAttribute('d', 'M0,0 l' + itemW + ',0 0,' + itemH + ' -' + itemW + ',0 0,-' + itemH);
path.setAttribute('stroke-dashoffset', anime.setDashoffset(path));
svg.appendChild(path);
item.parentNode.appendChild(svg);
});
var animeLineDrawingOpts = effectSettings.animeLineDrawingOpts;
animeLineDrawingOpts.targets = this.el.querySelectorAll('.grid__deco > path');
anime.remove(animeLineDrawingOpts.targets);
anime(animeLineDrawingOpts);
}
if( effectSettings.revealer != undefined ) {
[].slice.call(this.items).forEach(function(item) {
var revealer = document.createElement('div');
revealer.className = 'grid__reveal';
if( effectSettings.revealerOrigin != undefined ) {
revealer.style.transformOrigin = effectSettings.revealerOrigin;
}
if( effectSettings.revealerColor != undefined ) {
revealer.style.backgroundColor = effectSettings.revealerColor;
}
item.parentNode.appendChild(revealer);
});
var animeRevealerOpts = effectSettings.animeRevealerOpts;
animeRevealerOpts.targets = this.el.querySelectorAll('.grid__reveal');
animeRevealerOpts.begin = function(obj) {
for(var i = 0, len = obj.animatables.length; i < len; ++i) {
obj.animatables[i].target.style.opacity = 1;
}
};
anime.remove(animeRevealerOpts.targets);
anime(animeRevealerOpts);
}
if( effectSettings.itemOverflowHidden ) {
[].slice.call(this.items).forEach(function(item) {
item.parentNode.style.overflow = 'hidden';
});
}
animeOpts.targets = effectSettings.sortTargetsFn && typeof effectSettings.sortTargetsFn === 'function' ? [].slice.call(this.items).sort(effectSettings.sortTargetsFn) : this.items;
anime.remove(animeOpts.targets);
anime(animeOpts);
};
GridLoaderFx.prototype._resetStyles = function() {
this.el.style.WebkitPerspective = this.el.style.perspective = 'none';
[].slice.call(this.items).forEach(function(item) {
var gItem = item.parentNode;
item.style.opacity = 0;
item.style.WebkitTransformOrigin = item.style.transformOrigin = '40% 60%';
item.style.transform = 'none';
var svg = item.parentNode.querySelector('svg.grid__deco');
if( svg ) {
gItem.removeChild(svg);
}
var revealer = item.parentNode.querySelector('.grid__reveal');
if( revealer ) {
gItem.removeChild(revealer);
}
gItem.style.overflow = '';
});
};
window.GridLoaderFx = GridLoaderFx;
var body = document.body,
grids = [].slice.call(document.querySelectorAll('.grid')), masonry = [],
currentGrid = 0,
// Switch grid radio buttons.
switchGridCtrls = [].slice.call(document.querySelectorAll('.control__radio')),
// Choose effect buttons.
fxCtrls = [].slice.call(document.querySelectorAll('.control--effects > .control__btn')),
// The GridLoaderFx instances.
loaders = [],
loadingTimeout;
function init() {
// Preload images
imagesLoaded(body, function() {
// Initialize Masonry on each grid.
grids.forEach(function(grid) {
var m = new Masonry(grid, {
itemSelector: '.grid__item',
columnWidth: '.grid__sizer',
percentPosition: true,
transitionDuration: 0
});
masonry.push(m);
// Hide the grid.
grid.classList.add('grid--hidden');
// Init GridLoaderFx.
loaders.push(new GridLoaderFx(grid));
});
// Show current grid.
grids[currentGrid].classList.remove('grid--hidden');
//Initializes the image display animation
loaders[currentGrid]._render('Shu');
// Init/Bind events.
initEvents();
// Remove loading class from body
body.classList.remove('loading');
});
}
function initEvents() {
// Switching grids radio buttons.
switchGridCtrls.forEach(function(ctrl) {
ctrl.addEventListener('click', switchGrid);
});
// Effect selection.
fxCtrls.forEach(function(ctrl) {
ctrl.addEventListener('click', applyFx);
});
}
function switchGrid(ev) {
// Hide current grid.
grids[currentGrid].classList.add('grid--hidden');
// New grid.
var grid = grids.filter(function(obj) { return obj.classList.contains(ev.target.value); })[0];
// Update currentGrid.
currentGrid = grids.indexOf(grid);
// Show new grid.
grid.classList.remove('grid--hidden');
masonry[currentGrid].layout();
}
function applyFx(ev) {
// Simulate loading grid to show the effect.
clearTimeout(loadingTimeout);
grids[currentGrid].classList.add('grid--loading');
loadingTimeout = setTimeout(function() {
grids[currentGrid].classList.remove('grid--loading');
// Apply effect.
loaders[currentGrid]._render(ev.target.getAttribute('data-fx'));
}, 500);
}
//执行开始
init();
})(window);