bootstrap实现天平效果

news2024/11/14 1:46:29

之前提到了,最近,孩子的幼儿园让家长体验“半日助教活动”,每个家长需要讲授15-20分钟的课程。作为一名程序员,实在没有能教的课程,只能做了一个小游戏,带着小朋友们熟悉数字。

在上一章博客中,笔者发布了九宫格中猫捉老鼠的小游戏源码,下面再把通过bootstrap实现天平效果的源码发布,供读者参考。

效果大致是这样的。通过前端代码生成一个简易的天平,天平两边分别随机生成一个数字,点击较大的数字天平就会倾斜。

天平两边生成随机数的截图:

点击较大数字天平倾斜的截图:

废话不多说,直接上源码。

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <!-- 引入bootstrap -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"> 
    <link rel="stylesheet" href="./css/d2g.css">
    <title>跷跷板比大小</title>
</head>
<body>
	<div id="imgInfo">跷跷板比大小</div>
    <!-- 跷跷板 -->
    <div class="jenga-container">
      <div class="jenga-block" id="block1"></div>
	  <div class="line" id="line"></div>
	  <div class="sjx" id="sjx"></div>
      <div class="jenga-block" id="block2"></div>
    </div>
</body>
<!-- 引入js文件 -->
<script src="./js/d2g.js"></script>
</html>

html代码没什么好说的,就是两个方块儿,中间用横线连接,横线下面再放一个三角形作为支点。

css:

#imgInfo{
	width: 100%;
    margin-top: 20px;
    text-align: center;
	color: blue;
}
#line {
  height: 2px; /* 设置为最大高度 */
  background-color: #000;
  position: absolute;
  transform-origin: top; 
  transition: transform 0.8s ease-out;
}
#sjx {
  width: 100px;
  height: 100px; /* 设置为最大高度 */
  background-image: url('../img/sjx1.jpg'); /* 设置背景图片 */
  background-size: cover; /* 背景图片覆盖整个div区域 */
  background-position: center; /* 背景图片居中 */
  position: absolute;
  transition: transform 0.8s ease-out;
}
.jenga-container {
  display: flex;
  justify-content: space-around;
  align-items: flex-end;
}
 
.jenga-block {
  background-color: yellowgreen;
  margin: 2px 0;
  text-align: center;
  transform: translateX(0);
  transition: transform 0.8s ease-out;
}

css中通过transition属性设置了天平横线、方块儿、三角形的倾斜效果。

js:

window.onload = function(xh){
    // 获取视口宽度
    const viewportWidth = window.innerWidth
    // 获取视口高度
    const viewportHeight = window.innerHeight
	var imgInfo = document.querySelector('#imgInfo')
	var line = document.querySelector('#line')
	var sjx = document.querySelector('#sjx')
	var block1 = document.querySelector('#block1')
	var block2 = document.querySelector('#block2')
	var jengacontainer = document.getElementsByClassName('jenga-container')
	//为每个容器设置height
	for(var i=0;i<jengacontainer.length;i++){
	    jengacontainer[i].style.height = viewportHeight*0.34+'px'
	}
	var jengablock = document.getElementsByClassName('jenga-block')
	//为每个容器设置height
	for(var i=0;i<jengablock.length;i++){
	    jengablock[i].style.height = viewportHeight*0.24+'px'
		jengablock[i].style.width = viewportWidth*0.15+'px'
		jengablock[i].style.fontSize = viewportHeight*0.17+'px'
	}
	imgInfo.style.height = viewportHeight*0.12+'px'
	imgInfo.style.fontSize = viewportHeight*0.06+'px'
	line.style.width = viewportWidth*0.35+'px'
	line.style.top = (viewportHeight-viewportHeight*0.63)+'px'
	sjx.style.top = (viewportHeight-viewportHeight*0.63+2)+'px'
	sjx.style.width = viewportWidth*0.08+'px'
	sjx.style.height = viewportWidth*0.08+'px'
	let szqz1 = Math.floor(Math.random() * 10);
	block1.innerHTML = szqz1;
	let szqz2 = getRandomNumber(szqz1)
	block2.innerHTML = szqz2;
	/**
	 * 点击三角形重置数字
	 */
	sjx.onclick = function(){
		var audio1 = new Audio('./audio/py2.MP3');
		// 播放音频
		audio1.play();
    }
	/**
	 * 播放音频
	 */
	if(xh!=2){
		//开始配音
		var audio = new Audio('./audio/py8.MP3');
		// 播放音频
		audio.play();
	}
	
	/**
	 * block2里面的数字大
	 */
	block2.onclick = function(){
		const y =  viewportHeight*0.3
        block2.style.transform = 'translateY('+y+'px)';
		//线变斜
		const y2 =  viewportHeight*0.12
		const radians = Math.atan2(y, viewportWidth*0.35);
		// 将弧度转换为角度
		const degrees = radians * (180 / Math.PI);
		const a = viewportWidth*0.35
		const b = viewportHeight*0.3
		const c= Math.sqrt(a*a + b*b)
		line.style.width = c+'px';
		line.style.transform = 'translateY('+y2+'px) rotate('+degrees+'deg)';
		sjx.style.transform = 'translateY('+(y/2+4)+'px)';
		//播放音频
		var audio = new Audio('./audio/py11.MP3');
		// 播放音频
		audio.play();
    }
	/**
	 * block1里面的数字大
	 */
	block1.onclick = function(){
		const y =  viewportHeight*0.3
	    block1.style.transform = 'translateY('+y+'px)';
		//线变斜
		const y2 =  viewportHeight*0.12
		const radians = Math.atan2(y, viewportWidth*0.35);
		// 将弧度转换为角度
		const degrees = radians * (180 / Math.PI);
		const a = viewportWidth*0.35
		const b = viewportHeight*0.3
		const c= Math.sqrt(a*a + b*b)
		line.style.width = c+'px';
		line.style.transform = 'translateY('+y2+'px) rotate('+(-degrees)+'deg)';
		sjx.style.transform = 'translateY('+(y/2+4)+'px)';
		//播放音频
		var audio = new Audio('./audio/py11.MP3');
		// 播放音频
		audio.play();
	}
}
function getRandomNumber(exclude) {
    let num;
    do {
        num = Math.floor(Math.random() * 10);
    } while (num === exclude);
    return num;
}

js中需要注意一下,这里有个小小的算法,因为在数字大的方块儿下移的时候,中间的天平横线长度也要跟着变,不然无法连接到两端。所以,要通过勾股定理计算出天平横线的长度、倾斜角度和中间三角形下降的距离。在block1/block2.onclick函数中可以看到这个小小的算法。

笔者这里只是实现了很简单的效果,但大概原理是对的。各位读者可以自行试试~~~~

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

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

相关文章

解决mysql5.7版本中,子查询order by后,对子查询进行group by分组获取最新记录无效的问题

目录 场景简介原因示例mysql5.7之前的版本mysql5.7之后的版本解决1、使用having2、使用limit3、使用子查询获取目标数据ID 场景简介 子查询order by后&#xff0c;对子查询进行group by分组获取最新记录失败 应用场景&#xff1a;一对多的关系&#xff0c;通常需要取最新、最…

好消息!PMP纸质证书可以领取啦!(22年11月至23年8月)

上周五&#xff0c;中国国际人才交流基金会官方发布了《关于2022年11月和2023年3月、5月、8月PMI认证考试证书领取》的通知&#xff0c;具体内容如下&#xff1a; 之前顺利通过PMP/ACP/PgMP考试的同学抓紧时间&#xff0c;在5月24日—6月10日内进入官网上登记领取证书。 PMP考…

1990-2021 年全球油棕面积和种植年份数据集

简介 该数据集利用 2016 年至 2021 年的哨兵-1 号数据&#xff0c;以 10 米的分辨率提供了油棕种植园的全球综合地图&#xff0c;包括工业用地和小农地块。此外&#xff0c;该数据集还包括根据 Landsat-5、-7 和-8 图像得出的 1990 年至 2021 年 30 米空间分辨率的种植年份估计…

UE驻网失败问题(二)

另一个UE注册失败的问题&#xff0c;具体过程如下&#xff1a; 问题现象如上&#xff0c;UE在这个N48上的小区一直在重复上述过程&#xff0c;收到RRC Setup后就不发RRC Setupcomplete&#xff0c;闭上眼睛也知道大概率是这个RRC Setup的配置有问题。 在问题时间点周围查看&…

TI_DSP_F2808学习笔记3: ePWM

共有6组ePWM&#xff0c;每一组 ePWM 模块都包含以下 7 个模块&#xff1a;时基模块 TB、计数比较模块 CC、动作模块 AQ、死区产生模块 DB、PWM 斩波模块 PC、错误联防模块 TZ、时间触发模块 ET。 时基模块 TB 确定PWM的周期和相位。 1&#xff09;PWM 时基计数器&#xff…

使用vue,mybatis,mysql,tomcat,axios实现简单的登录注册功能

目录 第一步环境搭建 后端&#xff1a; 前端&#xff1a; 第二步画流程图 web: service: dao层&#xff1a; 第三步前端代码的实现 这是开始的页面&#xff0c;接下来我们要到router路由下书写#login的路径 路由中的component在我们自己创建的views书写vue文件…

数据库语法树优化

目录 一、σ、π、⋈ 1.选择σ 2.投影π 3.连接⋈ 二、 构建语法树 ① 解读sql语句 ② 写出关系代数表达式 ③ 画出语法树 三、优化语法树 四、练习 语法树优化方法 一、σ、π、⋈ 1.选择σ 选择就是在关系R中选择满足给定条件的诸元组。 通过条件SdeptIS选择出系别…

某安全厂商外包安服工程师面试

写在前面&#xff1a;本篇帖子出现的厂商and面试问题皆为up实际面试情况&#xff0c;厂商信息不透露&#xff0c;仅供师傅们参考。 背景 某知名安全厂商外包 岗位&#xff1a;安全服务工程师&#xff08;偏售后&#xff09; 薪资条件&#xff1a;7~9k&#xff08;up所在二线…

Nssm打包.netcore控制台程序到Windows服务,实现长Ping服务器

需求&#xff1a;应客户需求&#xff0c;现场服务器和客户端之间网络总是不稳定。导致客户端总是和服务器断开连接。为了监测网络&#xff0c;且为了不容易让用户误操作停止监测&#xff0c;所以采用控制台程序打包成windows服务的方式实现。并且加一个winform程序&#xff0c;…

CLI举例:负载分担场景下的源NAT配置(主备设备共用同一个地址池)

CLI举例&#xff1a;负载分担场景下的源NAT配置&#xff08;主备设备共用同一个地址池&#xff09; 组网需求 如图1所示&#xff0c;企业的两台FW的业务接口都工作在三层&#xff0c;上下行分别连接路由器。FW与上下行路由器之间运行OSPF协议。上行接口连接同一个ISP。 现在希…

Ubuntu18 配置FFmpeg开发环境 (Vscode+CMake)

关于Vscode插件安装不再赘述&#xff0c;本文主要讲解如何配置FFmpeg的开发环境以及CMake文件写法&#xff0c;如果不知道该安装什么插件请看本文&#xff1a; Ubuntu配置Vscode 文章目录 1.安装FFmpeg开发包2.配置Vscode项目3.使用C语言验证FFmpeg版本 1.安装FFmpeg开发包 更新…

白银现货价格对这两种形态形成突破 应当予以关注

在白银现货价格分析和交易中&#xff0c;突破这个行为一直是一个重要的、具有可分析性的市场动作。本文要讨论的&#xff0c;是基于价格形态之上的突破行为&#xff0c;下面我们就来看看。 中继形态的突破。白银现货价格波动中有中继形态有反转形态&#xff0c;中继形态的意思是…

经典获奖案例 | 度小满互联网金融开源软件治理解决方案

近日&#xff0c;广东省粤港澳合作促进会金融专业委员会和粤港澳大湾区金融创新研究院在广州联合举办“2024年粤港澳大湾区数智金融峰会暨第二届金融创新优秀应用案例与解决方案技术成果授牌仪式”。《度小满互联网金融开源软件治理解决方案》从数百个申报项目中脱颖而出&#…

字符串函数(2)<C语言>

前言 快一周没更博客了&#xff0c;最近有点忙&#xff0c;今天闲下来了&#xff0c;还是不行&#xff0c;继续干&#xff0c;书接上回继续介绍字符串函数&#xff1a;strncpy()、strncat()、strcmp()、strtok()使用、strstr()使用以及模拟实现、strerror()使用。 strncpy()、s…

几种流行的并行方法了解

几种流行的并行方法&#xff1a; 数据并行&#xff08;data parallel&#xff09;模型并行&#xff08;model parallel&#xff09; tensor并行pipeline并行sequence并行Zero Redundancy Data Parallelism&#xff08;ZeRO&#xff09; Data parallelism (DP) 经典的数据并行…

snmp学习小结

背景 很多厂商网络设备获取网络信息接口不一样&#xff0c;snmp用来统一接口 官网Net-SNMP 模型 每个主机可以安装自己的snmp agent&#xff0c;它可以监控目标机器的网络流量&#xff0c;当外部查询snmp信息时&#xff0c;请求会发到目标机器的snmp agent&#xff0c;由sn…

魅族应用市场驳回 安装包包含32位库,请处理32位库后再重新提交

问题出现 解决方法 打开HBuilerX找到项目的mainfest.json 取消cpu类型中armeabi-v7a的勾选。 armeabi-v7a 第7代及以上的ARM处理器&#xff08;ARM32位&#xff09;&#xff0c;市面上大多数手机使用此CPU类型。 arm64-v8a 第8代、64位ARM处理器&#xff08;ARM64位&#x…

Halcon 光度立体 缺陷检测

一、概述 halcon——缺陷检测常用方法总结&#xff08;光度立体&#xff09; - 唯有自己强大 - 博客园 (cnblogs.com) 上周去了康耐视的新品发布会&#xff0c;我真的感觉压力山大&#xff0c;因为VM可以实现现在项目中的80% 的功能&#xff0c;感觉自己的不久就要失业了。同时…

Java通过Html(ftl模板)生成PDF实战, 可支持商用

Java通过Html(freemarker模板)生成PDF实战, 可支持商用 技术架构 springboot freemarker [pdfbox] flying-saucer-pdf 生成流程&#xff1a; freemarker: 根据数据填充ftl模板文件&#xff0c;得到包含有效数据的html文件&#xff08;包含页眉页脚页码的处理&#xff0c…

Delft3D水动力-富营养化模型(水质模型)教程

原文链接&#xff1a;Delft3D水动力-富营养化模型&#xff08;水质模型&#xff09;教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247605459&idx5&sn105e94f09f0589172835ce8204519971&chksmfa821d34cdf59422b4f6c39b243373a23836d79841a1fcd19f9…