基于javascript的可以自定义设置圆几等份的抽奖示例

这篇具有很好参考价值的文章主要介绍了基于javascript的可以自定义设置圆几等份的抽奖示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果示例图

基于javascript的可以自定义设置圆几等份的抽奖示例,JS,javascript,开发语言,ecmascript文章来源地址https://www.toymoban.com/news/detail-558871.html

代码示例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			* {
				padding: 0px;
				margin: 0px;
				box-sizing: border-box;
			}

			.cricle-wrap {
				border: 1px solid red;
				border-radius: 50%;
				width: 400px;
				height: 400px;
				margin: 50px auto;
				position: relative;
			}

			.min-cricle {
				border-radius: 50%;
				width: 10px;
				height: 10px;
				background-color: red;
				position: absolute;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
			}

			.cricle-line {
				width: 50%;
				height: 1px;
				background-color: red;
				position: absolute;
				top: 50%;
				left: 50%;
				/*
				* 默认情况下,元素的动作参考点为元素盒子的中心 
				* 使用transform-origin改变元素原点位置
				* :center center (正中)它以我的线的中间为圆点,进行旋转
				* :left center (靠左居中) 它以我的线的左边为圆点,进行旋转,即我的线的最左点是固定的,来旋转
				* :right center (靠右居中) 它以我的线的左右边为圆点,进行旋转,即我的线的最右点是固定的,来旋转
				*/
				transform-origin: left center;
			}

			.cricle-angle {
				width: 50%;
				height: 0;
				position: absolute;
				top: 50%;
				left: 50%;
				transform-origin: left center;
			}

			.cricle-angle-children {
				width: 100%;
				height: 100%;
				position: relative;
			}

			.grandson {
				border: 1px solid red;
				width: 50px;
				height: 30px;
				position: absolute;
				top: 50%;
				transform: translateY(-50%) rotate(90deg);
				text-align: center;
				line-height: 30px;
				font-size: 12px;
			}

			.arrow {
				border: 1px solid red;
				border-radius: 50%;
				width: 60px;
				height: 60px;
				position: absolute;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%) rotate(0deg);
				line-height: 60px;
				text-align: center;
				z-index: 1;
				background-color: #fff;
				background-image: url("img/arrow.png");
				background-position: center;
				background-repeat: no-repeat;
				background-size: 100% 100%;
			}

			.add-transition {
				transition: all 3s ease-in-out;
			}

			#draw {
				display: block;
				width: 100px;
				height: 40px;
				margin: 12px auto;
			}
		</style>
	</head>
	<body>
		<div class="cricle-wrap" id="cricle">
			<!-- 圆点 -->
			<div class="min-cricle"></div>
			<!-- 箭头 -->
			<div class="arrow"></div>
		</div>
		<button id="draw">抽检</button>

	</body>
	<script type="text/javascript">
		const options = {
			cricleBox: document.querySelector("#cricle"), //获取当前圆
			count: 9, //圆被均等分成n份
			radius: 200, //圆的半径
			prizeDisc: 10, //奖品所在位置0-50,值越小,距离圆心越远
		}
		turntable();

		function turntable() {

			//每一块的弧度
			const angle = 360 / options.count;
			for (let i = 0; i < options.count; i++) {
				let rotateAngle = i * angle;
				const scaleMark = createScaleMark(rotateAngle)
				options.cricleBox.appendChild(scaleMark);
				const prize = createPrize(rotateAngle, angle, i);
				options.cricleBox.appendChild(prize);
			}
			/**
			 * 创建刻度线
			 * **/
			function createScaleMark(rotateAngle) {
				const divs = document.createElement("div");
				divs.classList.add("cricle-line");
				divs.style.transform = `rotate(${rotateAngle-90}deg)`
				return divs
			}
			/**
			 * 创建奖品块
			 * **/
			function createPrize(rotateAngle, skewAngle, i) {
				const prizes = document.createElement("div");
				prizes.classList.add("cricle-angle");

				const childrenDIvs = document.createElement("div");
				childrenDIvs.classList.add("cricle-angle-children");

				const grandson = document.createElement("div");
				grandson.classList.add("grandson");
				grandson.style.right = `${options.prizeDisc}%`
				grandson.innerText = (i + 1) + '等奖';

				childrenDIvs.appendChild(grandson)

				prizes.appendChild(childrenDIvs)
				prizes.style.transform = `rotate(${rotateAngle-90+(skewAngle/2)}deg)`
				return prizes
			}

		}
		//中奖号码
		let winningNumber = 0;
		//箭头旋转的角度
		let rotate = 0;
		//点击抽奖按钮
		const arrow = document.querySelector(".arrow");
		document.querySelector("#draw").addEventListener("click", () => {
			winningNumber = Math.floor(Math.random() * options.count) + 1;
			rotateTurntable(winningNumber);
		})

		function rotateTurntable(n) {
			//每一块的弧度
			const angle = 360 / options.count;
			const skewAngle = angle / 2;
			rotate += n * angle - skewAngle + 360 * 10 + (360 - rotate % 360);
			arrow.classList.add("add-transition");
			arrow.style.transform = `translate(-50%, -50%) rotate(${rotate}deg)`;
		}
		//监听动画是否结束
		arrow.addEventListener("transitionend", () => {
			console.log("[动画结束]")
			console.log("[中奖号码]", winningNumber)
			arrow.classList.remove("add-transition");
			arrow.style.transform = `translate(-50%, -50%) rotate(${rotate}deg)`;
		})
	</script>
</html>

使用class

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			* {
				padding: 0px;
				margin: 0px;
				box-sizing: border-box;
			}

			.cricle-wrap {
				border: 1px solid red;
				border-radius: 50%;
				width: 400px;
				height: 400px;
				margin: 50px auto;
				position: relative;
			}

			.min-cricle {
				border-radius: 50%;
				width: 10px;
				height: 10px;
				background-color: red;
				position: absolute;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%);
			}

			.cricle-line {
				width: 50%;
				height: 1px;
				background-color: red;
				position: absolute;
				top: 50%;
				left: 50%;
				/*
				* 默认情况下,元素的动作参考点为元素盒子的中心 
				* 使用transform-origin改变元素原点位置
				* :center center (正中)它以我的线的中间为圆点,进行旋转
				* :left center (靠左居中) 它以我的线的左边为圆点,进行旋转,即我的线的最左点是固定的,来旋转
				* :right center (靠右居中) 它以我的线的左右边为圆点,进行旋转,即我的线的最右点是固定的,来旋转
				*/
				transform-origin: left center;
			}

			.cricle-angle {
				width: 50%;
				height: 0;
				position: absolute;
				top: 50%;
				left: 50%;
				transform-origin: left center;
			}

			.cricle-angle-children {
				width: 100%;
				height: 100%;
				position: relative;
			}

			.grandson {
				border: 1px solid red;
				width: 50px;
				height: 30px;
				position: absolute;
				top: 50%;
				transform: translateY(-50%) rotate(90deg);
				text-align: center;
				line-height: 30px;
				font-size: 12px;
			}

			.arrow {
				border: 1px solid red;
				border-radius: 50%;
				width: 60px;
				height: 60px;
				position: absolute;
				top: 50%;
				left: 50%;
				transform: translate(-50%, -50%) rotate(0deg);
				line-height: 60px;
				text-align: center;
				z-index: 1;
				background-color: #fff;
				background-image: url("img/arrow.png");
				background-position: center;
				background-repeat: no-repeat;
				background-size: 100% 100%;
			}

			.add-transition {
				transition: all 3s ease-in-out;
			}

			#draw {
				display: block;
				width: 100px;
				height: 40px;
				margin: 12px auto;
			}
		</style>
	</head>
	<body>
		<div class="cricle-wrap" id="cricle">
			<!-- 圆点 -->
			<div class="min-cricle"></div>
			<!-- 箭头 -->
			<div class="arrow"></div>
		</div>
		<button id="draw">抽检</button>
	</body>
	<script type="text/javascript">
		class Turntable {
			//中奖号码
			winningNumber = 0;
			//箭头旋转的角度
			rotate = 0;
			static OPTIONS = {
				cricleBox: document.querySelector("#cricle"), //获取当前圆
				arrow: document.querySelector(".arrow"), //箭头的按钮
				prizeBtn: document.querySelector("#draw"), //抽奖按钮
				count: 5, //圆被均等分成n份
				radius: 200, //圆的半径
				prizeDisc: 10, //奖品所在位置0-50,值越小,距离圆心越远
				success: null
			}
			constructor(options) {
				this.options = Object.assign({}, Turntable.OPTIONS, options);
				this.init();
			}

			init() {
				//每一块的弧度
				const angle = 360 / this.options.count;
				for (let i = 0; i < this.options.count; i++) {
					let rotateAngle = i * angle;
					const scaleMark = this.createScaleMark(rotateAngle)
					this.options.cricleBox.appendChild(scaleMark);
					const prize = this.createPrize(rotateAngle, angle, i);
					this.options.cricleBox.appendChild(prize);
				}
				this.clickEvent();
			}
			/**
			 * 创建刻度线
			 * rotateAngle :旋转的角度
			 * **/
			createScaleMark(rotateAngle) {
				const divs = document.createElement("div");
				divs.classList.add("cricle-line");
				divs.style.transform = `rotate(${rotateAngle-90}deg)`
				return divs
			}
			/**
			 * 创建奖品块
			 * rotateAngle :旋转的角度
			 * skewAngle:偏移量的角度
			 * **/
			createPrize(rotateAngle, skewAngle, i) {
				const prizes = document.createElement("div");
				prizes.classList.add("cricle-angle");

				const childrenDIvs = document.createElement("div");
				childrenDIvs.classList.add("cricle-angle-children");

				const grandson = document.createElement("div");
				grandson.classList.add("grandson");
				grandson.style.right = `${this.options.prizeDisc}%`
				grandson.innerText = (i + 1) + '等奖';

				childrenDIvs.appendChild(grandson)

				prizes.appendChild(childrenDIvs)
				prizes.style.transform = `rotate(${rotateAngle-90+(skewAngle/2)}deg)`
				return prizes
			}
			/**
			 * 点击抽奖,事件处理
			 * **/
			clickEvent() {
				this.options.prizeBtn.addEventListener("click", () => {
					this.winningNumber = Math.floor(Math.random() * this.options.count) + 1;
					this.rotateTurntable(this.winningNumber);
				})

				//监听动画是否结束
				this.options.arrow.addEventListener("transitionend", () => {
					console.log("[动画结束]")
					this.options.arrow.classList.remove("add-transition");
					this.options.arrow.style.transform = `translate(-50%, -50%) rotate(${this.rotate}deg)`;

					this.options.success && this.options.success(this.winningNumber)
				})
			}
			/**
			 * 转动箭头到指定奖品
			 * **/
			rotateTurntable(n) {
				//每一块的弧度
				const angle = 360 / this.options.count;
				const skewAngle = angle / 2;
				this.rotate += n * angle - skewAngle + 360 * 10 + (360 - this.rotate % 360);
				this.options.arrow.classList.add("add-transition");
				this.options.arrow.style.transform = `translate(-50%, -50%) rotate(${this.rotate}deg)`;
			}
		}
		new Turntable({
			cricleBox: document.querySelector("#cricle"), //获取当前圆
			arrow: document.querySelector(".arrow"), //箭头的按钮
			prizeBtn: document.querySelector("#draw"), //抽奖按钮
			count: 9, //圆被均等分成n份
			radius: 200, //圆的半径
			prizeDisc: 10, //奖品所在位置0-50,值越小,距离圆心越远
			success: (response) => {
				console.log(`${response}等奖`)
			}
		});
	</script>
</html>

到了这里,关于基于javascript的可以自定义设置圆几等份的抽奖示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于遗传算法GA的机器人栅格地图最短路径规划,可以自定义地图及起始点(提供MATLAB代码)

    遗传算法是一种基于生物进化原理的优化算法,常用于求解复杂问题。在机器人栅格地图最短路径规划中,遗传算法可以用来寻找最优路径。 遗传算法的求解过程包括以下几个步骤: 1. 初始化种群:随机生成一组初始解,每个解表示机器人在栅格地图上的路径。 2. 评估适应

    2024年03月11日
    浏览(113)
  • 基于JavaFX的扫雷游戏实现(五)——设置和自定义控件

      它来了它来了,最后一期终于来了。理论上该讲的全都讲完了,只剩下那个拖了好几期的自定义控件和一个比较没有存在感的设置功能没有讲。所以这次就重点介绍它们俩吧。   首先我们快速浏览下设置的实现,上图:   然后是控制器代码: SettingsController.java   

    2024年02月13日
    浏览(33)
  • 基于xilinx k7 325t实现的千兆网udp协议,只需要设置好IP,端口,就可以直接给数据

    基于xilinx k7 325t实现的千兆网udp协议,只需要设置好IP,端口,就可以直接给数据,基本等同于透传,可以不用管底层协议。 可以 # FPGA 实现udp模块说明 ## udp_protocol_top gig_ethernet_pcs_pma有脚本生成,任何版本vivado都可以支持,注释里面有对重要信号的说明,默认是1000M,100M需要改内部

    2024年01月16日
    浏览(41)
  • 基于Python编写一个B站全自动抽奖的小程序

    本文将利用Python编写一个B站全自动抽奖的小程序,可以实时监控自己关注的UP主,如果关注的UP主中有人发布了抽奖的动态,就自动参与这个抽奖。这样就能不错过任何一个可以暴富的机会了。需要的可以参考一下 应好友邀请,帮他写了个小程序,功能类似于实时监控自己关

    2024年01月24日
    浏览(53)
  • 基于uniapp ts 实现微信小程序动态抽奖幸运大转盘

     这是view视图层布局,内容中有注释,这里就不过多标注 以下是数据层实现方法  注:本人技术比较菜,体谅体谅,有好的建议欢迎提出来 上述是个人理解。描述不恰当的地方欢迎指正。一起进步~

    2024年02月03日
    浏览(52)
  • JavaScript DOM可以做什么?

    1、通过id获取标签元素 DOM是文档对象模型,它提供了一些属性和方法来方便我们操作document对象,比如getElementById()方法可以通过某个标签元素的id来获取这个标签元素 2、操作标签元素的内容 使用DOM可以操作HTML标签元素,写出各种绚丽多彩的特效,最基本的就是操作标签元素

    2024年01月20日
    浏览(34)
  • 【Python】分割列表(list)方法详解:平均n等份、拆成一个一个的

    在日常开发中,有时候需要把一个大列表分割为固定的小列表,再进行相关处理。下面来看看详细的分割方法: 2.1 分割大列表为1个元素的小列表 2.2 分割大列表为3个元素的小列表 2.2.1 普通方法 2.2.2 改进方法 改进:用列表推导,结果都放到一个列表。 2.2.3 lambda方法 2.3 平均

    2024年02月03日
    浏览(41)
  • 使用JavaScript实现保存文件,用户可以自己选择本地路径

    但是,此API目前仍处于实验阶段,可能并不在所有浏览器中都得到完全支持。 浏览器的权限是很低的,是不能与操作系统实现交互,只有少量的api可以与操作系统交互,例如文件上传。但是,软件是有很高的权限的,例如,迅雷下载就可以轻松实现,下载到指定目录。 但是

    2024年02月03日
    浏览(52)
  • 任何样式,javascript都可以操作,让你所向披靡

    习惯了在 css 文件里面编写样式,其实JavaScript 的 CSS对象模型也提供了强大的样式操作能力, 那就随文章一起看看,有多少能力是你不知道的吧。 客从八方来, 样式呢, 样式五方来。 chrome旧版本用户自定义样式目录: %LocalAppData%/Google/Chrome/User Data/Default/User StyleSheets。 新版

    2024年03月25日
    浏览(39)
  • JavaScript中的数据类型可以分为两类:原始类型和引用类型。

    JavaScript中的数据类型可以分为两类:原始类型和引用类型。 JavaScript中的原始类型有五种,分别是: 数字(Number):表示数字,包括整数和浮点数。 字符串(String):表示文本字符串。 布尔值(Boolean):表示逻辑上的真或假。 undefined:表示未定义的值。 null:表示空值。

    2024年01月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包