抽獎程序web程序

使用html實現抽獎程序,沒有后臺,如果需要后續寫個后臺可以配置,沒有過多的介紹,看代碼吧

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>婚禮抽獎</title><style>html, body {height: 100%;margin: 0;padding: 0;/* 這里改成紅色漸變 */background: radial-gradient(circle at 60% 10%, #ffb2b2 0%, #d7000f 100%);overflow: hidden;}body {font-family: '微軟雅黑','Segoe UI',Arial,sans-serif;}/* 跑馬燈樣式 */.marquee-bar-wrap {position: fixed;left:0; top: 0;width:100vw;height: 46px;background: linear-gradient(90deg,#ffdce7 0%,#fffbe7 60%,#ffdce7 100%);border-bottom: 2px solid #ffb6c1;z-index: 3000;box-shadow: 0 4px 20px #ffe4e950;display: flex;align-items: center;overflow: hidden;pointer-events: none;}.marquee-bar-content {position: absolute;white-space: nowrap;font-size: 1.45em;color: #e75480;font-weight: bold;letter-spacing: 2px;text-shadow: 0 2px 10px #fff0f7f0;left: 100vw;animation: marqueeMove 16s linear infinite;}@keyframes marqueeMove {from { left: 100vw; }to   { left: -100vw;}}.container {position: absolute;left: 50%; top: 50%;transform: translate(-50%,-50%);width: 1200px;height: 700px;background: rgba(255,255,255,0.93);border-radius: 36px;box-shadow: 0 10px 80px #f8bbd0bb;overflow: hidden;z-index: 1;}.title-area {position: absolute;width: 100%;top: 0;left: 0;text-align: center;z-index: 10;pointer-events: none;}h1 {margin: 36px 0 10px 0;font-size: 2.8em;color: #d72660;letter-spacing: 3px;font-weight: bold;}.subtitle {font-size: 1.3em;color: #a93a48;margin-bottom: 10px;letter-spacing: 2px;}.draw-btn {position: absolute;left: 50%; top: 620px;transform: translateX(-50%);font-size: 1.35em;background: linear-gradient(90deg, #ffb6c1 0%, #d72660 100%);border: none;color: #fff;padding: 18px 58px;border-radius: 32px;cursor: pointer;box-shadow: 0 4px 25px #d7266040;font-weight: bold;letter-spacing: 2px;outline: none;opacity: 1;transition: 0.2s;z-index: 20;}.draw-btn:active { filter: brightness(0.93);}.float-num {position: absolute;width: 80px; height: 80px;border-radius: 50%;background: linear-gradient(135deg,#ffb6c1 0%,#fff0f5 100%);color: #d72660;font-size: 1.9em;font-weight: bold;display: flex;align-items: center;justify-content: center;box-shadow: 0 3px 18px #ffb6c1a0;border: 3px solid #f8bbd0;user-select: none;pointer-events: none;transition: box-shadow 0.18s, transform 0.18s;animation: breatheBubble 2.2s infinite alternate;}@keyframes breatheBubble {0% { box-shadow: 0 3px 18px #ffb6c1a0; }100% { box-shadow: 0 8px 50px #ffd1e0a0, 0 0 28px #fff0f5cc inset;}}.float-num .heart {position: absolute;left: 50%; bottom: -12px;transform: translateX(-50%);font-size: 1.2em;color: #ffb6c1;opacity: 0.8;pointer-events: none;}.float-num.selected {background: linear-gradient(130deg,#e75480 30%,#fff0f7 100%);color: #fff;border: 4px solid #d72660;z-index: 99;animation: popBubble 0.4s cubic-bezier(.41,1.67,.37,1.01), breatheSelected 1.1s infinite alternate;}@keyframes popBubble {0% { transform: scale(1);}60% { transform: scale(1.33) rotate(-16deg);}100% { transform: scale(1) rotate(0);}}@keyframes breatheSelected {0% { box-shadow: 0 0 20px #ffa6c9, 0 0 0 #fff; }100% { box-shadow: 0 0 65px #e75480aa, 0 0 38px #fff0f5cc inset;}}.rings {position: absolute;top: -30px; right: 55px;width: 75px; height: 75px;z-index: 20;pointer-events: none;}.rings svg {width: 100%; height: 100%;}.boy-anim-mask {position: fixed;left: 0; top: 0; right: 0; bottom: 0;width: 100vw; height: 100vh;background: rgba(255,208,220,0.27);z-index: 2000;display: flex;align-items: flex-start;justify-content: center;cursor: pointer;animation: boyFadeInBg 0.38s;}@keyframes boyFadeInBg {from {background: rgba(255,208,220,0);}to   {background: rgba(255,208,220,0.27);}}.boy-anim-content {margin-top: -350px;animation: boySlideIn 1.0s cubic-bezier(.22,1.1,.45,1.01) forwards;display: flex;flex-direction: column;align-items: center;filter: drop-shadow(0 10px 32px #f8bbd0dd);}@keyframes boySlideIn {from { margin-top: -350px; opacity: 0; }80% { opacity: 1; }to { margin-top: 80px; opacity: 1; }}.boy-svg-wrap {width: 230px;height: 300px;position: relative;}.boy-num-holder {position: absolute;left: 50%;top: 62px;transform: translateX(-50%);width: 95px; height: 62px;background: #fffbe7;border-radius: 22px 22px 30px 30px;border: 3.5px solid #ffd5a6;display: flex;align-items: center;justify-content: center;font-size: 2.5em;font-weight: bold;color: #e75480;z-index: 2;box-shadow: 0 4px 16px #ffe1c1c1;letter-spacing: 2px;}.boy-win-text {margin-top: 18px;font-size: 2em;color: #d72660;font-weight: bold;text-shadow: 0 2px 10px #fff7e0;animation: textPop 1s;}@keyframes textPop {0%{ transform: scale(0.7); opacity: 0;}80%{ transform: scale(1.08);}100%{ transform: scale(1); opacity: 1;}}@media (max-width: 1300px) {.container { width: 98vw; min-width:320px; }.draw-btn { top: 83vh;}}@media (max-width: 800px) {.container { width: 100vw; height: 95vh; }}</style>
</head>
<body><!-- 頂部跑馬燈 --><div class="marquee-bar-wrap" id="marqueeBarWrap"><div class="marquee-bar-content" id="marqueeBarContent"></div></div><div class="container" id="float-area" style="top:calc(50% + 23px);"><div class="title-area"><h1>幸福婚禮抽獎</h1><div class="subtitle">各位賓客,誰會成為幸運兒?</div></div><button class="draw-btn" id="drawBtn">💍 抽獎</button><div class="rings"><svg viewBox="0 0 80 60"><ellipse cx="30" cy="30" rx="18" ry="18" fill="#ffe4e9" stroke="#d72660" stroke-width="3"/><ellipse cx="50" cy="30" rx="18" ry="18" fill="#fff0f5" stroke="#b23a48" stroke-width="3"/><rect x="24" y="10" width="12" height="8" rx="2" fill="#ffe4b5" stroke="#b23a48" stroke-width="2" transform="rotate(-15 30 14)"/></svg></div></div><!-- 動畫小男孩中獎展示 --><div id="boyMask" style="display:none;"></div>
<script>
// -------- 跑馬燈部分 --------
const marqueeContent = '歡迎各位賓客參加我們的婚禮,祝大家幸福美滿!抽獎即將開始,祝您好運~';
// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
// 在此修改要輪播展示的內容function setMarqueeText(txt){const ele = document.getElementById('marqueeBarContent');// 復制內容兩遍用于連續無縫循環ele.innerHTML = txt + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0'+ txt;// 動態調整動畫時長(越長越慢)setTimeout(function(){let w = ele.offsetWidth;let speed = Math.max(12, w/80); // 保證長內容也較慢ele.style.animationDuration = speed+'s';},80);
}
setMarqueeText(marqueeContent);// -------- 主抽獎部分 --------
const floatArea = document.getElementById('float-area');
const areaW = ()=>floatArea.clientWidth;
const areaH = ()=>floatArea.clientHeight;
const BALL_SIZE = 80;
const BALL_NUM = 30;
let balls = [];
let ballElements = [];
let animReq = null;// 1. 生成不重疊的初始位置和速度
function genBalls() {balls = [];ballElements = [];for(let i=1; i<=BALL_NUM; i++) {let tries = 0, maxTry=500, ok = false, bx,by;do {bx = 80 + Math.random()*(areaW()-BALL_SIZE-180);by = 90 + Math.random()*(areaH()-BALL_SIZE-200);ok = balls.every(b => Math.hypot(b.x-bx, b.y-by)>BALL_SIZE*1.07);tries++;} while(!ok && tries<maxTry);let speed = 1.3+Math.random()*0.8;let angle = Math.random()*2*Math.PI;balls.push({num: i,x: bx, y: by,vx: speed*Math.cos(angle),vy: speed*Math.sin(angle)});}
}// 2. 渲染氣泡
function renderBalls() {for(const ele of ballElements) floatArea.removeChild(ele);ballElements = [];for(let i=0;i<balls.length;i++) {let b = balls[i];let div = document.createElement('div');div.className = 'float-num';div.style.left = b.x+'px';div.style.top  = b.y+'px';div.innerHTML = `<span>${b.num}</span><span class="heart">?</span>`;floatArea.appendChild(div);ballElements.push(div);}
}
genBalls();
renderBalls();// 3. 漂浮動畫循環
function floatLoop() {for(let i=0;i<balls.length;i++) {let b = balls[i];// 邊界反彈if(b.x+b.vx<2) { b.vx = Math.abs(b.vx);}if(b.x+b.vx > areaW()-BALL_SIZE-2) { b.vx = -Math.abs(b.vx);}if(b.y+b.vy<40) { b.vy = Math.abs(b.vy);}if(b.y+b.vy > areaH()-BALL_SIZE-2) { b.vy = -Math.abs(b.vy);}// 與其它小球簡單互斥距離(彈彈彈)for(let j=0;j<balls.length;j++) if(i!==j){let b2=balls[j],dx=b.x-b2.x,dy=b.y-b2.y;let d = Math.hypot(dx,dy);if(d>0 && d<BALL_SIZE*0.98){let overlap = (BALL_SIZE*0.98-d)/2;b.x += dx/d*overlap;b.y += dy/d*overlap;}}// 隨機微調速度讓氣泡軌跡更活潑if(Math.random()<0.009) {let angle = Math.atan2(b.vy, b.vx)+((Math.random()-0.5)*0.7);let speed = (1.1+Math.random()*0.9);b.vx = speed*Math.cos(angle);b.vy = speed*Math.sin(angle);}b.x += b.vx;b.y += b.vy;let div = ballElements[i];div.style.left = b.x+'px';div.style.top = b.y+'px';}animReq = requestAnimationFrame(floatLoop);
}
floatLoop();// 4. 抽獎核心
let currentSelectedIdx = null;
const boyMask = document.getElementById('boyMask');function drawLottery() {// 動畫高亮閃爍let idx = 0, step=0;let rounds = Math.floor(Math.random()*2)+2;let totalSteps = rounds*balls.length + Math.floor(Math.random()*balls.length);document.getElementById('drawBtn').disabled = true;function highlightNext() {ballElements.forEach((div,i)=>div.classList.remove('selected'));idx = step%balls.length;ballElements[idx].classList.add('selected');step++;if(step<=totalSteps){let delay;if(step < totalSteps * 0.2) delay = 27;else if(step > totalSteps * 0.85) delay = 130;else delay = 47;setTimeout(highlightNext, delay);}else{currentSelectedIdx = idx;setTimeout(()=>showBoyAnim(balls[idx].num),320);}}highlightNext();
}// 5. 小男孩動畫中獎展示
function showBoyAnim(num){// 1. 內容填充boyMask.innerHTML = `<div class="boy-anim-mask" onclick="closeBoyAnim()"><div class="boy-anim-content" onclick="event.stopPropagation()"><div class="boy-svg-wrap"><svg width="230" height="300" viewBox="0 0 230 300"><rect x="108" y="15" width="16" height="72" rx="9" fill="#ffe4b5" transform="rotate(-7 108 15)" /><ellipse cx="115" cy="20" rx="11" ry="13" fill="#ffd2be" /><ellipse cx="115" cy="75" rx="46" ry="45" fill="#ffe4b5" stroke="#eac086" stroke-width="3"/><ellipse cx="70" cy="88" rx="8" ry="13" fill="#ffd2be" /><ellipse cx="160" cy="88" rx="8" ry="13" fill="#ffd2be" /><path d="M73 62 Q115 17 157 62 Q142 50 115 53 Q88 50 73 62Z" fill="#3f2b1c"/><ellipse cx="115" cy="52" rx="38" ry="13" fill="#3f2b1c"/><ellipse cx="99" cy="60" rx="9" ry="7.5" fill="#3f2b1c"/><ellipse cx="131" cy="60" rx="10" ry="8" fill="#3f2b1c"/><ellipse cx="100" cy="88" rx="6" ry="9" fill="#fff"/><ellipse cx="130" cy="88" rx="6" ry="9" fill="#fff"/><ellipse cx="100" cy="90" rx="2.3" ry="3" fill="#3f2b1c"/><ellipse cx="130" cy="90" rx="2.3" ry="3" fill="#3f2b1c"/><path d="M105 110 Q115 122 125 110" stroke="#b26d59" stroke-width="2.2" fill="none"/><ellipse cx="115" cy="101" rx="3.5" ry="1.6" fill="#b26d59" opacity="0.3"/><rect x="85" y="120" width="60" height="72" rx="28" fill="#7fd5ff" stroke="#5ca3c7" stroke-width="3"/><rect x="37" y="135" width="22" height="64" rx="11" fill="#ffe4b5" transform="rotate(16 50 135)" /><ellipse cx="53" cy="202" rx="11" ry="10" fill="#ffd2be"/><rect x="153" y="140" width="22" height="64" rx="11" fill="#ffe4b5" transform="rotate(-14 164 140)" /><ellipse cx="169" cy="202" rx="11" ry="10" fill="#ffd2be"/><rect x="93" y="193" width="17" height="36" rx="8" fill="#3c6384"/><rect x="120" y="193" width="17" height="36" rx="8" fill="#3c6384"/><ellipse cx="102" cy="232" rx="12" ry="7" fill="#4e2727"/><ellipse cx="128" cy="232" rx="12" ry="7" fill="#4e2727"/></svg><div class="boy-num-holder">${num}</div></div><div class="boy-win-text">🎉 恭喜 ${num} 號中獎!</div></div></div>`;boyMask.style.display = 'block';setTimeout(()=>{ document.getElementById('drawBtn').disabled = false; },1500);
}
function closeBoyAnim(){boyMask.style.display = "none";ballElements.forEach(div=>div.classList.remove('selected'));
}
window.closeBoyAnim = closeBoyAnim;document.getElementById('drawBtn').addEventListener('click', function(){drawLottery();
});window.addEventListener('resize', ()=>{cancelAnimationFrame(animReq);genBalls();renderBalls();floatLoop();
});
</script>
</body>
</html>

程序截圖
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93154.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python辦公】Excel轉json(極速版)-可自定義累加字段(如有重復KEY)

目錄 專欄導讀 ?? 亮點特性 ?? 安裝與運行 ??? 界面與區域說明 ?? 使用示例 ?? 使用建議 ? 常見問題(FAQ) ?? 技術要點 完整代碼 ?? 結語 專欄導讀 ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手 ?????? 博客主頁:請點擊——…

JavaScript 防抖(Debounce)與節流(Throttle)

在 JavaScript 前端開發中&#xff0c;處理高頻率事件&#xff08;如窗口調整、輸入框輸入、頁面滾動&#xff09;時&#xff0c;如果不加以控制&#xff0c;會導致性能問題&#xff0c;如頁面卡頓或資源浪費。防抖&#xff08;Debounce&#xff09;和節流&#xff08;Throttle…

探索無人機圖傳技術:創新視野與無限可能

近年來&#xff0c;無人機技術的飛速發展不僅改變了航空行業的格局&#xff0c;還深刻影響了多個領域的日常運作。無人機圖傳技術作為無人機的核心技術之一&#xff0c;憑借其精準的圖像傳輸能力和高效的遠程操作特性&#xff0c;正在成為各行各業的得力助手。從空中拍攝到實時…

Comfyui進入python虛擬環境

如果你的 Python 可執行文件&#xff08;python.exe&#xff09;位于 C:\comfyui\.venv\Scripts&#xff0c;那么 .venv 本身已經是一個虛擬環境&#xff0c;你只需要 激活它&#xff0c;而無需再創建一個新的虛擬環境。如何激活這個已有的虛擬環境&#xff1f; 1. 打開終端&am…

秋招春招實習百度筆試百度管培生筆試題庫百度非技術崗筆試|筆試解析和攻略|題庫分享

筆試介紹 百度非技術崗筆試采用的是規定時間統一筆試形式&#xff0c;管培生會有兩場考試分別是7月底和8月中旬&#xff0c;其他非技術類崗位一般在8月中旬開始。 行測題必考&#xff0c;有些崗位考簡答題&#xff0c;比如管培生以及產品經理等崗位。 筆試內容 筆試內容一…

低資源語言翻譯:數據增強與跨語言遷移學習策略

文章目錄一、低資源語言翻譯的挑戰1.1 數據稀缺性1.2 語言特性復雜1.3 評估困難二、數據增強策略&#xff08;Data Augmentation&#xff09;2.1 基于單語數據的增強2.2 基于平行數據的增強2.3 多模態數據增強三、跨語言遷移學習策略&#xff08;Cross-Lingual Transfer Learni…

【每天一個知識點】時間序列聚類

一、什么是時間序列聚類&#xff1f;如果把數據比作一本書&#xff0c;那么時間序列&#xff08;Time Series&#xff09;就是一本按時間順序記錄事件的日記。它可能是股票每天的價格波動、某臺機器的溫度曲線、一個城市的空氣質量變化&#xff0c;甚至是人的心電信號。時間序列…

對抗損失(GAN)【生成器+判斷器】

這個是啥呢&#xff0c;搞圖片生成用的。我搜了下&#xff0c;把整體流程記錄下&#xff0c;過程中會用到GAN準備數據集&#xff08;真實圖像素材&#xff09; 目標生成人臉的&#xff0c;你像游戲注冊時選一個臉。捏臉。那么準備真實人臉圖片老規矩&#xff0c;縮放裁剪…

5分鐘入門C++

這是5分鐘入門 C 的精簡 Demo&#xff0c;盡量涵蓋核心概念&#xff1a;變量、函數、類、控制流、STL 容器&#xff0c;讓你快速理解 C 的基本用法。#include <iostream> // 輸入輸出 #include <vector> // 動態數組 #include <algorithm> // 常用算法…

java注釋功能

為了優化代碼的使用&#xff0c;分享記錄相關注釋功能。 單行注釋 // 這是單行注釋文字多行注釋 /* 這是多行注釋文字 這是多行注釋文字 注意&#xff1a;多行注釋不能嵌套使用。 */文檔注釋 /**- 這是文檔注釋文字- */注釋的作用 描述類或方法的功能&#xff0c;方便別人和自…

(論文速讀)DiffusionDet - 擴散模型在目標檢測中的開創性應用

論文題目&#xff1a;DiffusionDet: Diffusion Model for Object Detection&#xff08;DiffusionDet:物體檢測的擴散模型&#xff09;會議&#xff1a;ICCV2023摘要&#xff1a;我們提出了DiffusionDet&#xff0c;這是一個新的框架&#xff0c;它將物體檢測描述為從噪聲盒到目…

LangChain簡介

LangChain 是一個用于構建基于大語言模型&#xff08;LLM&#xff09;的應用程序的開源框架&#xff0c;它提供了一套工具、組件和接口&#xff0c; 可以將 LLM 模型、向量數據庫、交互層 Prompt、外部知識、外部工具整合到一起&#xff0c;進而可以自由構建 LLM 應用。 LangCh…

為什么哈希表(字典)的查詢速度有時會突然變慢

哈希表&#xff08;在許多語言中被稱為“字典”或“關聯數組”&#xff09;的查詢速度&#xff0c;在理想情況下&#xff0c;應是接近“瞬時”的常數時間&#xff0c;然而&#xff0c;在特定場景下&#xff0c;其性能之所以會突然、無征兆地變慢&#xff0c;其根源&#xff0c;…

whisper 語種檢測學習筆記

目錄 transformers推理&#xff1a; transformers 源代碼 網上的語種檢測調用例子&#xff1a; 語種檢測 api transformers推理&#xff1a; https://github.com/openai/whisper/blob/c0d2f624c09dc18e709e37c2ad90c039a4eb72a2/whisper/decoding.py waveform, sample_rat…

第1節 從函數到神經網絡:AI思路的逆襲之路

&#x1f914; 開篇靈魂拷問 是不是覺得AI知識體系龐大到嚇人&#xff1f;看了一堆快餐視頻還是云里霧里&#xff1f;別慌&#xff01;這個系列就是要幫你打通任督二脈&#xff0c;用"既快又慢、既深入又膚淺、既有趣又嚴肅"的方式講透AI基礎知識&#xff01; &…

【科研繪圖系列】R語言繪制多種餅圖

文章目錄 介紹 加載R包 數據下載 導入數據 數據預處理 畫圖1 畫圖2 畫圖3 畫圖4 畫圖5 畫圖6 系統信息 參考 介紹 【科研繪圖系列】R語言繪制多種餅圖 加載R包 rm(list = ls()) library(ggstatsplot) library(ggplot2) library(plotrix) library(ggpubr

vue3權限樹封裝成組件

vue3權限樹組件 功能&#xff1a; 1、勾選節點、自動把父節點勾選。 2、取消勾選、子節點全部取消勾選。檢查父節點&#xff0c;如果只有這個子節點、遍歷把父節點取消勾選 3、filter過濾不僅展示父節點、相關子節點同時展示 4、 高亮顯示所有過濾數據 效果圖父組件引用 <te…

銓林接紙機學習記錄1

光電開關學習做保養也是檢查這些東西&#xff0c;包括氣路有沒漏氣&#xff0c;固定件松動、軌道清潔之內刀座暫停光電I23刀座行程磁性開關&#xff0c;這個是安全警戒光電&#xff0c;驅動側發射信號&#xff0c;操作側接收刀座暫停光電正常運行是空白的&#xff0c;當出現遮擋…

47.分布式事務理論

所有的事務都必須滿足ACID的原則: 原子性:事務中的所有操作,要么全部成功,要么全部失敗。 一致性:要保證數據庫內部完整性約束、聲明性約束。 持久性:對數據庫做的一切修改將永久保存,不管是否出現故障。 隔離性:對同一資源操作的事務不能同時發生。 分布式事務的…

【軟考】進度管理知識庫工具-挺方便

進度管理知識庫 全面解析項目管理中的進度管理核心概念、工具、技術和最佳實踐&#xff0c;幫助您高效管理項目時間線 六步流程法 規劃進度管理 - 制定進度管理計劃 定義活動 - 識別和記錄項目活動 排列活動順序 - 確定活動間的邏輯關系 估算活動持續時間 - 估算完成單項活動所…