js+canvas實(shí)現(xiàn)轉(zhuǎn)盤效果(兩個(gè)版本)
本文實(shí)例為大家分享了js+canvas實(shí)現(xiàn)轉(zhuǎn)盤效果的具體代碼,供大家參考,具體內(nèi)容如下
用到了canvas的繪制,旋轉(zhuǎn),重繪操作,定時(shí)器,文本,平移,線條,圓,清理畫布等等;
版本一
不可以點(diǎn)擊,刷新旋轉(zhuǎn)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>轉(zhuǎn)盤抽獎(jiǎng)</title> <style type="text/css"> #myCanvas { background: #FAEBD7; } </style> </head> <body> <canvas id="myCanvas" width="500" height="500"></canvas> </body> <script type="text/javascript"> var myCanvas = document.getElementById("myCanvas"); var cxt = myCanvas.getContext("2d"); // 平移畫布 cxt.translate(250, 250); // 圓心坐標(biāo) var oX = 0; var oY = 0; // 大圓半徑 var oR = 150; // 小圓半徑 var oR1 = 50; // 弧度 var oH = Math.PI / 180; // 定時(shí)器 var timer; // 角度 var angle = 0; // 文本 var textArr = ["JavaScript", "jQuery", "Vue", "ajax", "rect", "angular", "HTML", "css"]; // 顏色 var colorArr = []; // 隨機(jī)生成顏色 for (var i = 0; i < textArr.length; i++) { var c = "rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ")" colorArr.push(c); } //起始速度 var seep = Math.random() * 100 + 100; timer = setInterval(function() { if (seep < 0.3) { clearInterval(timer); var index = Math.floor(angle / 45); console.log(index); cxt.font = "12px Arial"; cxt.textAlign = "center"; cxt.textBaseline = "middle" cxt.fillStyle = "black"; var txt = textArr[textArr.length - index-1]; // console.log(cxt.measureText(txt).width); cxt.fillText(txt, 0, 0); } else { //重繪 // 清除畫布 cxt.clearRect(-250, -250, 500, 500); // 處理角度 if (angle >= 360) { angle = 0; } // 處理速度 seep *= 0.95; // 減小速度 angle += seep; // 畫短線 cxt.beginPath(); cxt.strokeStyle = "red"; cxt.lineWidth = 2; cxt.moveTo(150, 0); cxt.lineTo(180, 0); cxt.stroke(); // 保存環(huán)境,旋轉(zhuǎn)畫布 cxt.strokeStyle = "chartreuse"; cxt.save(); cxt.rotate(angle * oH); // 畫扇形 for (var i = 0; i < 8; i++) { cxt.fillStyle = colorArr[i]; cxt.beginPath(); cxt.moveTo(0, 0); cxt.arc(0, 0, 150, i * 45 * oH, (i + 1) * 45 * oH); cxt.closePath(); cxt.fill(); cxt.stroke(); } // 畫中心圓 cxt.fillStyle = "#FFF"; cxt.beginPath(); cxt.arc(oX, oY, oR1, 0, 2 * Math.PI); cxt.fill(); // 添加文字 for (var i = 0; i < textArr.length; i++) { cxt.save(); cxt.rotate((i * 45 + 25) * oH); cxt.fillStyle = "#fff"; cxt.font = "16px 微軟雅黑"; cxt.fillText(textArr[i], 70, 0); cxt.restore(); } cxt.restore(); // 環(huán)境釋放與環(huán)境保存成對(duì) } }, 50); </script> </html>
版本二
加了點(diǎn)擊事件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>轉(zhuǎn)盤抽獎(jiǎng)</title> <style type="text/css"> #myCanvas { background: #FAEBD7; } </style> </head> <body> <canvas id="myCanvas" width="500" height="500"></canvas> </body> <script type="text/javascript"> var myCanvas = document.getElementById("myCanvas"); var cxt = myCanvas.getContext("2d"); // 平移畫布 cxt.translate(250, 250); // 圓心坐標(biāo) var oX = 0; var oY = 0; // 大圓半徑 var oR = 150; // 小圓半徑 var oR1 = 50; // 弧度 var oH = Math.PI / 180; // 定時(shí)器 var timer; // 角度 var angle = 0; // 文本 var textArr = ["JavaScript", "jQuery", "Vue", "ajax", "rect", "angular", "HTML", "css"]; // 顏色 var colorArr = []; // 隨機(jī)生成顏色 for (var i = 0; i < textArr.length; i++) { var c = "rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ")" colorArr.push(c); } //起始速度 var seep = Math.random() * 100 + 100; drawLine(); myCanvas.onclick = function(event) { var mX = event.clientX - myCanvas.offsetLeft; var mY = event.clientX - myCanvas.offsetTop; if (cxt.isPointInPath(mX, mY)) { var j = 50; var times = null; if (times == null) { times = setInterval(function() { if (seep < 0.3) { clearInterval(timer); var index = Math.floor(angle / 45); console.log(index); cxt.font = "12px Arial"; cxt.textAlign = "center"; cxt.textBaseline = "middle" cxt.fillStyle = "black"; var txt = textArr[textArr.length - index - 1]; cxt.fillText(txt, 0, 0); } else { drawLine(); } }, 50); } } else { alert("no") } } function drawLine() { //重繪 // 清除畫布 cxt.clearRect(-250, -250, 500, 500); // 處理角度 if (angle >= 360) { angle = 0; } // 處理速度 seep *= 0.95; // 減小速度 angle += seep; // 畫短線 cxt.beginPath(); cxt.strokeStyle = "red"; cxt.lineWidth = 2; cxt.moveTo(150, 0); cxt.lineTo(180, 0); cxt.stroke(); // 保存環(huán)境,旋轉(zhuǎn)畫布 cxt.strokeStyle = "chartreuse"; cxt.save(); cxt.rotate(angle * oH); // 畫扇形 for (var i = 0; i < 8; i++) { cxt.fillStyle = colorArr[i]; cxt.beginPath(); cxt.moveTo(0, 0); cxt.arc(0, 0, 150, i * 45 * oH, (i + 1) * 45 * oH); cxt.closePath(); cxt.fill(); cxt.stroke(); } // 畫中心圓 cxt.fillStyle = "#FFF"; cxt.beginPath(); cxt.arc(oX, oY, oR1, 0, 2 * Math.PI); cxt.fill(); // 添加文字 for (var i = 0; i < textArr.length; i++) { cxt.save(); cxt.rotate((i * 45 + 25) * oH); cxt.fillStyle = "#fff"; cxt.font = "16px 微軟雅黑"; cxt.fillText(textArr[i], 70, 0); cxt.restore(); } cxt.restore(); // 環(huán)境釋放與環(huán)境保存成對(duì) } </script> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js抽獎(jiǎng)轉(zhuǎn)盤實(shí)現(xiàn)方法分析
- Vue.js實(shí)現(xiàn)大轉(zhuǎn)盤抽獎(jiǎng)總結(jié)及實(shí)現(xiàn)思路
- JS實(shí)現(xiàn)簡(jiǎn)單的抽獎(jiǎng)轉(zhuǎn)盤效果示例
- jquery.rotate.js實(shí)現(xiàn)可選抽獎(jiǎng)次數(shù)和中獎(jiǎng)內(nèi)容的轉(zhuǎn)盤抽獎(jiǎng)代碼
- 利用Javascript實(shí)現(xiàn)簡(jiǎn)單的轉(zhuǎn)盤抽獎(jiǎng)
- js HTML5 Canvas繪制轉(zhuǎn)盤抽獎(jiǎng)
- javascript+HTML5 Canvas繪制轉(zhuǎn)盤抽獎(jiǎng)
- 基于javascript實(shí)現(xiàn)九宮格大轉(zhuǎn)盤效果
- js實(shí)現(xiàn)大轉(zhuǎn)盤抽獎(jiǎng)游戲?qū)嵗?/a>
- JS+Canvas繪制抽獎(jiǎng)轉(zhuǎn)盤
相關(guān)文章
js獲取數(shù)組最后一位元素的五種方法及執(zhí)行效率對(duì)比
js獲取數(shù)組最后一位元素的五種方法代碼示例,使用console.time和console.timeEnd測(cè)量javascript腳本程序執(zhí)行效率對(duì)比2023-08-08js實(shí)現(xiàn)網(wǎng)頁(yè)自動(dòng)刷新可制作節(jié)日倒計(jì)時(shí)效果
這篇文章主要介紹了通過(guò)js實(shí)現(xiàn)的網(wǎng)頁(yè)自動(dòng)刷新,利用此功能可制作節(jié)日倒計(jì)時(shí)效果,需要的朋友可以參考下2014-05-05js限制checkbox選中個(gè)數(shù)以限制六個(gè)為例
需要展示多個(gè)checkbox復(fù)選框,而只能允許最多選6個(gè),下面為大家介紹下如何使用js限制checkbox選中個(gè)數(shù),需要的朋友可以參考下2014-07-07JavaScript實(shí)現(xiàn)簡(jiǎn)單的四則運(yùn)算計(jì)算器完整實(shí)例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單的四則運(yùn)算計(jì)算器,結(jié)合完整實(shí)例形式分析了javascript基于表單相應(yīng)實(shí)現(xiàn)加減乘除數(shù)學(xué)運(yùn)算的操作技巧,需要的朋友可以參考下2017-04-04原生JS取代一些JQuery方法的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇原生JS取代一些JQuery方法的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09JavaScript實(shí)現(xiàn)一個(gè)空中避難的小游戲
最近利用Javascript實(shí)現(xiàn)了一個(gè)小游戲,覺(jué)著還不錯(cuò),所以分享給大家,下面這篇文章主要給大家介紹了利用JavaScript實(shí)現(xiàn)一個(gè)空中避難的小游戲的相關(guān)資料,文中給出了完整的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。2017-06-06JavaScript實(shí)現(xiàn)點(diǎn)擊按鈕直接打印
很多網(wǎng)站都有此功能,當(dāng)瀏覽到底部時(shí)都會(huì)有一個(gè)打印按鈕,點(diǎn)擊打印按鈕就可以完成打印功能,功能非常不錯(cuò),人性化,下面通過(guò)本文給大家介紹JavaScript實(shí)現(xiàn)點(diǎn)擊按鈕就打印的代碼,需要的朋友參考下2016-01-01