如果您需要加载多个这样的图像,建议使用gsap.timeline()
.
const timeline = gsap.timeline({
scrollTrigger: {
start: 'top center',
toggleActions: "play none none reverse",
},
stagger: {
each: 0.2,
from: 'left',
},
});
timeline.from(trigger, {
y: -100,
opacity: 0,
ease: "power1.inOut",
});
由于GSAP不是基于Vue的,因此您不必坚持传递Vue元素.如果您确定多姆已加载(可以在mounted()
挂钩中假设),则您也可以将原生JS Select 器传递给to()
函数,因为这只会导致一个动画.要在多个动画之间插入延迟,您需要将许多元素传递给一个动画.
gsap.registerPlugin(ScrollTrigger);
gsap.to('.projectItem', {
scrollTrigger: {
start: 'top center',
toggleActions: "play none none reverse",
},
y: -100,
opacity: 1,
ease: "power1.inOut",
stagger: {
each: 0.2,
from: 'left',
},
});
我做了一个内联CDO示例.当图像进入可见区域时,它就会出现,当它离开可见区域时,它就会消失.
例#1
const { createApp } = Vue;
const GsapExample = {
props: {
titre: String,
type: String,
composition: Array,
outils: Array,
date: String,
image: String,
alt: String,
},
template: `
<div class="projectItem" ref="animtrigger">
<div class="column">
<div class="column-c-image">
<img :src="(image)" :alt="(alt)" class="image">
</div>
<div class="column-c-content">
<p>{{ titre }}</p>
<svg class="arrow" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.22438 17.9287C6.36591 18.0667 6.55676 18.1423 6.75438 18.1387C6.95141 18.1391 7.14109 18.064 7.28438 17.9287L16.6144 8.58994V16.6487C16.6144 17.0629 16.9502 17.3987 17.3644 17.3987C17.5658 17.4042 17.7608 17.3273 17.9042 17.1857C18.0477 17.0442 18.1272 16.8502 18.1244 16.6487V6.9165C18.1504 6.80241 18.1498 6.68188 18.1198 6.56444C18.0519 6.29871 17.8444 6.09121 17.5787 6.02334C17.4612 5.99335 17.3407 5.99275 17.2266 6.01873H7.49438C7.08017 6.01873 6.74438 6.35451 6.74438 6.76873C6.74438 7.18294 7.08017 7.51873 7.49438 7.51873H15.5644L6.22438 16.8587C6.08085 16.9997 6 17.1925 6 17.3937C6 17.5949 6.08085 17.7877 6.22438 17.9287Z" fill="black"/>
</svg>
</div>
</div>
</div>
`,
};
const app = createApp({
components: {
GsapExample,
},
mounted() {
gsap.registerPlugin(ScrollTrigger);
gsap.to('.projectItem', {
scrollTrigger: {
start: 'top center',
toggleActions: "play none none reverse",
},
y: -100,
opacity: 1,
ease: "power1.inOut",
stagger: {
each: 0.2,
from: 'left',
},
});
},
}).mount('#app');
.container {
margin-top: 300px; /* no need it, just added it for testing the appearance and disappearance */
display: flex;
flex-wrap: wrap;
gap: 50px;
}
.projectItem {
width: 200px;
opacity: 0;
}
.projectItem .column {
display: flex;
flex-direction: column;
gap: 0.2rem;
}
.projectItem .column .column-c-image {
object-fit: cover;
}
.projectItem .column .column-c-image .image {
width: 100%;
height: 200px;
object-fit: cover;
border-radius: 1rem;
}
.projectItem .column .column-c-content {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
width: 100%;
}
<script src="https://unpkg.com/vue@3.4/dist/vue.global.prod.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js"></script>
<div id="app">
<div class="container">
<gsap-example
v-for="number of [1, 2, 3, 4, 5, 6, 7, 8, 9]"
titre="Title"
type="Type"
:composition="['Composition1', 'Composition2']"
:outils="['Tool1', 'Tool2']"
date="2024-04-24"
:image="`https://picsum.photos/200/200?${number}`"
alt="Image Alt"
/>
</div>
</div>
例#2
const { createApp } = Vue;
const GsapExample = {
props: {
titre: String,
type: String,
composition: Array,
outils: Array,
date: String,
image: String,
alt: String,
},
template: `
<div class="projectItem" ref="animtrigger">
<div class="column">
<div class="column-c-image">
<img :src="(image)" :alt="(alt)" class="image">
</div>
<div class="column-c-content">
<p>{{ titre }}</p>
<svg class="arrow" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.22438 17.9287C6.36591 18.0667 6.55676 18.1423 6.75438 18.1387C6.95141 18.1391 7.14109 18.064 7.28438 17.9287L16.6144 8.58994V16.6487C16.6144 17.0629 16.9502 17.3987 17.3644 17.3987C17.5658 17.4042 17.7608 17.3273 17.9042 17.1857C18.0477 17.0442 18.1272 16.8502 18.1244 16.6487V6.9165C18.1504 6.80241 18.1498 6.68188 18.1198 6.56444C18.0519 6.29871 17.8444 6.09121 17.5787 6.02334C17.4612 5.99335 17.3407 5.99275 17.2266 6.01873H7.49438C7.08017 6.01873 6.74438 6.35451 6.74438 6.76873C6.74438 7.18294 7.08017 7.51873 7.49438 7.51873H15.5644L6.22438 16.8587C6.08085 16.9997 6 17.1925 6 17.3937C6 17.5949 6.08085 17.7877 6.22438 17.9287Z" fill="black"/>
</svg>
</div>
</div>
</div>
`,
};
const app = createApp({
components: {
GsapExample,
},
mounted() {
gsap.registerPlugin(ScrollTrigger);
// only need to create the timeline once
const timeline = gsap.timeline({
scrollTrigger: {
start: 'top center',
toggleActions: "play none none reverse",
},
stagger: {
each: 0.2,
from: 'left',
},
});
const triggers = document.querySelectorAll('.projectItem');
triggers.forEach((trigger, index) => {
timeline.from(trigger, {
y: -100,
opacity: 0,
ease: "power1.inOut",
});
});
},
}).mount('#app');
.container {
margin-top: 300px; /* no need it, just added it for testing the appearance and disappearance */
display: flex;
flex-wrap: wrap;
gap: 50px;
}
.projectItem {
width: 200px;
}
.projectItem .column {
display: flex;
flex-direction: column;
gap: 0.2rem;
}
.projectItem .column .column-c-image {
object-fit: cover;
}
.projectItem .column .column-c-image .image {
width: 100%;
height: 200px;
object-fit: cover;
border-radius: 1rem;
}
.projectItem .column .column-c-content {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
width: 100%;
}
<script src="https://unpkg.com/vue@3.4/dist/vue.global.prod.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/ScrollTrigger.min.js"></script>
<div id="app">
<div class="container">
<gsap-example
v-for="number of [1, 2, 3, 4, 5, 6, 7, 8, 9]"
titre="Title"
type="Type"
:composition="['Composition1', 'Composition2']"
:outils="['Tool1', 'Tool2']"
date="2024-04-24"
:image="`https://picsum.photos/200/200?${number}`"
alt="Image Alt"
/>
</div>
</div>