ホームページ >ウェブフロントエンド >jsチュートリアル >アニメーションを使用したプレミアムなマルチステップ フォームの構築

アニメーションを使用したプレミアムなマルチステップ フォームの構築

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 22:21:10163ブラウズ

Building a Premium Multi-Step Form with Animations

このチュートリアルでは、HTML、CSS、JavaScript を使用して、スムーズなアニメーションとクライアント側の検証を備えたプレミアムでインタラクティブなマルチステップ フォームを作成する方法を説明します。このフォームは強化されたユーザー エクスペリエンスを提供し、まさに 2025 年のもののように見えます!

ライブデモ: https://codepen.io/HanGPIIIErr/pen/ZYzbrqW

目次

  1. はじめに
  2. 前提条件
  3. プロジェクトの構造
  4. HTML マークアップ
  5. CSS を使用したスタイル
  6. JavaScript によるインタラクティブ性の追加
  7. 結論

1.はじめに

マルチステップフォームは、長いフォームを管理しやすいセクションに分割することで、ユーザーエクスペリエンスを向上させる優れた方法です。このチュートリアルでは、以下を含む 5 ステップのフォームを作成します。

  • 個人情報
  • 設定
  • 画像アップロード
  • コメント
  • 概要と提出

ステップ間にスムーズなアニメーションを追加し、ユーザー入力を検証してデータの整合性を確保します。

前提条件

HTML、CSS、JavaScript の基本的な理解
JavaScript のフォーム要素とイベント処理に精通している

プロジェクトの構造

3 つの主要なファイルがあります:

index.html — HTML 構造
style.css — フォームのスタイル
script.js — フォームの操作を処理する JavaScript
まずは HTML ファイルを設定しましょう。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Premium Multi-Step Form</title>
    <link href="https://fonts.googleapis.com/css?family=Poppins:300,400,600&display=swap" rel="stylesheet">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <form>



<p>Explanation</p>

<ul>
<li>Form Steps: Each step is wrapped in a div with the class form-step.</li>
<li>Active Class: The first step has the class active to display it initially.</li>
<li>Navigation Buttons: Each step (except the first and last) has "Previous" and "Next" buttons.</li>
<li>Summary Section: The last step displays a summary of the entered information.</li>
</ul>

<p>Styling with CSS</p>

<p>Now, let's style our form to give it that premium feel.<br>
</p>

<pre class="brush:php;toolbar:false">/* style.css */

body {
    font-family: 'Poppins', sans-serif;
    background: linear-gradient(135deg, #1abc9c, #16a085);
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    overflow: hidden;
}

form {
    width: 90%;
    max-width: 600px;
    background: rgba(255, 255, 255, 0.95);
    padding: 3em;
    border-radius: 20px;
    box-shadow: 0 15px 25px rgba(0, 0, 0, 0.2);
    backdrop-filter: blur(10px);
    position: relative;
    overflow: hidden;
}

.form-step {
    position: absolute;
    width: 100%;
    opacity: 0;
    transform: scale(0.8) translateY(50px);
    transition: all 0.5s ease;
}

.form-step.active {
    opacity: 1;
    transform: scale(1) translateY(0);
    position: relative;
}

.step-header {
    position: absolute;
    top: -30px;
    right: 30px;
    background: #16a085;
    color: #fff;
    padding: 0.5em 1em;
    border-radius: 30px;
    font-weight: 600;
    animation: slideIn 0.5s forwards;
}

h2 {
    margin-bottom: 1em;
    color: #333;
    font-weight: 600;
    text-align: center;
    animation: fadeInDown 0.5s ease-in-out;
}

label {
    display: block;
    margin-top: 1em;
    color: #555;
    font-weight: 500;
    animation: fadeInUp 0.5s ease-in-out;
}

input[type="text"],
input[type="email"],
input[type="file"],
textarea {
    width: 100%;
    padding: 0.75em 1em;
    margin-top: 0.5em;
    border: 2px solid #ddd;
    border-radius: 10px;
    font-size: 1em;
    outline: none;
    transition: border-color 0.3s;
    animation: fadeInUp 0.5s ease-in-out;
}

input:focus,
textarea:focus {
    border-color: #1abc9c;
}

input[type="checkbox"] {
    margin-right: 0.5em;
}

.buttons {
    display: flex;
    justify-content: space-between;
    margin-top: 2em;
    animation: fadeInUp 0.5s ease-in-out;
}

button {
    padding: 0.75em 2em;
    border: none;
    border-radius: 30px;
    cursor: pointer;
    font-size: 1em;
    font-weight: 600;
    transition: background 0.3s, transform 0.3s, box-shadow 0.3s;
}

.next-step,
.prev-step {
    background: #1abc9c;
    color: #fff;
}

.next-step:hover,
.prev-step:hover {
    background: #16a085;
    transform: translateY(-3px);
    box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
}

button[type="submit"] {
    background: #e74c3c;
    color: #fff;
    margin-left: auto;
}

button[type="submit"]:hover {
    background: #c0392b;
    transform: translateY(-3px);
    box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
}

#summary p {
    margin: 1em 0;
    color: #333;
    font-weight: 500;
    animation: fadeInUp 0.5s ease-in-out;
}

/* Animations */
@keyframes fadeInUp {
    from {
        opacity: 0;
        transform: translateY(30px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@keyframes fadeInDown {
    from {
        opacity: 0;
        transform: translateY(-30px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

@keyframes slideIn {
    from {
        opacity: 0;
        transform: translateX(30px);
    }
    to {
        opacity: 1;
        transform: translateX(0);
    }
}

説明

  • 背景のグラデーション: 滑らかなグラデーションがモダンな雰囲気を与えます。
  • フォームのスタイリング: グラスモーフィズム効果には背景フィルターを使用します。
  • トランジションとアニメーション: スムーズなトランジションとキーフレーム アニメーションにより、インタラクティブ性が向上します。
  • ボタン効果: わずかな動きと奥行きのある影を備えたホバー効果。
  • JavaScript によるインタラクティブ性の追加

フォームを機能させてみましょう。

document.addEventListener('DOMContentLoaded', function() {
    const form = document.getElementById('multi-step-form');
    const steps = document.querySelectorAll('.form-step');
    const nextBtns = document.querySelectorAll('.next-step');
    const prevBtns = document.querySelectorAll('.prev-step');
    const summary = document.getElementById('summary');
    let currentStep = 0;

    nextBtns.forEach(btn => {
        btn.addEventListener('click', () => {
            if (validateStep()) {
                steps[currentStep].classList.remove('active');
                currentStep++;
                if (currentStep < steps.length) {
                    steps[currentStep].classList.add('active');
                }
                if (currentStep === steps.length - 1) {
                    displaySummary();
                }
            }
        });
    });

    prevBtns.forEach(btn => {
        btn.addEventListener('click', () => {
            steps[currentStep].classList.remove('active');
            currentStep--;
            steps[currentStep].classList.add('active');
        });
    });

    form.addEventListener('submit', (e) => {
        e.preventDefault();
        alert('Form successfully submitted!');
        form.reset();
        steps[currentStep].classList.remove('active');
        currentStep = 0;
        steps[currentStep].classList.add('active');
    });

    function validateStep() {
        let stepIsValid = true;
        const currentInputs = steps[currentStep].querySelectorAll('input, textarea');
        currentInputs.forEach(input => {
            if (!input.checkValidity()) {
                input.reportValidity();
                stepIsValid = false;
            }
        });
        return stepIsValid;
    }

    function displaySummary() {
        const name = document.getElementById('name').value || 'N/A';
        const email = document.getElementById('email').value || 'N/A';
        const prefs = Array.from(document.querySelectorAll('input[name="pref"]:checked')).map(el => el.value).join(', ') || 'None';
        const comments = document.getElementById('comments').value || 'None';

        summary.innerHTML = `
            <p><strong>Name:</strong> ${name}</p>
            <p><strong>Email:</strong> ${email}</p>
            <p><strong>Preferences:</strong> ${prefs}</p>
            <p><strong>Comments:</strong> ${comments}</p>
        `;
    }

    // Initialize steps
    steps.forEach((step, index) => {
        if (index !== currentStep) {
            step.classList.remove('active');
        } else {
            step.classList.add('active');
        }
    });
});

説明

  • イベント リスナー: ステップ間を移動するための「次へ」ボタンと「前へ」ボタン。
  • 検証: v​​alidateStep() は必須フィールドが入力されていることを確認します。
  • 概要表示:displaysummary() は、ユーザーが確認できるように入力されたデータをコンパイルします。
  • フォームの送信: 送信すると、フォームはリセットされ、最初のステップに戻ります。

?結論: 剣闘士の戦いの未来を築く

グラディエーター バトルの最新の機能強化は、すべてのプレイヤーにシームレスで魅力的な体験を提供するという大きな進歩を示しています。充実したチュートリアル システム、モジュール式コンポーネント、繁栄するギルド エコシステム、最適化されたミニゲームにより、このゲームは究極の剣闘士 RPG へと進化しています。

初めてアリーナを探索する新人であっても、戦場を支配する熟練の戦士であっても、これらのアップデートにより誰もが独自の壮大な遺産を築くことができます。

?旅に参加しましょう!

私たちはプレイヤーと開発者の両方からのフィードバックを積極的に求めています。グラディエーター バトルに参加して、ご意見をお聞かせください。

?ウェブサイト: https://gladiatorsbattle.com
?️ Kickstarter でサポートしてください: https://www.kickstarter.com/projects/gladiatorsbattle/gladiators-battle-forge-your-legend-in-the-ultimate-arena
? X (旧 Twitter) でフォローしてください: https://x.com/GladiatorsBT
? LinkedIn で接続: https://www.linkedin.com/in/pierre-romain-lopez
? Discord のコミュニティに参加してください: https://discord.gg/YBNF7KjGwx

Gladiators Battle の開発を継続するための変わらぬご支援に感謝いたします。皆様のフィードバック、アイデア、熱意が私たちの進歩の原動力です。

冒険を続けましょう—アベニュー、剣闘士たち! ?✨

ご質問やご提案がございましたら、以下にコメントを残してください。

以上がアニメーションを使用したプレミアムなマルチステップ フォームの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。