javascript - CSS/JS 饼图不会超过 180 度

标签 javascript html css

我使用 vanilla css/js 创建了一个饼图。它似乎适用于任何 0-180 度,但当我尝试超过 180 度时,旋转似乎走错了方向。请参阅 js fiddle :

<div class="pieContainer">
  <div class="pieBackground"></div>
  <div id="approvedSlice" class="hold">
    <div id="approvedSlicePie" class="pie"></div>
  </div>
</div>

<script>
  document.getElementById("approvedSlice").style.transform = 'rotate(0deg)';
  document.getElementById("approvedSlicePie").style.transform = 'rotate(305deg)';
</script>

<style>
  .pieContainer {
      display: inline-block;
      position: relative;
      top: 130px;
      padding: 6px;
      height: 40px;
  }
  .pieBackground {
      position: absolute;
      width: 40px;
      height: 40px;
      border-radius: 100%;
      box-shadow: 0px 0px 8px rgba(0,0,0,0.5);
  }
  .pie {
      transition: all 1s;
      position: absolute;
      width: 40px;
      height: 40px;
      border-radius: 100%;
      clip: rect(0px, 20px, 40px, 0px);
  }
  .hold {
      position: absolute;
      width: 40px;
      height: 40px;
      border-radius: 100%;
      clip: rect(0px, 40px, 40px, 20px);
  }
  #approvedSlicePie {
      background-color: #0a0;
  }
</style>

https://jsfiddle.net/myvth518/

最佳答案

我最终为超过 180 度的部分做了 2 个切片:

<div class="pieContainer">
  <div class="pieBackground"></div>
</div>

<style>
    .pieContainer {
          display: inline-block;
          position: relative;
          top: 130px;
          padding: 6px;
          height: 40px;
      }
      .pieBackground {
          position: absolute;
          width: 40px;
          height: 40px;
          border-radius: 100%;
          box-shadow: 0px 0px 8px rgba(0,0,0,0.5);
      }
      .pie {
          transition: all 1s;
          position: absolute;
          width: 40px;
          height: 40px;
          border-radius: 100%;
          clip: rect(0px, 20px, 40px, 0px);
      }
      .hold {
          position: absolute;
          width: 40px;
          height: 40px;
          border-radius: 100%;
          clip: rect(0px, 40px, 40px, 20px);
      }
</style>


<script>
    GeneratePieSlice('#0a0', 'firstSlice', 0, 200);
    GeneratePieSlice('#1d0eff', 'secondSlice', 200, 100);
    GeneratePieSlice('#aa0000', 'thirdSlice', 300, 60);



    function GeneratePieSlice(color, baseName, startPoint, length){

      CreatePieRelatedDivs(color, baseName);

      if (length <= 180) {
        document.getElementById(baseName).style.transform = `rotate(${startPoint}deg)`;
        document.getElementById(baseName + "pie").style.transform = `rotate(${length}deg)`;
        return;
      } else {  
        CreatePieRelatedDivs(color, baseName, true);
        var pie1Start = startPoint;
        var pie1End = 180;

        var pie2Start = pie1Start + 180;
        var pie2End = length - 180;

        document.getElementById(baseName).style.transform = `rotate(${pie1Start}deg)`;
        document.getElementById(baseName + "pie").style.transform = `rotate(${pie1End}deg)`;

        document.getElementById(baseName + "2").style.transform = `rotate(${pie2Start}deg)`;
        document.getElementById(baseName + "pie2").style.transform = `rotate(${pie2End}deg)`;
        return;
      }
    }


    function CreatePieRelatedDivs(color, baseName, helper = false){
      var approvedSliceId = "";
      var pieId = "";

      if (!helper){
        approvedSliceId = baseName;
        pieId = baseName + "pie";
      } else {
        approvedSliceId = baseName + "2";
        pieId = baseName + "pie2";  
      }


      var approvedSlice = document.createElement("div");
      approvedSlice.id = approvedSliceId;
      approvedSlice.className = "hold";

      var pie = document.createElement("div");
      pie.id = pieId;
      pie.className = "pie";  
      pie.style = `background-color: ${color}`;

      $('.pieContainer').append(approvedSlice);
      $(`#${approvedSliceId}`).append(pie);

    }
</script>

https://jsfiddle.net/myvth518/133/

关于javascript - CSS/JS 饼图不会超过 180 度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778364/

相关文章:

javascript - 如何使 html 输入具有在用户键入时保留的静态字符(输入掩码)?

javascript - 将带有 'enter' 键的用户文本附加到 ul(聊天框)jQuery

java - 使用 Html 标签和 servlet 自动完成

javascript - 对齐在同一行

css - 使用 float :left 时背景颜色出现问题

javascript - 如何在 React 中设置和取消设置主体缩放级别

javascript - Jquery - 将数据传递给内联函数

javascript - 如何强制图像显示给定的高度和宽度而不在 HTML DIV 标签中拉伸(stretch)?

html - div里面如何调用css中的class?

javascript - 如何在 Node.js 中从 MongoDB 返回 JSON?