小白也能上手的交互小程序教程:Big Box

news/2024/12/2 22:41:13/

引言

        本文将带您了解如何使用 HTML、CSS、JavaScript 和基本编程知识,创建一个名为“Big Box”的小程序,可以将一组小盒子收缩成一个中盒子,然后将其恢复为小盒子。

这个小程序将使用 HTML 和 CSS 来创建一个具有 flexbox 布局的容器,并在其中生成大量小盒子。最后,将使用 JavaScript 为小盒子添加事件,使其能够收缩成一个中盒子,并将其恢复为小盒子。

我们来看一下完整的代码实现:

<!DOCTYPE html>
<html><head><title>Big Box</title><style>/* 样式定义 */.container {width: 800px;height: 900px;display: flex;flex-wrap: wrap;border: 1px solid #ccc;}.box {width: 8.5px;height: 44.5px;border: 1px solid #ccc;margin: -1px;/* 确保相邻的两个小盒子之间没有空隙 */cursor: pointer;transition: width 0.3s, background-color 0.3s;display: block;/* 将.display样式初始化为block */}.box.hidden {/* visibility: hidden; 用 display: none; 代替*/display: none;}/* 绿色中盒子的样式 */.box.middle {background-color: #8BC34A;width: 121px;display: flex;align-items: center;justify-content: center;transition: width 0.3s, background-color 0.3s;}</style>
</head><body><div class="container"><!-- 生成80x20个小盒子 --><script>let boxStates = []; // 记录每个小盒子的初始 display 状态for (var i = 0; i < 1600; i++) {document.write('<div class="box"></div>');boxStates[i] = window.getComputedStyle(document.querySelectorAll('.box')[i]).getPropertyValue('display');}</script></div><script>// 变量定义var boxes = document.querySelectorAll('.box');var bigBox = document.querySelector('.container');// 给所有小盒子绑定点击事件for (var i = 0; i < boxes.length; i++) {boxes[i].addEventListener('click', function () {// 获取当前点击的小盒子的索引(从0开始)var clickedIndex = Array.prototype.indexOf.call(boxes, this);// 如果已经是个中盒子,则还原成16个小盒子if (this.classList.contains('middle')) {// 找到起始隐藏盒子的索引var startIndex = clickedIndex - 16;// 恢复初始状态for (var i = 0; i < 16; i++) {// 这里只需要判断当前元素的 .hidden样式即可if (boxes[startIndex + i].classList.contains('hidden')) {boxes[startIndexi].classList.remove('hidden');}}// 移除中盒子的样式this.classList.remove('middle');} else {// 否则,合并成中盒子this.classList.add('middle');// 找到起始隐藏盒子的索引var startIndex = clickedIndex + 1;// 记录更改的状态var newBoxStates = [];for (var i = 0; i < 16; i++) {if (boxes[startIndex + i].classList.contains('hidden')) {newBoxStates[i] = 'hidden';} else {newBoxStates[i] = 'visible';}boxes[startIndex + i].classList.add('hidden');}// 记录状态更改boxStates.splice(startIndex, 16, ...newBoxStates);}});}</script>
</body></html>

实现步骤 

  1. 首先,我们定义了 CSS 样式,用于定义容器和盒子的样式。在容器中,我们使用了 flexbox 布局,并将其设置为具有较大的宽度和高度,以便我们有足够的空间来放置大量的盒子。在盒子中,我们使用了一些简单的样式,例如边框、宽度、高度、左右负边距等,以及初始的 display 属性,并为小盒子和中盒子定义不同的背景色。
  2. 然后,我们在页面上添加了一个 div 容器,其中包含一个由 JavaScript 生成的 80x20 网格的小盒子。
  3. 接下来是 JavaScript 部分。首先,我们使用 querySelectorAll() 方法选中所有小盒子,并使用 getComputedStyle() 方法为每个小盒子记录了其初始的 display 属性,以便在将中盒子还原为小盒子时,我们可以恢复每个小盒子的 display 属性。
  4. 其次,我们给所有小盒子绑定了一个 click 事件监听器,通过 Array.prototype.indexOf.call() 方法计算出小盒子的索引,以便我们可以访问和修改与当前盒子相关的其他盒子的属性。当单击一个小盒子时,我们将会执行一个简单的检查: 如果点击的是中盒子,则将其还原为小盒子并显示所有隐藏的小盒子。否则,我们将合并16个小盒子,将它们转换为一个中盒子。

在上述检查中,我们首先检查当前盒子是否为中盒子。如果是,我们将从数组中检索起始的隐藏盒子的索引,设置一个 for 循环,用于检查每个小盒子的状态是否为隐藏。如果是,我们将移除它们的 hidden 类,这样它们就会显示在屏幕上。然后,我们移除中盒子的样式。

如果当前盒子不是中盒子,则执行另一段代码。我们在数组中记录了新的状态,然后将每个隐藏的小盒子的 hidden 类添加到其 classList 中。最后,我们更新 boxStates 数组中的状态。

在这个小程序中,最关键的部分是如何记录和管理每个小盒子的状态。我们使用 boxStates 数组来记录每个小盒子的初始状态(包括文档加载后的初始状态和之后的状态更改)。在合并或分成中盒子后,我们会检查当前小盒子在 boxStates 中的最新状态,并根据这个状态来恢复小盒子的初始状态或者隐藏它们。

总结

        总之,这是一个基于 HTML、CSS 和 JavaScript 的小程序,用于创建一个由多个小盒子组成的大盒子,在单击时可以把小盒子收缩成一个中盒子,然后再次单击时展开成小盒子。虽然这个程序看起来简单,但它涵盖了许多基础的编程概念,如选择器、事件监听器和数组的使用。通过这个例子,我们可以学习如何使用 HTML、CSS 和 JavaScript 创建交互性的小程序,并学习如何使用编程技术记录和管理数据状态。


http://www.ppmy.cn/news/208566.html

相关文章

[图表]pyecharts-K线图

[图表]pyecharts-K线图 先来看代码&#xff1a; import requests from typing import List, Unionfrom pyecharts import options as opts from pyecharts.charts import Kline, Line, Bar, Griddef get_data():response requests.get(url"https://echarts.apache.org/…

amlogic红外遥控器适配

amlogic红外遥控器适配 红外遥控根据遥控器的不同有多个config文件&#xff0c;文件位于\device\amlogic\p201_iptv中&#xff0c;如下图&#xff1a; 根据kernel日志的报错&#xff0c;找对应factory_code的conf文件&#xff0c;如下图&#xff1a; 将文件内的文件用U盘替换…

鸿蒙 麒麟820,华为最强千元机:绝版麒麟820 首升鸿蒙2.0 完美全屏!

原标题&#xff1a;华为最强千元机&#xff1a;绝版麒麟820 首升鸿蒙2.0 完美全屏&#xff01; 如果要在两千左右选出一款性价比无敌的机子&#xff0c;那么大多数人都会选择红米K30至尊版。的确如此&#xff0c;小智也多次说过红米K30至尊版在两千元左右是无敌的&#xff0c;但…

麒麟820鸿蒙,华为最强千元机:绝版麒麟820+首升鸿蒙2.0+完美全屏!

如果要在两千左右选出一款性价比无敌的机子&#xff0c;那么大多数人都会选择红米K30至尊版。的确如此&#xff0c;小智也多次说过红米K30至尊版在两千元左右是无敌的&#xff0c;但遗憾的是&#xff0c;1999的标准版几乎很难买到&#xff0c;大幅降低了其存在感。不过即使如此…

麒麟820升不升级鸿蒙,华为最强千元机:绝版麒麟820+首升鸿蒙2.0+完美全屏!

如果要在两千左右选出一款性价比无敌的机子&#xff0c;那么大多数人都会选择红米K30至尊版。的确如此&#xff0c;小智也多次说过红米K30至尊版在两千元左右是无敌的&#xff0c;但遗憾的是&#xff0c;1999的标准版几乎很难买到&#xff0c;大幅降低了其存在感。不过即使如此…

51红外遥控

1. 红外遥控是利用红外光进行通信的设备&#xff0c;红光LED将调质好的信号发出&#xff0c;由专用的红外接收头进行解调输出&#xff1b;通信方式是单方面的---不能进行交互通信&#xff1b;红外LED波长940nm---不可见&#xff08;遥控器&#xff09;&#xff1b;850nm&…

Ardunio-电视红外遥控,控制LeArm机械臂

一.简介 1.Ardunio&#xff1a;一款源自意大利的开放源代码硬件项目平台 2.LeArm&#xff1a;是幻尔科技旗下的一块产品&#xff0c;机身由六个舵机组成&#xff0c;的可编程机械臂 3.目的&#xff1a;实现电视遥控器控制机械臂移动和抓取 二.硬件 1.整体展示 2.控制设备 …

FPGA之红外遥控

文章目录 一、红外遥控简介1.红外遥控系统2.硬件介绍3.红外遥控编码协议4.重复码5.FPGA接收 二、程序设计1.实现功能2.红外接收模块3.led灯控制模块4.数码管控制模块①二进制转8421BCD模块②数码管控制模块 5.顶层代码6.RTL视图 三、仿真测试模块1.仿真测试模块代码2.仿真波形图…