고리형 진도표의 실현 방법 요약과 동적 시계 그리기(CSS3, SVG,Canvas)
한 게임회사의 필기시험에서 마지막 큰 문제는'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 :
/* */ .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");
var hour = document.querySelectorAll("#hour")[0];
var n; 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 :
<svg id="circleProcess" xmlns="http://www.w3.org/2000/svg"> <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;
range.oninput = function() { rangeValue = Number(range.value); circle.setAttribute("stroke-dashoffset", (255 - rangeValue) + "%"); }
:
~
. HTML5 Canvas
HTML5 Canvas 。 Canvas , arc(x1, y1, r, beginAngle, endAngle, boolean) 。
HTML :
<canvas id="circle" width="130" height="130"></canvas> <input id="range" type="range" min="0" max="360" step="1" value="0">
JavaScript 코드:
var range = document.getElementById("range"); var rangeValue; //
var circle = document.getElementById("circle"); var circleWidth = circle.width; var circleHeight = circle.height; var circleContext = circle.getContext("2d");
var circleValue = { x: 65, y: 65, r: 45, beginAngle: - Math.PI / 2, endAngle: 0 };
// circleContext.lineWidth = 20; circleContext.strokeStyle = "#6FEC6F";
// 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 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.