고리형 진도표의 실현 방법 요약과 동적 시계 그리기(CSS3, SVG,Canvas)

38335 단어
이유:
한 게임회사의 필기시험에서 마지막 큰 문제는'CSS3로 동적 디스플레이 시간과 링 진도를 실현하고 [효과는 아래 그림과 같다]. 그리고 각 링의 색깔이 다르기 때문에 IE6~8의 호환성을 고려할 필요가 없다'는 것이다.당시에 첫 번째 생각은 SVG를 사용하는 것이었다. 왜냐하면 SVG는 호선을 그리는 데 전문가이기 때문이다. 그리고 Canvas도 좋은 선택이었다.그러나 SVG와Canvas를 사용할 수 없다고 규정했다. 나는 CSS3의 클립과rotate 속성을 사용할 수 있다고 생각했지만 그때 뇌졸중으로 클립의 문법이 모락모락 기억이 나지 않았다.필기시험이 끝난 후 클립 속성의 사용을 조사하고 고리형 진도조를 실현하는 방법을 총결하여 다음 문장이 나왔다.
그림 1: 동적 시계 스타일
 
하나.CSS3 구현 + JS 판단
원환을 보고 Canvas와 SVG를 사용하지 못하게 되면 그림이나border-radius를 생각할 것이다.안타깝게도border 속성은 백분율 경계선을 실현할 수 없습니다.비교적 흔히 볼 수 있는 방법은 진도를 표시하는 원환을 반으로 나누고 회전 반원환과 마스크 효과를 통해 진도 효과를 백분율로 실현하는 것이다.
내가 이룬 사고방식:
1 . 진도를 표시하는 원환을 시각적으로 좌우로 나눈다(CSS3의 클립 속성이나border-color:transparent로).그리고 진도색을 표시하지 않는 반원환으로 진도색을 표시하는 왼쪽 반원환을 가린다.
2 . 0~50% 단계에서 먼저 진도를 표시하는 오른쪽 고리를 숨긴다(display:none 또는opacity:0).왼쪽 원환은 먼저 진도색을 표시하지 않는 반원환 덮개로 되어 있고 왼쪽 원환이 시계 바늘을 따라 회전할 때 시각적으로 진도색의 개수 변화를 나타낼 수 있다.
3 . 50%~100% 단계에서 왼쪽 원환은 회전을 멈추고 오른쪽 원환은 회전을 시작한다. 이렇게 하면 일관된 원환 회전 효과를 실현할 수 있다.또한 왼쪽 고리 위에 있던 커버층은 숨겨야 하며, 그렇지 않으면 오른쪽 고리의 회전 효과를 가려야 한다.
먼저 다음과 같은 HTML 코드로 루프 효과를 구현합니다.
  <div class="circle"> <div class="track"></div> <div class="left transition-rotate"></div> <div class="right transition-rotate"></div> <div class="mask"></div> <span id="hour">0</span><span class="percent">%</span> </div>
  • <input id="range" type="range" min="0" max="100" step="1" value="0">
  • CSS :

     
    1. /* */
    2. .circle { position: relative; width: 130px; height: 130px; text-align: center; } .circle .track, .circle .mask, .circle .left, .circle .right { width: 130px; height: 130px; position: absolute; top: 0; left: 0; border-radius: 50%; border: 20px #e7e7e7 solid; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .circle .mask, .circle .left, .circle .right { clip: rect(0 65px 130px 0); } .circle .left, .circle .right { border-color: #6FEC6F; } .circle .right { opacity: 0; -webkit-transform: rotate(180deg); -moz-transform: rotate(180deg); -ms-transform: rotate(180deg); -o-transform: rotate(180deg); transform: rotate(180deg); } /* */ .circle #hour { color: #666; font-size: 48px; line-height: 130px; } .circle .percent { font-size: 20px; color: #999; margin-left: 5px; } .transition-rotate { -webkit-transition: transform .1s ease-in-out; -moz-transition: transform .1s ease-in-out; -ms-transition: transform .1s ease-in-out; -o-transition: transform .1s ease-in-out; transition: transform .1s ease-in-out; }
      JavaScript 코드:
        var circle = document.querySelectorAll(".circle")[0]; var mask = document.querySelectorAll(".mask")[0]; var left = document.querySelectorAll(".left")[0]; var right = document.querySelectorAll(".right")[0]; var range = document.getElementById("range");
    3. var hour = document.querySelectorAll("#hour")[0];
    4. var n;
    5. changeHour(); range.oninput = changeHour; function changeHour() { hour.innerHTML = range.value; n = range.value; if(n <= 50) { left.style.webkitTransform="rotate(" + 3.6 * n + "deg)"; right.style.opacity = 0; mask.style.opacity = 1; }else { right.style.opacity = 1; mask.style.opacity = 0; left.style.webkitTransform="rotate(" + 180 + "deg)"; right.style.webkitTransform="rotate(" + 3.6 * n + "deg)"; } }

      ~

       

      . SVG

      SVG stroke-dasharray stroke-dashoffset , 。

      stroke-dasharray , stroke-dashoffset , 。

      : 
      HTML :

       
      1. <svg id="circleProcess" xmlns="http://www.w3.org/2000/svg">
      2. <circle id="circle" cx="50%" cy="50%" r="40%" stroke-width="10%"></circle> </svg> <input id="range" type="range" min="0" max="255" step="1" value="0">
        CSS 코드:
          #circleProcess { position: relative; top: 0; left: 0; width: 200px; height: 200px; stroke-dasharray: 255%; stroke-dashoffset: 255%; stroke: #6FEC6F; fill: none; -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -ms-transform: rotate(-90deg); -o-transform: rotate(-90deg); transform: rotate(-90deg); }
        JavaScript 코드:
          var circleProcess = document.getElementById("circleProcess"); var circle = document.getElementById("circle"); var range = document.getElementById("range"); // var rangeValue;
      3. range.oninput = function() {
      4. rangeValue = Number(range.value); circle.setAttribute("stroke-dashoffset", (255 - rangeValue) + "%"); }

        ~

         

        . HTML5 Canvas

        HTML5 Canvas 。 Canvas , arc(x1, y1, r, beginAngle, endAngle, boolean) 。

        HTML :

         
        1. <canvas id="circle" width="130" height="130"></canvas>
        2. <input id="range" type="range" min="0" max="360" step="1" value="0">
          JavaScript 코드:
            var range = document.getElementById("range"); var rangeValue; //
        3. var circle = document.getElementById("circle");
        4. var circleWidth = circle.width; var circleHeight = circle.height; var circleContext = circle.getContext("2d");
        5. var circleValue = {
        6. x: 65, y: 65, r: 45, beginAngle: - Math.PI / 2, endAngle: 0 };
        7. //
        8. circleContext.lineWidth = 20; circleContext.strokeStyle = "#6FEC6F";
        9. //
        10. function drawCircle() { circleContext.restore(); // circleContext.clearRect(0,0, circleWidth, circleHeight); // range Math.PI rangeValue = Number(range.value); // circleValue.endAngle = circleValue.beginAngle + (rangeValue / 360) * 2 * Math.PI; circleContext.beginPath(); // circleContext.arc(circleValue.x, circleValue.y, circleValue.r, circleValue.beginAngle, circleValue.endAngle, false); circleContext.stroke(); circleContext.save(); } // range.oninput = drawCircle; drawCircle();

          ~

           

          . sprite

          sprite , background position 。 , , , , , 。

          , ~( ~( ╯□╰ )~)

           

          (CSS3、SVG、Canvas)

          , , 。 :

          “ CSS3 , 。 IE6~8 。” 1 。

          CSS3、SVG、Canvas 。

           

          1. CSS3

          ~

           

          2. SVG

          ~

           

          3. HTML5 canvas

          ~

           

          1 .  (CSS3、SVG、canvas)+JS ~

          2 .  (CSS3、SVG、canvas)+JS ~

    좋은 웹페이지 즐겨찾기