Sandbox

学習記録や試作したものを掲載しています

"JavaScript"のタグを含む記事(6)

JavaScript

非同期遷移を行うためのクラスを自作する

非同期遷移を行うためのクラスを自作する

非同期遷移を行うための Pjax クラスを自作した。
ブラウザバック・フォワードへの対応や、ページ遷移前のアンマウント処理、遷移後のマウント処理をカスタマイズできるように実装しており、メモリリークの防止にも配慮した。

以下、上から順に(1)フェードによる遷移、(2)CSS mask による遷移、(3)SVG animate による遷移。

JavaScript

スクロール量に応じた操作をするためのクラスを自作する

スクロール量に応じた操作をするためのクラスを自作する

GSAP の ScrollTrigger の仕組みを理解するため、同じような挙動をする ScrollTrigger クラスを作成した。

Demo: https://koji014-scroll-trigger.vercel.app

使用例

const box = document.querySelector('.box');

const trigger = new ScrollTrigger({
    trigger: '#trigger',
    start: '10% 10%',
    end: '70% 70%',
    markers: true,
    onEnter: () => console.log('🍎onEnter'),
    onLeave: () => console.log('🍐onLeave'),
    onEnterBack: () => console.log('🍎onEnterBack'),
    onLeaveBack: () => console.log('🍐onLeaveBack'),
    onToggle: () => console.log('🍇onToggle'),
    onUpdate: (self) => {
        const breakPoints = [0, 0.4, 0.8, 1];
        const lastIndex = breakPoints.length - 1;

        const normalizedProgress = breakPoints.map((bp, i, arr) => {
            if (i === 0) return 1.0;
            const prev = arr[i - 1];
            return Math.min(Math.max(0, (self.progress - prev) / (bp - prev)), 1);
        });

        const transform = {
            translateX: 200,
            translateY: 800,
            rotate: 360,
        };

        if (self.progress < breakPoints[1]) {
            box.style.transform = `
                translateY(${transform.translateY * normalizedProgress[1]}px)
                rotate(${transform.rotate * normalizedProgress[1]}deg)
            `;
        } else if (self.progress < breakPoints[2]) {
            box.style.transform = `
                translateX(${transform.translateX * normalizedProgress[2]}px)
                translateY(${transform.translateY}px)
                rotate(${transform.rotate}deg)
            `;
        } else {
            box.style.transform = `
                translateX(${transform.translateX}px)
                translateY(${transform.translateY}px)
                rotate(${transform.rotate}deg)
            `;
            box.style.backgroundColor = `rgb(
                ${Math.round(255 * (1 - normalizedProgress[lastIndex]))} 0 255 / 0.5
            )`;
        }
    },
});

JavaScript

カルーセルを自作する

カルーセルを自作する

Demo

https://koji014-carousel.vercel.app

const targetSelector = '.my-carousel';

new Carousel(targetSelector, {
    isLoop: true,
    autoInterval: 4000,
    autoPlay: true,
    showIndicators: true,
    label: '秋冬の景色',
    enableLiveRegion: true,
 });
// 共通設定(初期設定)
.carousel {
     --_slidesPerView: 1; // 1ビューあたりのスライド数
     --_slidesPerGroup: 1;  // 1度のスワイプで何枚分移動させるか
     --_spaceBetween: 0rem;  // スライド間の距離(単位:rem)
     --_speed: 0.4s; // スライドの遷移時間(単位: s)
     --_inner: 3.6rem; // スライド両脇の余白
}

// 個別設定 
.my-carousel {
     --_slidesPerView: 1;
     --_slidesPerGroup: 1;
     --_spaceBetween: 1rem;      

     @include gl.mq('md') {    
          --_slidesPerView: 2.5;
          --_slidesPerGroup: 2;
          --_spaceBetween: 2rem;
     } 
}

実装機能

  • ナビゲーションボタン(前へ・次へ)
    • 活性・非活性制御
  • インジケータ
  • ループ機能
  • 自動再生機能
    • 停止ボタン
    • スライドをマウスオーバーすると自動再生を停止
  • タブレット操作時のドラッグ対応
  • アクセシビリティ
    • aria-属性の自動付与
    • ライブリージョン

参考

関連

PHP

ToDo アプリをつくる(CRUD とトランザクションの練習)

ToDo アプリをつくる(CRUD とトランザクションの練習)

CRUD とトランザクションの練習として、ToDo アプリを作成した。

追加・編集・削除といった機能に加え、完了ステータスを JavaScript で監視することで、完了したタスクを別テーブルに移動(アーカイブ化)し、リアルタイムで表示が更新されるようにした。この操作にはトランザクションを使用し、途中で処理が失敗してもデータの整合性が保たれるようにした。

また、CRUD 操作において XSS, CSRF, SQLインジェクションの脆弱性対策を実施した。アーカイブ化における fetch を使用した非同期リクエストでは、HTML の meta タグから取得した CSRF トークンを X-CSRF-TOKEN ヘッダに付与し、サーバ側でそのトークンを検証している。

  • 1