고리형 진도표의 실현 방법 요약과 동적 시계 그리기(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에 따라 라이센스가 부여됩니다.