<div class="scroll-anim-23" id="js-scroll-anim-23">
<div class="scroll-anim-23__bg">
<div class="scroll-anim-23__bg-img"><img src="https://picsum.photos/id/1000/400/400" /></div>
<div class="scroll-anim-23__bg-img"><img src="https://picsum.photos/id/1001/400/400" /></div>
<div class="scroll-anim-23__bg-img"><img src="https://picsum.photos/id/1002/400/400" /></div>
<div class="scroll-anim-23__bg-img"><img src="https://picsum.photos/id/1003/400/400" /></div>
<div class="scroll-anim-23__bg-img"><img src="https://picsum.photos/id/1004/400/400" /></div>
</div>
<div class="scroll-anim-23__items">
<div class="scroll-anim-23__item">
<div class="scroll-anim-23__img"><img src="https://picsum.photos/id/1000/400/200" /></div>
<div class="scroll-anim-23__heading">見出し01</div>
<div class="scroll-anim-23__content">テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</div>
</div>
<div class="scroll-anim-23__item">
<div class="scroll-anim-23__img"><img src="https://picsum.photos/id/1001/400/200" /></div>
<div class="scroll-anim-23__heading">見出し02</div>
<div class="scroll-anim-23__content">テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</div>
</div>
<div class="scroll-anim-23__item">
<div class="scroll-anim-23__img"><img src="https://picsum.photos/id/1002/400/200" /></div>
<div class="scroll-anim-23__heading">見出し03</div>
<div class="scroll-anim-23__content">テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</div>
</div>
<div class="scroll-anim-23__item">
<div class="scroll-anim-23__img"><img src="https://picsum.photos/id/1003/400/200" /></div>
<div class="scroll-anim-23__heading">見出し04</div>
<div class="scroll-anim-23__content">テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</div>
</div>
<div class="scroll-anim-23__item">
<div class="scroll-anim-23__img"><img src="https://picsum.photos/id/1004/400/200" /></div>
<div class="scroll-anim-23__heading">見出し05</div>
<div class="scroll-anim-23__content">テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。</div>
</div>
</div>
</div>
.scroll-anim-23#js-scroll-anim-23
.scroll-anim-23__bg
each item in items
.scroll-anim-23__bg-img
img(src=item.img)
.scroll-anim-23__items
each item in items
.scroll-anim-23__item
.scroll-anim-23__img
img(src=item.spImg)
.scroll-anim-23__heading #{ item.heading }
.scroll-anim-23__content !{ item.content }
{
"items": [
{
"heading": "見出し01",
"content": "テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。",
"img": "https://picsum.photos/id/1000/400/400",
"spImg": "https://picsum.photos/id/1000/400/200"
},
{
"heading": "見出し02",
"content": "テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。",
"img": "https://picsum.photos/id/1001/400/400",
"spImg": "https://picsum.photos/id/1001/400/200"
},
{
"heading": "見出し03",
"content": "テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。",
"img": "https://picsum.photos/id/1002/400/400",
"spImg": "https://picsum.photos/id/1002/400/200"
},
{
"heading": "見出し04",
"content": "テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。",
"img": "https://picsum.photos/id/1003/400/400",
"spImg": "https://picsum.photos/id/1003/400/200"
},
{
"heading": "見出し05",
"content": "テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。<br>テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。テキストが入ります。",
"img": "https://picsum.photos/id/1004/400/400",
"spImg": "https://picsum.photos/id/1004/400/200"
}
]
}
$BLOCK_NAME: '.scroll-anim-23';
// 変数
$duration_default: 0.5s;
#{ $BLOCK_NAME } {
@include Mq(md) {
display: flex;
}
&__bg {
position: sticky;
top: 0;
display: none;
@include Mq(md) {
display: block;
width: 50%;
height: 100vh;
}
}
&__bg-img {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
opacity: 0;
transition: opacity $duration_default;
&.is-active {
opacity: 1;
}
& > img {
width: 100%;
max-width: 400px;
height: 100%;
object-fit: contain;
}
}
&__items {
@include Mq(md) {
width: 50%;
}
}
&__item {
& + & {
margin-top: 48px;
}
}
&__img {
max-width: 400px;
margin: 0 auto 16px;
@include Mq(md) {
display: none;
}
}
&__heading {
font-size: 24px;
}
&__content {
margin-top: 8px;
}
}
'use strict';
import { gsap } from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';
gsap.registerPlugin(ScrollTrigger);
export const scrollAnim23 = () => {
const anim = new Anim23('js-scroll-anim-23');
anim.init();
}
class Anim23 {
el: HTMLElement;
bgImgEls: NodeListOf<HTMLElement>;
itemEls: NodeListOf<HTMLElement>;
constructor(elId: string) {
this.el = document.getElementById(elId);
if (!this.el) return;
this.bgImgEls = this.el.querySelectorAll('.scroll-anim-23__bg-img');
this.itemEls = this.el.querySelectorAll('.scroll-anim-23__item');
}
/**
* 初期化
*/
init(): void {
if (!this.el) return;
this.scrollHandler();
}
/**
* 表示画像の切り替え
* @param index 画像の番号
*/
changeImg(index: number) {
[...this.bgImgEls].forEach(el => {
el.classList.remove('is-active');
});
this.bgImgEls[index].classList.add('is-active');
}
/**
* スクロール連動のイベント設定
*/
scrollHandler(): void {
const self = this;
[...this.itemEls].forEach((el, index) => {
ScrollTrigger.create({
trigger: el,
start: 'top 70%',
onEnter() {
self.changeImg(index);
},
onEnterBack() {
self.changeImg(index);
},
});
});
}
}
No notes defined.