白木耳 2021-11-13 06:43 采纳率: 63.6%
浏览 52
已结题

[CSS] 圓形怎麼依單及偶數做分割顏色

這是 code demohttps://codepen.io/mirari/pen/XLgBQP
我要如何讓他依單偶數做分割顏色

(index % 2 == 0) ? {'background-color': #FFD2D2'} : {'background-color': '#FFF0AC'}

img

html {
  background: #dd7c7d;
}

.wheel-wrapper {
  width: 300px;
  height: 300px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.wheel-pointer {
  width: 60px;
  height: 60px;
  border-radius: 1000px;
  background: yellow;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  text-align: center;
  line-height: 60px;
  z-index: 10;
  cursor: pointer;

  &::after {
    content: "";
    position: absolute;
    top: -32px;
    left: 50%;
    border-width: 0 8px 40px;
    border-style: solid;
    border-color: transparent transparent yellow;
    transform: translateX(-50%);
  }
}
.wheel-bg {
  width: 100%;
  height: 100%;
  border-radius: 1000px;
  overflow: hidden;
  transition: transform 4s ease-in-out;
  background: #7eef97;

  &.freeze {
    transition: none;
    background: red;
  }
}

.prize-list {
  width: 100%;
  height: 100%;
  position: relative;
  text-align: center;
}

.prize-item-wrapper {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 150px;
  height: 150px;
}

.prize-item {
  width: 100%;
  height: 100%;
  transform-origin: bottom;

  .prize-name {
    padding: 16px 0;
  }

  .prize-icon {
  }
}


<script src="//unpkg.com/vue/dist/vue.js"></script>
<span id="app">
  <span>Prize number: {{ prizeNumber }}</span>
  <button type="button" @click="!rolling && prizeNumber < 8 && (prizeNumber++)" :disabled="rolling || prizeNumber === 8">Add</button>
  <button type="button" @click="!rolling && prizeNumber > 2 && (prizeNumber--)" :disabled="rolling || prizeNumber === 2">Remove</button>
   <div class="wheel-wrapper">
    <div
      class="wheel-pointer"
      @click="onClickRotate"
    >
      Start
    </div>
    <div
      class="wheel-bg"
      :class="{freeze: freeze}"
      :style="`transform: rotate(${wheelDeg}deg)`"
    >
      <div class="prize-list">
        <div
          class="prize-item-wrapper"
          v-for="(item,index) in prizeList"
          :key="index"
        >
          <div
            class="prize-item"
            :style="`transform: rotate(${(360/ prizeList.length) * index}deg)`"
          >
            <div class="prize-name">
              {{ item.name }}
            </div>
            <div class="prize-icon">
              <img :src="item.icon">
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>


  • 写回答

1条回答 默认 最新

  • CSDN专家-showbo 2021-11-13 14:01
    关注

    直接加背景加不上,因为是通过旋转实现的,加上直接显示正方形的背景,得不到扇形这种效果。需要在wheel-bg下放一个absolute定位的canvas做背景,然后在canvas绘制扇形。
    代码如下

    img

    <style>
        html {
            background: #dd7c7d;
        }
    
        .wheel-wrapper {
            width: 300px;
            height: 300px;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
        }
    
        .wheel-pointer {
            width: 60px;
            height: 60px;
            border-radius: 1000px;
            background: yellow;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
            text-align: center;
            line-height: 60px;
            z-index: 10;
            cursor: pointer;
        }
    
        .wheel-pointer::after {
            content: "";
            position: absolute;
            top: -32px;
            left: 50%;
            border-width: 0 8px 40px;
            border-style: solid;
            border-color: transparent transparent yellow;
            transform: translateX(-50%);
        }
    
        .wheel-bg {
            width: 100%;
            height: 100%;
            border-radius: 1000px;
            overflow: hidden;
            transition: transform 4s ease-in-out;
            background: #7eef97;
        }
    
        .wheel-bg.freeze {
            transition: none;
            background: red;
        }
    
        .prize-list {
            width: 100%;
            height: 100%;
            position: relative;
            text-align: center;
        }
    
        .prize-item-wrapper {
            position: absolute;
            top: 0;
            left: 50%;
            transform: translateX(-50%);
            width: 150px;
            height: 150px;
        }
    
        .prize-item {
            width: 100%;
            height: 100%;
            transform-origin: bottom;
        }
    
        .prize-item .prize-name {
            padding: 16px 0;
        }
    </style>
    <div id="app">
        <span>Prize number: {{ prizeNumber }}</span>
        <button type="button" @click="!rolling && prizeNumber < 8 && (prizeNumber++);drawBg()" :disabled="rolling || prizeNumber === 8">Add</button>
        <button type="button" @click="!rolling && prizeNumber > 2 && (prizeNumber--);drawBg()" :disabled="rolling || prizeNumber === 2">Remove</button>
        <div class="wheel-wrapper">
            <div class="wheel-pointer"
                 @click="onClickRotate">
                Start
            </div>
            <div class="wheel-bg"
                 :class="{freeze: freeze}"
                 :style="`transform: rotate(${wheelDeg}deg)`">
                <canvas id="bg" width="300" height="300" style="position:absolute;left:0;top:0;width:100%;height:100%"></canvas>
                <div class="prize-list">
                    <div class="prize-item-wrapper"
                         v-for="(item,index) in prizeList"
                         :key="index">
                        <div class="prize-item"
                             :style="`transform: rotate(${(360/ prizeList.length) * index}deg)`">
                            <div class="prize-name">
                                {{ item.name }}
                            </div>
                            <div class="prize-icon">
                                <img :src="item.icon">
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script>
        var Main = {
            data() {
                return {
                    freeze: false,
                    rolling: false,
                    wheelDeg: 0,
                    prizeNumber: 8,
                    prizeListOrigin: [
                        {
                            icon: "https://picsum.photos/40?random=1",
                            name: "$10000"
                        },
                        {
                            icon: "https://picsum.photos/40?random=6",
                            name: "Thank you!"
                        },
                        {
                            icon: "https://picsum.photos/40?random=2",
                            name: "$500"
                        },
                        {
                            icon: "https://picsum.photos/40?random=3",
                            name: "$100"
                        },
                        {
                            icon: "https://picsum.photos/40?random=6",
                            name: "Thank you!"
                        },
                        {
                            icon: "https://picsum.photos/40?random=4",
                            name: "$50"
                        },
                        {
                            icon: "https://picsum.photos/40?random=5",
                            name: "$10"
                        },
                        {
                            icon: "https://picsum.photos/40?random=6",
                            name: "Thank you!"
                        }
                    ]
                };
            },
            mounted() {
                this.ctx = document.querySelector('#bg').getContext('2d');
                this.drawBg();
            },
            computed: {
                prizeList() {
                    return this.prizeListOrigin.slice(0, this.prizeNumber);
                }
            },
            methods: {
                drawBg() {
                    var ctx = this.ctx;
                    var r = 150;
                    var angle = Math.PI * 2 / this.prizeNumber;
                    var startAngle = - angle / 2;
                    var fixed12Clock = Math.PI / 2;//arc 0角度为3点钟方向,需要修正成12点方向
                    for (var i = 0; i < this.prizeNumber; i++) {
                        ctx.beginPath();
                        ctx.moveTo(r, r);
                        ctx.fillStyle = i % 2 ? '#FFD2D2' : '#FFF0AC';
                        ctx.arc(r, r, r, i * angle + startAngle - fixed12Clock, (i + 1) * angle + startAngle - fixed12Clock);
                        ctx.fill();
                    }
                },
                onClickRotate() {
                    if (this.rolling) {
                        return;
                    }
                    const result = Math.floor(Math.random() * this.prizeList.length);
                    this.roll(result);
                },
                roll(result) {
                    this.rolling = true;
                    const { wheelDeg, prizeList } = this;
                    this.wheelDeg =
                        wheelDeg -
                        wheelDeg % 360 +
                        6 * 360 +
                        (360 - 360 / prizeList.length * result);
                    setTimeout(() => {
                        this.rolling = false;
                        alert("Result:" + prizeList[result].name);
                    }, 4500);
                }
            },
            watch: {
                prizeNumber() {
                    this.freeze = true;
                    this.wheelDeg = 0;
    
                    setTimeout(() => {
                        this.freeze = false;
                    }, 0);
                }
            }
        };
        var App = Vue.extend(Main);
        new App().$mount("#app");
    
    </script>
    
    
    

    有帮助麻烦点下【采纳该答案】

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 已采纳回答 11月13日
  • 创建了问题 11月13日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号