---
# System prepended metadata

title: html-筆記範本
tags: [html, js, css]

---

# html-幸運轉盤

連結: [GitHub](https://github.com/yunnnzeng/spin-the-wheel)、[GitHub Pages](https://yunnnzeng.github.io/spin-the-wheel/)

來由
---
繼刮刮樂覺得可以嘗試其他小活動，所以做了幸運輪盤，網路上有很多種的輪盤，這是陽春版。


## 程式碼
### 使用語法
* HTML、CSS、JS

### HTML
主要架構為轉盤與指針
```
<div class="container">
    <div class="turntable">
        <div class="pointer"></div>
        <div class="wheel">
            <div class="segment segment1">Section 1</div>
            <div class="segment segment2">Section 2</div>
            <div class="segment segment3">Section 3</div>
            <div class="segment segment4">Section 4</div>
        </div>
    </div>
    <button class="spin-button" onclick="spinWheel()">Spin</button>
</div>
```
### CSS
```
.container {
    text-align: center;
    margin-top: 50px;
}

.turntable {
    margin: 20px auto;
    position: relative;
}

.wheel {
    width: 300px;
    height: 300px;
    border-radius: 50%;
    position: relative;
    margin: 0 auto;
    overflow: hidden;
    /* 使用 overflow: hidden 來隱藏超出邊界的部分 */
    border: 2px solid black;
}

.segment {
    position: absolute;
    width: 100%;
    height: 100%;
    clip-path: polygon(50% 50%, 0 0, 100% 0);
    border-radius: 50%;
    /* 確保每個部分都是圓形 */
}

.segment1 {
    background-color: #726da8;
    transform: rotate(0deg);
}

.segment2 {
    background-color: #7d8cc4;
    transform: rotate(90deg);
}

.segment3 {
    background-color: #a0d2db;
    transform: rotate(180deg);
}

.segment4 {
    background-color: #bee7e8;
    transform: rotate(270deg);
}

.pointer {
    position: absolute;
    top: -15px;
    left: 50%;
    transform: translateX(-50%);
    border-right: 15px solid transparent;
    border-left: 15px solid transparent;
    border-top: 25px solid #E39EC1;
    z-index: 10;
    /* 確保指針在上面 */
}

.spin-button {
    margin-top: 20px;
}
```
### JS
隨機生成要旋轉的角度，指針在上所以使用`actualDeg`，如指針在其他角度可使用`pointerDeg`
```
let spinning = false;

function spinWheel() {
  if (!spinning) {
    spinning = true;
    var wheel = document.querySelector('.wheel');
    var spinButton = document.querySelector('.spin-button');
    // Math.random() 0~1之間
    var deg = Math.floor(1080 + Math.random() * 360*14); // 旋轉的角度，可自行調整

    spinButton.style.pointerEvents = 'none'; // 防止連續點擊

    wheel.style.transition = 'all 1s ease-out'; // 控制旋轉的速度和效果
    wheel.style.transform = `rotate(${deg}deg)`;

    setTimeout(function () {
      spinning = false;
      spinButton.style.pointerEvents = 'auto';
      const actualDeg = deg % 360;
      let pointerDeg = 360 - actualDeg + 90; // 計算指針所在的角度
      if (pointerDeg >= 360) {
        pointerDeg -= 360;
      }
      showResult(actualDeg); // 顯示結果
    }, 1000);

  }
}
```
顯示結果
```
function showResult(deg) {
  // 這裡可以根據旋轉角度(deg)來顯示相應的結果
  // 例如，可以根據角度範圍判斷落在哪個部分，並顯示相應的內容
  let result = '';
  if (deg < 45) {
    result = 'Section 1';
  } else if (deg >= 45 && deg < 135) {
    result = 'Section 4';
  } else if (deg >= 135 && deg < 225) {
    result = 'Section 3';
  } else if (deg >= 225 && deg < 315) {
    result = 'Section 2';
  } else {
    result = 'Section 1';
  }
  alert('Congratulations! You got: ' + result);
}
```


完整程式碼: [GitHub](https://github.com/yunnnzeng/spin-the-wheel)

後續
---
1. 程式優化，讓每個選項百分比不同，但只需要在某處設定，不需要每個地方都修改，例如網頁呈現與最後顯示，目前就是兩處都需要修改
2. 點輪盤中間就可轉動，不一定需要按按鈕
3. 增加互動，使用者自行輸入轉盤選項與機率

###### tags: `html` `css` `js`
