IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 多步骤动画表单 -> 正文阅读

[游戏开发]多步骤动画表单

在这里插入图片描述

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
    <script src="script.js" defer></script>
</head>
<body>
    <form action="" data-multi-step class="multi-step-form">
        <div class="card active" data-step>
            <h3 class="step-title">面板1</h3>
            <div class="form-group">
                <label for="email">邮箱</label>
                <input type="email" name="email" id="email">
            </div>
            <div class="form-group">
                <label for="password">密码</label>
                <input type="password" name="password" id="password">
            </div>
            <button type="button" data-next>下一步</button>
        </div>
        <div class="card" data-step>
            <h3 class="step-title">面板2</h3>
            <div class="form-group">
                <label for="address">住址</label>
                <input type="text" name="address" id="address">
            </div>
            <div class="form-group">
                <label for="city">城市</label>
                <input type="text" name="city" id="city">
            </div>
            <div class="form-group">
                <label for="zipcode">邮编</label>
                <input type="text" name="zipcode" id="zipcode">
            </div>
            <button type="button" data-previous>上一步</button>
            <button type="button" data-next>下一步</button>
        </div>
        <div class="card" data-step>
            <h3 class="step-title">面板3</h3>
            <div class="form-group">
                <label for="firstName">姓名</label>
                <input type="text" name="firstName" id="firstName">
            </div>
            <div class="form-group">
                <label for="lastName">手机</label>
                <input type="text" name="lastName" id="lastName">
            </div>
            <button type="button" data-previous>上一步</button>
            <button type="submit">提交</button>
        </div>
    </form>
</body>
</html>

style.css

.card{
    background-color: #fff;
    border: 1px solid #333;
    border-radius: .5rem;
    padding: .5rem;
    max-width: 300px;
    margin: 0 auto;
    animation: fade 250ms ease-in-out forwards;
}
.form-group{
    display: flex;
    flex-direction: column;
    gap: .25rem;
    margin-bottom: .5rem;
}
.form-group:last-child{
    margin: 0;
}
.form-group > label{
    font-weight: bold;
    font-size: .8em;
    color: #333;
}
.form-group > input{
    border: 1px solid #333;
    border-radius: .25em;
    font-size: 1rem;
    padding: .25em;
}
.step-title{
    margin: 0;
    margin-bottom: 1rem;
    text-align: center;
}

.card.active {
    animation: slide 250ms 125ms ease-in-out both;
}

.multi-step-form{
    overflow: hidden;
    position: relative;
}

.hide{
    display: none;
}

@keyframes slide{
    0%{
        transform: translateX(200%);
        opacity: 0;
    }
    100%{
        transform:translateX(0);
        opacity: 1;
    }
}

@keyframes fade{
    0%{
        transform:scale(1);
        opacity: 1;
    }
    50%{
        transform:scale(.75);
        opacity: 0;
    }
    100%{
        opacity: 0;
        transform:scale(0);
    }
}

script.js

const multiStepForm = document.querySelector('[data-multi-step]')
const formSteps = [...multiStepForm.querySelectorAll('[data-step]')]
let currentStep = formSteps.findIndex(step => {
  return step.classList.contains('active')
})

if (currentStep < 0) {
  currentStep = 0
  formSteps[currentStep].classList.add('active')
}

multiStepForm.addEventListener('click', e => {
  let incrementor
  if (e.target.matches('[data-next]')) {
    incrementor = 1
  } else if (e.target.matches('[data-previous]')) {
    incrementor = -1
  }

  if (incrementor == null) return

  const inputs = [...formSteps[currentStep].querySelectorAll('input')]
  const allValid = inputs.every(input => input.reportValidity())
  
  if (allValid) {
    currentStep += incrementor
    showCurrentStep()
  }
})

formSteps.forEach(step => {
    step.addEventListener('animationend',e=>{
        formSteps[currentStep].classList.remove('hide')
        e.target.classList.toggle('hide',!e.target.classList.contains('active'))
    })
})

function showCurrentStep() {
  formSteps.forEach((step, index) => {
    step.classList.toggle('active', index === currentStep)
  })
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:42:53  更:2022-04-04 12:44:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/28 18:32:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码