Webデザイナーの「あ、これ欲しかった!」を叶えるCusorレシピ集~JavaScript が苦手な方必見!~ | SkillhubAI(スキルハブエーアイ)

Webデザイナーの「あ、これ欲しかった!」を叶えるCusorレシピ集~JavaScript が苦手な方必見!~

無料AIチューター(先生)付きレッスンを体験してみましょう。
AI先生があなたの学習をサポートします。今なら無料のWeb/AI制作7講座が受講できます。 (限定100名、9月14日まで)

» 今すぐ無料講座をチェックする

普通のコーディングはできるけれど、JavaScriptを使うとなるとちょっと難しい。もしくは、時間がかかりすぎて嫌!というWebデザイナーさんもいらっしゃると思います。そこで今回はトップページやLPなどのWebページでよく使われるJavaScript(+CSS)をCursorのAIに作成してもらうレシピを公開します。

Cursorを使ってAIに半自動的にコードを生成してもらうので、コードの中身は完全に理解できなくてもOK。Webコーディングを学習中の方は、AIが書いたコードから気になる部分を調べても勉強になりますよ。

今回の内容と素材

今回はjQueryを使わず、JavaScript(vanilla JS)で「Webページでよく見かけるパーツや効果」を実装していきます。

ゼロからコーディングして、AIにJavaScriptを実装してもらう…というのは面倒ですし時間もかかるので、架空の動物園がテーマの素材(zooJS)をご用意しました。
今回はJavaScriptとCSSでのレシピになるため、前回の素材とはHTMLとCSSが異なります。

ダウンロード

ページを開くと下部が作りかけっぽくてギョッとするかもしれませんが、今回JavaScriptとCSSを使ったWebアイテムの実装を試す箇所になります。
ぜひ、素材を使って試してみてください!

1. Cursorでハンバーガーメニューを作ってみよう

素材サイトをスマホ幅で見てみると、ヘッダーメニュー(グローバルナビゲーション)の項目がそのまま並んでいます。 辛うじて見られる・タップできる…という感じですので、Cursorを活用してハンバーガーメニューに変更しましょう。
file

1-1. 下準備:JSファイルを用意

トークンの節約も兼ねて、JavaScriptを書いてもらうファイルを用意しておきましょう。 デモではファイル名をsrcipt.jsとして進めます。
file

1-2. AIチャットで依頼する

では、CursorのAIチャットを使ってコードの改善をしてもらいましょう。

  1. index.html<nav> ~ </nav>までを選択。
  2. ショートカットキーの CmdCtrl )+ L でAIチャットに移動。
  3. 生成してほしいコードの要件を入力し、送信します。

file

要件:
スマホ幅(768px以下)の場合のみ、nav.header-navをハンバーガーメニューにしたい。

条件:
- ハンバーガーアイコンの位置は、h1.header-logoと横並びで右寄せ。
- ハンバーガーアイコンをクリック/タップするとnav要素が上からスライドイン。
- JSコードはsrcipt.jsに記述する。
- CSSアニメーション付き、JSは最小限で。背景オーバーレイも追加。

少し待っていると、コードを生成してくれます。
file
どうなっているか、ブラウザで表示を見てみましょう。
file
う~ん…。
皆さんのAIはどんなコードを書いてくれましたか?

デモで試した際は上図のような表示…完ぺきとは言えない仕上がりでした。 デモで生成されたコードでは、「上からスライドイン」と書いたはずなのに右からスライドしてます(これでも良いといえば良いのですが)。メニューを開いた時の閉じるボタンもない、メニューの位置もズレているなど、問題があります。

1-3. 問題個所の確認・修正(AIもしくは手作業)

要望通りにならなかった場合は、追加でAIに指示を出すか、自分でコードを直す必要があります。

「どこを直したら良いかさっぱり…」というときは、そのままAIにチャットで気になる部分を伝えて直してもらってもOK。 分からないところを範囲選択して「ここは何の処理をしているの?」などと質問するとコードの解説もしてくれます。

ただ、全部AI任せにすると時間がかかったり、AIの生成トークンが底をつきて使えなくなったりする可能性があります。 AIに具体的な指示を出せるように問題個所を特定したり、自分で直せるところはパパっと直しちゃうと確実。
以下では、その方法を見ていきましょう。

デモでCursorが更新したコード(参考)

index.html

<header>
    <div class="container flex-container">
        <h1 class="header-logo text-center">
            <img src="images/logo.png" width="168" height="32" alt="ズーロッパ東京">
        </h1>
        <!-- ハンバーガーメニューボタン(スマホのみ表示) -->
        <button class="hamburger-btn" aria-label="メニューを開く">
            <span></span>
            <span></span>
            <span></span>
        </button>
        <nav class="header-nav">
            <ul class="flex-container flex-all-row">
                <li><a href="#">お知らせ</a></li>
                <li><a href="#">イベント情報</a></li>
                <li><a href="#">Zooloppaとは</a></li>
                <li><a href="#">交通アクセス</a></li>
            </ul>
        </nav>
    </div>
    <!-- 背景オーバーレイ -->
    <div class="menu-overlay"></div>
</header>

srcipt.js
生成されたJSのコードを見てみると、クリックで activeクラスを付け外しして表示・非表示を切り替えていることが分かります。

// ハンバーガーメニューの開閉機能
document.addEventListener('DOMContentLoaded', function() {
    const hamburgerBtn = document.querySelector('.hamburger-btn');
    const headerNav = document.querySelector('.header-nav');
    const menuOverlay = document.querySelector('.menu-overlay');

    // ハンバーガーボタンクリック時
    hamburgerBtn.addEventListener('click', function() {
        toggleMenu();
    });

    // オーバーレイクリック時(メニューを閉じる)
    menuOverlay.addEventListener('click', function() {
        closeMenu();
    });

    // メニューの開閉を切り替える関数
    function toggleMenu() {
        hamburgerBtn.classList.toggle('active');
        headerNav.classList.toggle('active');
        menuOverlay.classList.toggle('active');

        // aria-labelの更新
        if (hamburgerBtn.classList.contains('active')) {
            hamburgerBtn.setAttribute('aria-label', 'メニューを閉じる');
        } else {
            hamburgerBtn.setAttribute('aria-label', 'メニューを開く');
        }
    }

    // メニューを閉じる関数
    function closeMenu() {
        hamburgerBtn.classList.remove('active');
        headerNav.classList.remove('active');
        menuOverlay.classList.remove('active');
        hamburgerBtn.setAttribute('aria-label', 'メニューを開く');
    }

    // ESCキーでメニューを閉じる
    document.addEventListener('keydown', function(e) {
        if (e.key === 'Escape' && headerNav.classList.contains('active')) {
            closeMenu();
        }
    });
});

stye.css

@media (max-width: 768px) {
  .flex-container {
    flex-direction: column;
  }

  .card-container .card {
    width: 100%;
  }

  /* ハンバーガーメニューボタンを表示 */
  .hamburger-btn {
    display: flex;
  }

  /* ナビゲーションメニューをスライドイン形式に変更 */
  .header-nav {
    position: fixed;
    top: 0;
    right: -100%;
    width: 250px;
    height: 100vh;
    background-color: #669900;
    z-index: 1000;
    transition: right 0.3s ease;
    overflow-y: auto;
    margin-left: initial;
    align-self: initial;
  }

  .header-nav.active {
    right: 0;
  }

  .header-nav ul.flex-all-row {
    width: 100%;
    flex-direction: column;
    padding-top: 60px;
  }

  .header-nav ul.flex-all-row li {
    width: 100%;
    margin-top: 0;
    margin-left: initial;
    border-bottom: 1px solid rgba(255, 255, 255, 0.2);
  }

  .header-nav ul.flex-all-row li a {
    display: block;
    padding: 15px 20px;
    color: #FFFFFF;
    text-decoration: none;
    transition: background-color 0.3s ease;
  }

  .header-nav ul.flex-all-row li a:hover {
    background-color: rgba(255, 255, 255, 0.1);
  }

検証ツールで確認・すぐ直せるところは直す

ブラウザの検証ツールで確認する限り、activeクラスの付与・削除自体に問題はなさそう。

となると、表示がうまくいってない原因のほどんどはCSSだなと見当がつきます。
メニューを閉じるためのアイコンも存在はしてて、メニューを開いた時には×になるように設定されているみたいですね。
file

まず、ハンバーガーアイコンの位置がずれる原因。
これはスマホ幅ではflex-containerクラスが、縦並び指定になっているせいです。 file
このへんは、もう自分で書いちゃって良いですね。
下記のように書いても、ヘッダー用に別のクラスを作っても良いです。

stye.css - @media (max-width: 768px) {} 内

.header .flex-container {
    flex-direction: row;
}

ハンバーガーメニューを開いた時の、ハンバーガーメニューボタンの表示。
これも、なんとなく理由を察しておられた方が多いかもしれません。
file
メニュー部分を前面に表示するためにz-indexが設定されているのに対して、ボタンはz-index未指定なので背面に隠れているだけです。 原因が分かれば、自分で直しちゃったほうが早いですね。
メニュー部分より大きなz-indexの値を指定します。

stye.css - @media (max-width: 768px) {} 内

/* ハンバーガーメニューボタンを表示 */
.hamburger-btn {
    position: relative;
    z-index: 1001;
    display: flex;
}

file

面倒だったり難しいところはAIに相談

自分のサイトなら右からスライドインでも良いんですが、指示があったら上から開くハンバーガーメニューにしなきゃいけません。
全部打ち直すのは面倒なので、CursorのAIチャットで依頼してみましょう。

ナビゲーションは右側からスライドインではなく、上から開く形にしてほしい。
- ナビゲーションメニューの幅は100%
- ナビゲーションメニューの高さは、子要素に応じる
- ナビゲーションメニューのトップ位置は、ページ上部ではなくh1の下辺

file
 ↓
file
出来たらしいのでブラウザで見てみます。
file
The ハンバーガーメニューという動作になりました!
×ボタンがちょっとズレているあたりは、自分CSSを直したほうが早いと思います。

吉田先生

吉田先生

AIが書いてくれるコードは、もともとのコード、指示する内容、今までのAIとのチャット履歴などによって変ることがあります。
以下ではAIに指示するテキスト例を公開していますが「デモとなんか違う」「表示がちょっと崩れている」という場合は、ここまでで紹介した修正方法を活用してコードを調整してみてください。

2. ページトップボタンを作ろう

2-1. ページトップボタンでスムーススクロール

スムーススクロールとは、Webページで同じページ内での移動時に、画面が即座にジャンプするのではなく、なめらかにスクロールしながら目的の場所へ移動する効果です。
ページ内の目次や、ページトップに戻るボタンなどでよく使われます。
file

1. 画面右下にページトップボタンを固定表示する

今回は素材に最下部(フッター下)にページトップボタン用の要素が入っています。
file

index.htmlで div.pagetop 要素を範囲選択。
ショートカットキーの CmdCtrl )+ L でAIチャットに移動し、以下を送信します。

- この要素を画面右下(右から40px, 下から40px)に固定表示。
- アンカーリンクはスムーススクロールになるようにする。
- スムーススクロールはCSS scroll-behaviorとJSのscrollToでなめらかに。

file
file

ブラウザで確認してみると、バッチリ動きました。 file

2-2. ページ内移動の「#」を削除

ページ内リンクをつけて移動できるようにすると、移動した後URLの末尾に「#(ハッシュ記号)」が付きます。今回はトップなので # だけですが、指定する場所によって #top とか #about等の飛び先idが残ってしまいます。

これ、ちょっと嫌なので直しましょう。
「replaceなんちゃらだったような…なんだっけ?」と調べなくても、サクッと直してくれるはずです。

ページ内遷移を実行した際、URLに「#」や「#」以下が残らないようにJSに追記してください。

file

2-3. スクロールするとフェードイン

「ページを開いた直後は固定表示されていなくて、スクロールダウンするとふわっと出てくる」
ページトップへのボタンだけではなく、固定バナーなどでもよく使われている記述です。

file

再び、index.htmlで div.pagetop 要素を範囲選択。
ショートカットキーの CmdCtrl )+ L でAIチャットに移動し、以下を送信します。

div.pagetopの表示を以下のように変更してください。

- ページ最上部では非表示にして、スクロール100px以上で表示する。
- スクロールアップして最上部まで戻った時は、再び非表示にする。
- fade in/outアニメーション効果をつける。

file

AIがJavaScriptとフェードイン/アウトに必要なCSSを追加してくれます。
ブラウザで表示して、上アニメーションのように表示/非表示ができていたらKeep Allを押せばOKです。

3. 難しそうなあのアイテムも7つもサクッと実装

3-1. スクロールで要素がフェードインする

トップページやLPページでよくある、スクロールダウンしていくと上から順番に要素がふわっと出現する効果。 これも簡単に要件をAIに言えば出来ちゃいます。

ページにある要素を、スクロールダウンに合わせてふわっとフェードインさせたい。

- フェードインさせる要素は調整できるようにCSSクラスで制御する。
- 要素の上辺がビューポートに入ったらフェードインする。
- 1度フェードインした後はスクロールアップをしても消さない。

file
jsファイル、cssファイルを更新してくれました。
テスト方法も教えてくれているので、index.htmlで指定されたクラスをつけてみましょう。

<section class="event">
      <div class="container section-padding">
        <h2 class="text-white text-center">
          楽しいイベントいっぱいだよ
        </h2>
        <div class="text-center">
          <img src="images/line.png" width="400" height="6" alt="">
        </div>
        <p class="text-white text-center">
          いつ訪れても楽しいズーロッパ東京。
        </p>
        <!-- ここからカード並び -->
        <div class="flex-container card-container">
          <artilce class="card fadein"> <!-- ★カードにそれぞれ fadein クラスを追加 -->

簡単!
file

3-2. タブで表示コンテンツを切り替え

今回の素材では、ページの真ん中あたりに以下のようなタブデザインが入っています。
まだ動かないので、タブをクリックすると表示内容が変わるようにCursor AIに直してもらいましょう。 file

index.htmlでタブデザイン部分を範囲選択。
ショートカットキーの CmdCtrl )+ L でAIチャットに移動し、以下を送信します。

タブアイテムが動作するように設定してください。

- .tab__navのボタンをクリックすると、それに応じた.tab__panelが見られるようにする。
- アクティブなタブ・パネルにactiveクラス付与。
- CSS transitionでフェード切り替え、JSは最小限で。

file

完了の通知が表示されたら、ブラウザで確認。
アクセスなど別のタブに切り替えられたら成功です。
file

3-3. クリック/タップで開閉するブロック

動くようになったタブでQ&Aを開いてみると、下記のような表示になっています。
クリック/タップで開いて中身(今回の場合だとアンサー)が見えるアコーディオン風のデザイン。こちらもよくありますよね。
file

こちらもサイトを見ている人が開閉できるようにしましょう。

index.htmlで<ul class="faq"> ~ </ul>までを範囲選択。
ショートカットキーの CmdCtrl )+ L でAIチャットに移動し、以下を送信します。

クリック/タップした要素の.faq__item__contが表示できるようにしたい。

- faq__item__head部分をクリックすると、親要素(.faq_item)にopenクラスを追加して.faq__item__contを表示。
- opendクラスが付与されている場合は、faq__item__head部分をクリックすると閉じる。
- パネルが開閉するようなアニメーションで滑らかに。
- 初期状態では一番上の.faq_itemに.openを付与し、開いた状態にしておく

file
 ↓
コードが追加されます。 file
file

3-4. 画像モーダル(ギャラリー風拡大表示)

フッター上の「動物たちのご紹介」セクション。
ここは画像をクリックすると、モーダルウィンドウで画像を拡大表示するようにしてみましょう。 file

最初の<artilce ...から三枚目の</artilce>までをを範囲選択。
ショートカットキーの CmdCtrl )+ L でAIチャットに移動し、以下を送信します。

.modal-triggerの画像をクリックで全画面モーダル表示してください。
背景は半透明黒、画像は中央配置、ESCキーと背景クリックで閉じる。
CSS transitionでふわっと表示、JSは最小限で。

file
file

最低限の動作は出来ていますね。
モーダルの右上に×を入れるとか、クリックできるとわかるようにcursor: pointer;にするなど、改良していっても良いでしょう。

3-5. 画像遅延読み込み(Lazy Loading)

画像が画面に入った時だけ画像を読み込むようにすることで、ページ表示速度を向上させます。 フッター上の「動物たちのご紹介」セクションでやってみましょう。

最初の<artilce ...から三枚目の</artilce>までをを範囲選択。
ショートカットキーの CmdCtrl )+ L でAIチャットに移動し、以下を送信します。

ここの画像を遅延読み込みにしてください。

- 画像に.lazyクラスを付与し、遅延読み込みにする。
- Intersection Observerでビューポートに入ったらdata-srcからsrcに置換。
- 読み込み中はプレースホルダー表示、読み込み後はフェードイン。

file
おぉ!面倒くさい遅延読み込みのコードに一撃で変わりました。

ブラウザで見てもパッと見ると分からないんですが、検証ツールで変更したimg要素の部分を見ていると動いていることが分かります。
file

3-6. カルーセル(スライダー)表示

時間経過に合わせて画像を自動で切り替えていくカルーセルも、ちょっとだけやってみましょう。

今回の素材にはimagesフォルダにtop2.jpgtop2-pc.jpgという画像が入っています。
今のキリンの画像と、こちらの画像が順に表示されるようにCursorに頼んでみましょう。
file

<section class="firstview section-padding"> ~ </section>を選択。 ショートカットキーの CmdCtrl )+ L でAIチャットに移動し、以下を送信します。

ファーストビューの画像を、カルーセルにしたい。
今使用しているtop.jpg(PC幅はtop-pc.jpg)と、top2.jpg(PC幅はtopp-pc.jpg)を切り替える。

- 画像は背景画像ではなくimg要素にし、追加しやすくする。
- 5秒間隔で画像を自動で切り替える。
- 下部に左右ボタン、スライド枚数分のドットを表示する。
- 左右ボタンもしくはドットを押すと、画像を切り替えられるようにする。
CSS transitionでスライド、JSはシンプルに。レスポンシブ対応。

file やってくれました。

ブラウザで表示を確認してみると…カルーセルはよくできていますが、文字が消えちゃいました。 カルーセル画像の背面に行ってしまったようです。
file

AIチャットパネルで、追加注文を入力・送信します。

画像の上に表示させたい.firstview-lead部分が背面に隠れているので、そこを直してくれますか?
テキストも画像と合わせてスライドし、それぞれの画像ごとに入力したいです。

file
直してくれたらしいので、再びブラウザで確認。
file う~ん…何とかなっていますが、ちょっと位置が微妙かも。

このあたりはCSSの問題です。 [1. Cursorでハンバーガーメニューを作ってみよう] で行ったようにAIに追加で修正をしてもらうか、自分でCSSを直して調整してください。

おまけ:上手くいかない!こんなときなんて言う?

1) 「Uncaught TypeError」が出た

  • よくある原因:要素が見つからない、まだ読み込まれてない
  • 対処:エラー行をそのままAIに貼る →
このJSエラーを直してください。DOM読み込み待ちや要素存在チェックを追加。
最小変更で動くコードに修正して、コメントで説明も。

2) スマホで動かない

  • チェック項目:タッチイベント対応、ビューポート設定
  • 対処:問題のコードを選択 → Cmd + K
このコードをスマホ対応にしてください。
タッチイベント追加、300ms遅延回避、ビューポート考慮。

3) アニメーションがガクガク

  • 解決策transformopacityを使う、will-change追加
  • AIに一言
このアニメーションを60fps滑らかにしてください。
GPU加速利用、リフロー回避、transform/opacity使用。

まとめ

いかがだったでしょうか?
自分で書こうとすると難しかったり、面倒くさかったりするJavaScriptがサクサク書かれてびっくりしますよね。 希望した動きを実装するために必要なCSSクラスもある程度作ってくれるので、作業が楽に感じたと思います。

ぜひご自身のコードや、今回の素材を使って、いろいろなバリエーションのAIコーディングを試してみてください!

まずは無料で7講座から始めましょう!

ハイクオリティな7講座/98レッスンが受け放題。
募集人数には制限があります。サインアップはお早めに。
無料申し込み期限
9月14日まで

募集 人数
100名 (残りわずか)

こちらもオススメ