우선 가장 좋은 해결책은 기본 원형을 회전시키는 것입니다. 나는 결과가 더 좋고 쉬울 것이라고 거의 확신한다.
하지만 이것은 옆에있는 생각 일 뿐이며 게시하는 문제로 가보겠습니다.
문제가있는 클래스를 올바르게 옮길 수있는 클래스를 만드는 작업에 대한 작업을 수행했습니다.
.foura { -webkit-transform: rotate(360deg) translate(200px);
-webkit-animation: aclock .3s linear 1;
transform: rotate(360deg) translate(200px);
animation: aclock .3s linear 1;
transition: none;
}
@keyframes aclock {
0% {transform: rotate(30deg) translate(200px);}
100% {transform: rotate(0deg) translate(200px);}
}
아이디어는 애니메이션을 통해 수행되고 360 ℃, 30 ℃,,의 움직임이 30 ° 이상 갈 변경 될 수 있는지
0 ℃로 : 내 생각은 이동 확인을하지 애니메이션을 제공하는 것입니다 .
클래스 5에 대해 비슷한 클래스를 제공합니다.
나머지 문제는 스크립트가 회전 감각에 따라 클래스 4 또는 foura로 요소를 설정하고 5 및 5a에도 동일하게 설정해야한다는 것입니다.
이 (다소 지저분) 스크립트에이 리드
:
document.onkeydown = function (e) {
e = e || window.event;
switch(e.which || e.keyCode) {
case 37:
for (var i = 0, j = circleArray.length; i < j; i++) {
var curClassList = circleArray[i].classList,
curClass = curClassList.toString().split(' ')[1];
baseClass = curClass;
if (baseClass == "fivea") {
baseClass = "five";
}
if (baseClass == "foura") {
baseClass = "four";
}
if(circleClassArray.indexOf(baseClass) - 1 >= 0)
{
var newClass = circleClassArray[circleClassArray.indexOf(baseClass) - 1];
if (newClass == "four") {
newClass = "foura";
}
curClassList.add(newClass)
curClassList.remove(curClass);
} else {
curClassList.add(circleClassArray[j - 1]);
curClassList.remove(curClass);
}
}
break;
case 39:
for (var i = 0, j = circleArray.length; i < j; i++) {
var curClassList = circleArray[i].classList,
curClass = curClassList.toString().split(' ')[1];
baseClass = curClass;
if (baseClass == "fivea") {
baseClass = "five";
}
if (baseClass == "foura") {
baseClass = "four";
}
if(circleClassArray.indexOf(baseClass) + 1 < j)
{
var newClass = circleClassArray[circleClassArray.indexOf(baseClass) + 1];
if (newClass == "five") {
newClass = "fivea";
}
curClassList.add(newClass)
curClassList.remove(curClass);
} else {
curClassList.add(circleClassArray[0]);
curClassList.remove(curClass);
}
}
break;
}
}
그리고이 전체 CSS입니다 :
.circle-big {
position: relative;
height:500px;
width:500px;
background:red;
border-radius: 50% 50%;
margin: 10% 10%;
border:5px solid black;
}
.circle-inner {
border-radius: 50%;
width: 300px;
height: 300px;
border: 5px solid white;
background-color: black;
display: block;
position: absolute;
overflow: hidden;
top: 50%;
left: 50%;
margin-top:-155px;
margin-left:-155px;
}
.circle {
border-radius: 50%;
width: 70px;
height: 70px;
background-color: white;
display: block;
position: absolute;
overflow: hidden;
top: 50%;
left: 50%;
margin-top:-35px;
margin-left:-35px;
transition: all .3s linear;
}
.one { -webkit-transform: rotate(270deg) translate(200px);
transform: rotate(270deg) translate(200px);
background:blue; }
.two { -webkit-transform: rotate(300deg) translate(200px);
transform: rotate(300deg) translate(200px); }
.three { -webkit-transform: rotate(330deg) translate(200px);
transform: rotate(330deg) translate(200px);
}
.four { -webkit-transform: rotate(360deg) translate(200px);
transform: rotate(360deg) translate(200px);}
.foura { -webkit-transform: rotate(360deg) translate(200px);
-webkit-animation: aclock .3s linear 1;
transform: rotate(360deg) translate(200px);
animation: aclock .3s linear 1;
transition: none;
}
.five { -webkit-transform: rotate(30deg) translate(200px);
transform: rotate(30deg) translate(200px);}
.fivea { -webkit-transform: rotate(30deg) translate(200px);
-webkit-animation: clock .3s linear 1;
transform: rotate(30deg) translate(200px);
animation: clock .3s linear 1;
transition: none;
}
.six { -webkit-transform: rotate(60deg) translate(200px);
transform: rotate(60deg) translate(200px);}
.seven { -webkit-transform: rotate(90deg) translate(200px);
transform: rotate(90deg) translate(200px);}
.eight { -webkit-transform: rotate(120deg) translate(200px);
transform: rotate(120deg) translate(200px);}
.nine { -webkit-transform: rotate(150deg) translate(200px);
transform: rotate(150deg) translate(200px); }
.ten { -webkit-transform: rotate(180deg) translate(200px);
transform: rotate(180deg) translate(200px);}
.eleven { -webkit-transform: rotate(210deg) translate(200px);
transform: rotate(210deg) translate(200px);}
.twelve { -webkit-transform: rotate(240deg) translate(200px);
transform: rotate(240deg) translate(200px);}
@-webkit-keyframes clock {
0% {-webkit-transform: rotate(0deg) translate(200px);}
100% {-webkit-transform: rotate(30deg) translate(200px);}
}
@-webkit-keyframes aclock {
0% {-webkit-transform: rotate(30deg) translate(200px);}
100% {-webkit-transform: rotate(0deg) translate(200px);}
}
@keyframes clock {
0% {transform: rotate(0deg) translate(200px);}
100% {transform: rotate(30deg) translate(200px);}
}
@keyframes aclock {
0% {transform: rotate(30deg) translate(200px);}
100% {transform: rotate(0deg) translate(200px);}
}
내 첫번째 생각에 따라, 내가 추가 한 다음 스크립트 코드 :
case 38:
angle = angle + 30;
var circleBig = document.getElementsByClassName("circle-big")[0];
var style = "rotate(" + angle + "deg)";
circleBig.style.webkitTransform = style;
break;
case 40:
angle = angle - 30;
var circleBig = document.getElementsByClassName("circle-big")[0];
var style = "rotate(" + angle + "deg)";
circleBig.style.webkitTransform = style;
break;
그리고 큰 원으로의 전환도 추가되었습니다. 지금은이 작품을 좋아 생각 (위쪽 및 아래쪽 화살표 아래에!) 나는 바이올린의 대부분을 재 설계 한 (수직 내부 원을 유지하는) 새로운 요구 사항에 대한
브랜드의 새로운 버전
. 레아 베루 (Lea Verou)에서 보았던 아이디어를 익숙한 div없이 회전시키기 위해 적용했습니다. 이것은 변환을 각도 + 이동 + 각도로 설정하는 것으로 구성됩니다. 그건 div가 당신이 원하는 곳으로 가고, 회전하지 않습니다.
일단 이런 식으로 결정되면 스크립트는 기본 원의 스타일이 아닌 내부 원의 스타일을 수정해야합니다. 이를 쉽게하기 위해 모든 요소에 특정 요소의 각을 저장했습니다 (데이터 속성에서).
<div class="circle-big">
<div class="circle one" data-angle=270>1</div>
<div class="circle two" data-angle=300>2</div>
<div class="circle three" data-angle=330>3</div>
<div class="circle four" data-angle=0>4</div>
<div class="circle five" data-angle=30>5</div>
<div class="circle six" data-angle=60>6</div>
<div class="circle seven" data-angle=90>7</div>
<div class="circle eight" data-angle=120>8</div>
<div class="circle nine" data-angle=150>9</div>
<div class="circle ten" data-angle=180>10</div>
<div class="circle eleven" data-angle=210>11</div>
<div class="circle twelve" data-angle=240>12</div>
<div class="circle-inner"></div>
</div>
하고 스크립트가
var circleArray = document.getElementsByClassName("circle");
var angle = 0;
window.onload = chargearray;
function chargearray() {
for (var i = 0, j = circleArray.length; i < j; i++) {
var circle = circleArray[i];
var circleAngle = parseInt (circle.dataset.angle);
var totalAngle = angle + circleAngle
var style = "rotate(" + totalAngle + "deg) translate(200px)";
totalAngle = - totalAngle;
style = style + " rotate(" + totalAngle + "deg)"
circle.style.webkitTransform = style;
circle.style.Transform = style;
}
}
document.onkeydown = function (e) {
e = e || window.event;
switch(e.which || e.keyCode) {
case 37:
angle = angle + 30;
chargearray();
break;
case 39:
angle = angle - 30;
chargearray();
break;
}
}
훌륭한 솔루션, +1 :
Brand New demo
결과 HTML은 비슷한입니다! 버튼을 클릭하면 전환이 완료 될 때까지 완벽하게 작동합니다. 즉, 전환이 완료되기 전에 화살표를 클릭하면 피하려고하는 또 다른 동작이 있습니다. 해당 전환 기간 동안 화살표가 클릭되는 것을 제한하는 것 외에 어떤 도움이 필요합니까? 다른 원형을 첨부하여 기본 원을 회전 시키려고하지만 요소를 배치하고 부모에게 현재 설정되어있는 위치에 바인딩하는 방법을 잘 모르겠습니다. 그 아이디어에 도움이 되었습니까? –
위의 설명에서 언급 한 급격한 변화가 CSS 애니메이션에서 벗어나려고 노력한 이유입니다. –
정말, 신경질적인 사용자가 야기한 불안감을 해결하는 방법을 모르겠습니다. 나는 기본 원을 회전시키는 나의 첫 번째 아이디어에 기초하여 또 다른 해결책을 추가했다. 지금 내가 웹킷 번역 만 포함했음을 알았습니다. 죄송합니다! – vals