Spaces:
Sleeping
Sleeping
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>Wheel of Fortune</title> | |
<style> | |
body { | |
display: flex; | |
justify-content: center; | |
align-items: center; | |
height: 100vh; | |
background-color: black; | |
color: white; | |
font-family: Arial, sans-serif; | |
} | |
.container { | |
text-align: center; | |
} | |
#wheelOfFortune { | |
border: 2px solid #f82; /* Оранжевая окантовка для колеса */ | |
border-radius: 10px; | |
padding: 20px; | |
margin-bottom: 20px; | |
} | |
#wheel { | |
border: 2px solid #f82; /* Оранжевая окантовка для колеса */ | |
border-radius: 50%; | |
} | |
#spin { | |
margin-top: 20px; | |
padding: 10px 20px; | |
border: 2px solid #f82; /* Оранжевая окантовка для кнопки Пуск */ | |
border-radius: 5px; | |
background-color: black; | |
color: white; | |
cursor: pointer; | |
transition: background-color 0.3s; | |
} | |
#spin:hover { | |
background-color: #f82; /* Оранжевый фон при наведении на кнопку Пуск */ | |
} | |
#registrationForm { | |
display: none; | |
background-color: black; | |
padding: 30px; /* Увеличенный padding для формы */ | |
border: 2px solid #f82; /* Оранжевая окантовка для формы */ | |
border-radius: 10px; | |
text-align: center; | |
width: 90%; | |
max-width: 400px; | |
} | |
#registrationForm h1 { | |
color: #f82; /* Оранжевый цвет для заголовка */ | |
margin-bottom: 20px; | |
} | |
#registrationForm input[type="text"], | |
#registrationForm input[type="email"], | |
#registrationForm input[type="tel"] { | |
width: calc(100% - 22px); | |
padding: 10px; | |
margin-bottom: 10px; | |
border: 2px solid #f82; /* Оранжевая окантовка для полей ввода */ | |
border-radius: 5px; | |
background-color: black; | |
color: lightgray; /* Светло-серый цвет текста в полях ввода */ | |
} | |
#registrationForm input[type="checkbox"] { | |
margin-right: 5px; | |
} | |
#registrationForm button { | |
width: 100%; | |
padding: 15px; /* Увеличенная высота кнопки */ | |
border: none; | |
border-radius: 5px; | |
background-color: #f82; /* Оранжевая кнопка */ | |
color: black; | |
font-weight: bold; | |
cursor: pointer; | |
transition: background-color 0.3s; | |
} | |
#registrationForm button:hover { | |
background-color: #ff9900; /* Светло-оранжевый при наведении */ | |
} | |
@media (max-width: 600px) { | |
#registrationForm { | |
width: 95%; | |
} | |
} | |
</style> | |
</head> | |
<body> | |
<div class="container"> | |
<div id="wheelOfFortune"> | |
<h1>Ирина Дель Соль</h1> | |
<canvas id="wheel" width="300" height="300"></canvas> | |
<div id="spin">Пуск</div> | |
<p>Текст под колесом</p> | |
<a href="#">Ссылка под колесом</a> | |
</div> | |
<!-- Форма ввода данных --> | |
<div id="registrationForm" style="display: none;"> | |
<h1>Ирина Дель Соль</h1> | |
<form id="registration"> | |
<input type="text" id="name" name="name" placeholder="Ваше имя" required><br> | |
<input type="email" id="email" name="email" placeholder="Ваш email" required><br> | |
<input type="tel" id="phone" name="phone" placeholder="Ваш телефон" required><br> | |
<label><input type="checkbox" id="newsletter" name="newsletter"> Согласен на рассылку</label><br> | |
<label><input type="checkbox" id="privacyPolicy" name="privacyPolicy" required> Знаком с политикой конфиденциальности</label><br> | |
<button type="submit">Зарегистрироваться</button> | |
</form> | |
<p>Текст под формой</p> | |
<a href="#">Ссылка под формой</a> | |
</div> | |
</div> | |
<script> | |
const sectors = [ | |
{ color: '#f82', label: 'VIP', probability: 94 }, | |
{ color: '#0bf', label: '10', probability: 1 }, | |
{ color: '#fb0', label: '200', probability: 1 }, | |
{ color: '#0fb', label: '50', probability: 1 }, | |
{ color: '#b0f', label: '100', probability: 1 }, | |
{ color: '#f0b', label: '5', probability: 1 }, | |
{ color: '#bf0', label: '500', probability: 1 } | |
]; | |
const rand = (m, M) => Math.random() * (M - m) + m; | |
const tot = sectors.length; | |
const spinEl = document.querySelector('#spin'); | |
const ctx = document.querySelector('#wheel').getContext('2d'); | |
const dia = ctx.canvas.width; | |
const rad = dia / 2; | |
const PI = Math.PI; | |
const TAU = 2 * PI; | |
const arc = TAU / sectors.length; | |
const friction = 0.991; // 0.995=soft, 0.99=mid, 0.98=hard | |
let angVel = 0; // Angular velocity | |
let ang = 0; // Angle in radians | |
const getIndex = () => Math.floor(tot - (ang / TAU) * tot) % tot; | |
function drawSector(sector, i) { | |
const ang = arc * i; | |
ctx.save(); | |
// COLOR | |
ctx.beginPath(); | |
ctx.fillStyle = sector.color; | |
ctx.moveTo(rad, rad); | |
ctx.arc(rad, rad, rad, ang, ang + arc); | |
ctx.lineTo(rad, rad); | |
ctx.fill(); | |
// TEXT | |
ctx.translate(rad, rad); | |
ctx.rotate(ang + arc / 2); | |
ctx.textAlign = 'right'; | |
ctx.fillStyle = '#fff'; | |
ctx.font = 'bold 21px sans-serif'; // Уменьшенный размер шрифта на 30% | |
ctx.fillText(sector.label, rad - 10, 10); | |
// | |
ctx.restore(); | |
} | |
function rotate() { | |
const sector = sectors[getIndex()]; | |
ctx.canvas.style.transform = `rotate(${ang - PI / 2}rad)`; | |
spinEl.textContent = !angVel ? 'Удача!' : sector.label; | |
spinEl.style.background = sector.color; | |
} | |
function frame() { | |
if (!angVel) return; | |
angVel *= friction; // Decrement velocity by friction | |
if (angVel < 0.002) { | |
angVel = 0; // Bring to stop | |
const sector = sectors[getIndex()]; | |
localStorage.setItem('hasSpun', 'true'); | |
console.log('Result:', sector.label); // Вывод значения в консоль | |
showRegistrationForm(); // Показать форму после остановки колеса | |
} | |
ang += angVel; // Update angle | |
ang %= TAU; // Normalize angle | |
rotate(); | |
} | |
function engine() { | |
frame(); | |
requestAnimationFrame(engine); | |
} | |
function init() { | |
if (!localStorage.getItem('hasSpun')) { | |
localStorage.setItem('hasSpun', 'false'); | |
} | |
sectors.forEach(drawSector); | |
rotate(); // Initial rotation | |
engine(); // Start engine | |
spinEl.addEventListener('click', () => { | |
if (localStorage.getItem('hasSpun') === 'false') { | |
localStorage.setItem('hasSpun', 'true'); | |
angVel = rand(0.25, 0.45); | |
spinWheel(); | |
} else { | |
console.log('You have already spun the wheel.'); | |
} | |
}); | |
} | |
function spinWheel() { | |
const probabilities = sectors.map(sector => sector.probability); | |
const totalProbability = probabilities.reduce((a, b) => a + b, 0); | |
const random = Math.random() * totalProbability; | |
let cumulativeProbability = 0; | |
for (let i = 0; i < sectors.length; i++) { | |
cumulativeProbability += sectors[i].probability; | |
if (random < cumulativeProbability) { | |
ang = (i + 0.5) * arc; | |
break; | |
} | |
} | |
} | |
function showRegistrationForm() { | |
const wheelOfFortune = document.getElementById('wheelOfFortune'); | |
const registrationForm = document.getElementById('registrationForm'); | |
wheelOfFortune.style.display = 'none'; // Скрыть колесо | |
registrationForm.style.display = 'block'; // Показать форму | |
} | |
window.onload = init; | |
</script> | |
</body> | |
</html> |