前端小案例——购买电影票(HTML+CSS+JS, 附源码)

一、前言

实现功能:

这段代码实现了一个简单的电影票选座购买的功能界面。

  1. 在页面上展示了一个电影院的座位布局,以及右侧显示了电影信息、选座情况、票价、总计等内容。

  2. 用户可以通过点击座位来选择购买电影票,每个座位的状态会在点击时改变(从默认颜色变为红色),并在右侧显示已选座位的信息。

  3. 用户可以确认购买,确认购买后会出现购买成功的提示,并且页面会重置,清空已选座位和右侧信息。

实现逻辑:

  1. 首先,在 HTML 中定义了一个包含座位和右侧信息的页面结构。

  2. 使用 JavaScript 获取到需要操作的元素,包括座位列表、座位元素、默认座位颜色、选座数目、选座信息展示区域等。

  3. 使用循环创建了 64 个座位,并给每个座位添加了行列信息。同时初始化了默认座位颜色和选座数目变量。

  4. 定义了一个函数 addSeatClick,用于处理座位的点击事件。当座位被点击时,根据当前座位状态(默认或已选),改变座位颜色、更新选座数目、显示已选座位信息以及计算总金额等操作。

  5. 遍历所有座位元素,为每个座位添加点击事件处理函数。

  6. 监听确认购买按钮的点击事件。点击确认购买后,弹出购买成功提示,重置所有座位颜色,清空已选座位信息和总金额,并将选座数目重置为零。

二、项目运行效果

三、全部代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>购买电影票</title><style>*{margin: 0;padding: 0;text-decoration: none;list-style: none;background-repeat: no-repeat;}.con-box{width: 100%;height: 100vh;display: flex;justify-content: center;gap: 10px;margin: 0 auto;}.left{width: 60%;height: 100vh;border-right: 1px dashed #000;}.left p{width: 70%;height: 35px;line-height: 35px;text-align: center;margin: 30px auto;background-color:#f0f0f0;border-radius: 5px;}.seat{display: flex;width: 80%;height: 750px;flex-wrap: wrap;gap: 30px;justify-content: space-around;align-content: center;margin: 0 auto;}.seat li{width: 8%;height: 8%;border-radius: 5px;background-color: #b9ef9f;line-height: 60px;text-align: center;cursor: pointer;}.right{width: 35%;height: 100vh;color: #a79e9f;position: relative;}.right-con{width: 350px;height: 90vh;position: absolute;right: 0;top: 5%;line-height: 28px;}#seatNumbers{width: 240px;}.seat-number{display: inline-block;width: 100px;height: 30px;background-color: #efefef;border-radius: 5px;text-align: center;margin-left: 10px;margin-bottom: 10px;line-height: 30px;color: #000;border: #d1d1d1 1px solid ;}.right-con button{width: 70px;height: 25px;margin: 25px 50px;background-color: #efefef;border: solid 0.5px #000;border-radius: 2px;cursor: pointer;}</style>
</head>
<body><div class="con-box"><div class="left"><p>屏幕</p><ul class="seat"></ul></div><div class="right"><ul class="right-con"><li>影片:<span>后来的我们</span></li><li>时间:<span>5月1日&nbsp;21:00</span></li><li>票价:<span>50元</span></li><li>座位:<p id="seatNumbers"></p></li><li>票数:<span></span></li><li>总计:<span></span></li><button>确认购买</button></ul></div></div></body>
<script>const seatList = document.querySelector('.seat');for (let i = 0; i < 64; i++) {const li = document.createElement('li');seatList.appendChild(li);}const seats = document.querySelectorAll('.seat li');const defaultColor = seats[0].style.backgroundColor;let selectedCount = 0;const seatNumbers = document.querySelector('#seatNumbers');for (let i = 1; i <= 8; i++) {for (let j = 1; j <= 8; j++) {let seatIndex = (i - 1) * 8 + (j - 1);seats[seatIndex].innerText = i + '-' + j;}}function addSeatClick(seat) {seat.addEventListener('click', () => {if (seat.style.backgroundColor === defaultColor) {seat.style.backgroundColor = 'red';selectedCount++;let numberP = document.createElement('p');numberP.classList.add('seat-number');seatNumbers.appendChild(numberP);let row = seat.innerText.split('-')[0]; let column = seat.innerText.split('-')[1];numberP.innerText = `${row}排${column}座`;document.querySelector('.right-con li:nth-child(5) span').innerText = selectedCount;let total = selectedCount * 50;document.querySelector('.right-con li:nth-child(6) span').innerText = '¥' + total;} else {seat.style.backgroundColor = defaultColor;selectedCount--;let numberP = Array.from(seatNumbers.querySelectorAll('.seat-number'));console.log(numberP);let seatNumberToRemove = numberP.find(numberP => numberP.innerText === `${seat.innerText.split('-')[0]}排${seat.innerText.split('-')[1]}座`);seatNumbers.removeChild(seatNumberToRemove);document.querySelector('.right-con li:nth-child(5) span').innerText = selectedCount;let total = selectedCount * 50;document.querySelector('.right-con li:nth-child(6) span').innerText = '¥' + total;}});}seats.forEach(seat => {addSeatClick(seat);});const confirmButton = document.querySelector('button');confirmButton.addEventListener('click', () => {alert('购买成功!');const seats = document.querySelectorAll('.seat li');seats.forEach(seat => {seat.style.backgroundColor = '#b9ef9f';});seatNumbers.innerHTML = '';document.querySelector('.right-con li:nth-child(5) span').innerText = '';document.querySelector('.right-con li:nth-child(6) span').innerText = '';});
</script>
</html>

四、答疑解惑

        这是一个非常适合前端入门练习的小案例,各位小伙伴可以自行更改样式和内容,如果大家运行时出现问题或代码有什么不懂的地方都可以随时评论留言或联系博主QQ。

        还多请各位小伙伴多多点赞支持,你们的支持是我最大的动力。

博主QQ:1196094293

谢谢各位的支持~~

                        
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/473748.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解自定义类型:枚举与联合体!

目录 ​编辑 一、枚举类型 1.枚举类型的声明 2.枚举类型的优点 3.枚举类型的使用 二、联合体类型(共用体&#xff09; 1.联合体类型的声明 2.联合体的特点 3.相同成员的结构体和联合体的对比 4.联合体大小的计算 5.用联合体判断大小端 三.完结散花 悟已往之不谏&…

5年前端老司机:浅谈web前端开发技术点

有部分同学和朋友问到过我相关问题。利用周末我就浅浅地谈谈我对web前端开发的理解和体会&#xff0c;仅仅能浅浅谈谈&#xff0c;高手请自己主动跳过本篇文章。 毕竟我如今经验并非非常足&#xff0c;连project师都算不上&#xff0c;更不用说大牛了。今天也不谈技术。技术非…

给定n个结点m条边的简单无向图,判断该图是否存在鱼形状的子图:有一个环,其中有一个结点有另外两条边,连向不在环内的两个结点。若有,输出子图的连边

题目 思路: #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn = 1e6 + 5, inf = 1e18 * 3, maxm = 4e4 + 5,…

OpenAI Sora技术报告[中文版] - 视频生成模型:构建虚拟世界的模拟器

OpenAI近日发布了震撼视频生成产品Sora&#xff0c;生成效果非常炸裂。 以下是提示词的生成&#xff1a; 在一个装饰华丽的历史大厅里&#xff0c;一道巨大的海浪正准备冲击而来。两位冲浪者抓住机会&#xff0c;巧妙地驾驭着海浪。 OpenAI使用了视觉数据的补片技术转化&#…

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法

图表示学习 Graph Representation Learning chapter2 背景知识和传统方法 2.1 图统计和核方法2.1.1 节点层次的统计和特征节点的度 节点中心度聚类系数Closed Triangles, Ego Graphs, and Motifs 图层次的特征和图的核节点袋Weisfieler–Lehman核Graphlets和基于路径的方法 邻域…

Stable Diffusion 模型下载:Beautiful Realistic Asians(美丽真实的亚洲人)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 Beautiful Realistic Asians&#xff08;BRA&#xff09;模型是由作者自己训练…

使用 Coze 搭建 TiDB 助手

导读 本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台&#xff0c;突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理&#xff0c;包括知识库、function call、embedding 模型等关键概念&#xff0c;最后成功演示了如何在 Coze…

插槽的使用说明

目录 1.说明 2.分类 3.总结 1.说明 插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用<slot></slot> 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的<slot><…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十三)(1)

实验十三&#xff1a;数据拟合与数据差值 练习一 1.采用不同的拟合函数拟合示例4中的数据点,然后利用弧长公式预测光缆长度,同正文中的结果进行比较. clc;clear; p[9.01,8.96,7.96,7.97,8.02,9.05,10.13,11.18,12.26,13.28,13.32,12.61,11.29,10.22,9.15,7.90,7.95,8.86,9.8…

SQL28 计算用户8月每天的练题数量(date_format函数的用法)

代码 select day(date) as day ,count(question_id) as question_cnt from question_practice_detail where date_format(date,%Y-%m)2021-08 group by day知识点 day函数取出日期格式数值里的日期,month,year函数也是类似的作用date_format规定日期/时间的输出格式 %Y 年&am…

PLC-Recorder的延伸分析功能说明

目录 一、缘起 二、如何从PLC-Recorder获取数据 1、在线获取 2、全自主打开数据文件 3、延伸分析 三、设置方法 四、效果展示 一、缘起 在各个行业&#xff0c;在不同的场景中&#xff0c;朋友们拿到数据后&#xff0c;想做的事情五花八门&#xff0c;有做宏观分析的、…

普中51单片机学习(六)

点亮第一个LED LED相关知识 LED,即发光二极管&#xff0c;是一种半导体固体发光器件。工作原理为&#xff1a;LED的工作是有方向性的&#xff0c;只有当正级接到LED阳极&#xff0c;负极接到LED的阴极的时候才能工作&#xff0c;如果反接LED是不能正常工作的。其原理图如下 …