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

news2024/12/25 1:27:52

一、前言

实现功能:

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

  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.coloradmin.cn/o/1452888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链表OJ题目合集第一弹:移除元素,反转链表,中间结点,倒数第k个结点,合并有序链表,回文结构,相交链表判断。(C语言版,有详细解析、图示和链接)

目录 前言 1. 移除链表元素 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;解析 &#xff08;3&#xff09;代码 2. 反转链表 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;题目解析及思路 3.链表的中间结点 &#xff08;1&#…

一起学量化之RSI指标

RSI指标 Relative Strength Index,相对强弱指数(RSI),是一个衡量资产过度买入或过度卖出状态的技术指标。 1. RSI的基本概念 当RSI超过70时,通常被认为是超买状态。当RSI低于30时,通常被认为是超卖状态。RSI超过80,被认为是严重超买状态。RSI低于20,被认为是严重超卖状…

马斯克评 OpenAI 视频模型,接地气又一针见血

马斯克评 OpenAI Sora 昨天&#xff0c;OpenAI 发布了首个视频生成模型 Sora。 一位 X&#xff08;前推特&#xff09;用户分享了 Sora 官网所展示的生成视频&#xff1a;一名女子在东京街头漫步。 该用户评论称&#xff1a;"OpenAI 今天宣布了 Sora&#xff0c;它使用混合…

STM32的三种下载方式

结果jlink&#xff0c;串口&#xff0c;stlink方式都没有问题&#xff0c;是当时缩减代码&#xff0c;看真正起作用的代码段有哪些&#xff0c;就把GPIO初始化中 /*开启GPIO外部时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); 把开启外部时钟的代码注释掉了。…

【plt.imshow显示图像】:从入门到精通,只需一篇文章!【Matplotlib】

【plt.imshow显示图像】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib】 &#x1f680; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f4d8; 1. plt.imshow入门&#xff1a;认识并安装Matplotlib库&#x1f308…

Github 2024-02-17 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-17统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目3Rust项目2Jupyter Notebook项目1PowerShell项目1JavaScript项目1 Black&#xff…

AutoKeras(Python自动化机器学习)多模态数据和多任务

要点拓扑 AutoKeras 拓扑 要点 常规机器学习&#xff1a;scikit-learn示例探索性数据分析和数据预处理&#xff0c;线性回归&#xff0c;决策树图像分类ResNet模型示例&#xff0c;合成数据集DenseNet模型示例绘图线性回归和决策树模型使用Python工具seaborn、matplotlib、pan…

PCL库学习及ROS使用

PCL库学习 c_cpp_properties.json {"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**","/usr/include","/usr/local/include"],"defines": [],"compiler…

把Activity当做dialog对话框使用

1、引言 在安卓开发中对话框的使用是不可避免的&#xff0c;但是原生的对话框用起来总感觉差点意思&#xff0c;而且位置不好控制&#xff0c;在与界面的交互上也不够灵活&#xff0c;没有像activity那样的生命周期方法&#xff0c;以至于某些特殊的功能无法实现。此时我们就希…

深度学习主流开源框架:Caffe、TensorFlow、Pytorch、Theano、Keras、MXNet、Chainer

2.6 深度学习主流开源框架 表2.1 深度学习主流框架参数对比 框架关键词总结 框架关键词基本数据结构&#xff08;都是高维数组&#xff09;Caffe“在工业中应用较为广泛”&#xff0c;“编译安装麻烦一点”BlobTensorFlow“安装简单pip”TensorPytorch“定位&#xff1a;快…

数据库MySQL中出现乱码和表格不对齐怎么解决

MySQL中出现乱码问题及解决办法&#xff1a; 情况类似&#xff1a; 首先进入到数据库中&#xff0c;命令&#xff1a;mysql -h localhost -uroot -p或者mysql -uroot -p;进入数据库后选择一个你的数据库查看表中的中文是否乱码 以上是数据库中表格出现乱码情况&#xff0c;原…

项目架构梳理

单点登录组件 CREATE TABLE user_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增主键,用户id,username varchar(30) NOT NULL COMMENT 用户姓名,password varchar(60) NOT NULL COMMENT 密码,token varchar(60) DEFAULT NULL COMMENT token,token_expire datetime DEF…

1.8 NLP自然语言处理

NLP自然语言处理 更多内容&#xff0c;请关注&#xff1a; github&#xff1a;https://github.com/gotonote/Autopilot-Notes.git 一、简介 seq2seq(Sequence to Sequence)是一种输入不定长序列&#xff0c;产生不定长序列的模型&#xff0c;典型的处理任务是机器翻译&#…

BUGKU-WEB game1

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 是一个盖楼的游戏&#xff01; 解题思路 先看看源码&#xff0c;好像没发现什么特别的是不是要得到一定的分数才会有对应的flag&#xff1f;查看下F12&#xff0c;请求链接发现&#xff0c;这不就提示了 相…

第13章 网络 Page738~741 13.8.3 TCP/UDP简述

libcurl是C语言写成的网络编程工具库&#xff0c;asio是C写的网络编程的基础类型库 libcurl只用于客户端&#xff0c;asio既可以写客户端&#xff0c;也可以写服务端 libcurl实现了HTTP\FTP等应用层协议&#xff0c;但asio却只实现了传输层TCP/UDP等协议。 在学习http时介绍…

九大问题困扰企业财务数字化转型,你准备好解决了吗?

随着数字化浪潮的推进&#xff0c;企业财务管理也迎来了转型的关键时刻。然而&#xff0c;多年的数字化转型经验告诉我们&#xff0c;企业在这一过程中普遍面临着许多挑战和痛点。接下来&#xff0c;我们将逐一深入剖析这些痛点&#xff0c;并探讨如何有效应对。 一、数据孤岛问…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(3)数据准备初步

今天来学习数据准备。 一个AI项目要包括构建数据集、数据清理和数据融合、数据采集、特征工程、算法改进和其他步骤。 数据采集和数据清洗&#xff0c;也就是数据准备&#xff0c;要占到人工智能项目一半以上的工作量。 训练的数据量越大&#xff0c;模型越准确。 建立数据标…

一篇文章入门postmain接口测试

一、了解接口和接口测试 1、什么是接口? 电脑&#xff1a;USB&#xff0c;投影机(数据传输) 软件&#xff1a;统称APl,application,program,interface,微信提现和充值&#xff0c;支付宝支付&#xff0c;银联支付接口。(鉴权码&#xff1a;token,key,appkey) 2、接口包括&…

关于umi ui图标未显示问题

使用ant design pro 时&#xff0c;安装了umi ui &#xff0c;安装命令&#xff1a; yarn add umijs/preset-ui -D但是启动项目后&#xff0c;发现没有显示umi ui的图标 找了许多解决方案&#xff0c;发现 umi的版本问题&#xff0c;由于我使用的ant design pro官网最新版本&a…

tf.linspace时出现Could not find valid device for node.

背景&#xff1a; 在使用tensorflow2.x的时候,当使用tf.linspace的时候会出现如下的报错&#xff1a; import os os.environ[TF_CPP_MIN_LOG_LEVEL] 2import tensorflow as tf from tensorflow import keras import numpy as npdef out():# x tf.constant(np.arange(12).re…