2

n我正在尝试通过单击键盘的左右箭头来创建带有可导航元素的循环导航。我使用具有特定 CSS3rotatetranslate值的类以及一些 javascript 来更改这些类。

我的问题是具有类的元素之间的转换fourand five,在 and 之间进行转换360deg的转换30deg与我想要的方向相反。您可以在这个 jsFiddle中看到明显不需要的行为

.one    { transform: rotate(270deg) translate(200px); }
.two    { transform: rotate(300deg) translate(200px); }
.three  { transform: rotate(330deg) translate(200px); }
.four   { transform: rotate(360deg) translate(200px); }<-- Problematic transition
.five   { transform: rotate(30deg)  translate(200px); }<-- Problematic transition
.six    { transform: rotate(60deg)  translate(200px); }
.seven  { transform: rotate(90deg)  translate(200px); }
.eight  { transform: rotate(120deg) translate(200px); }
.nine   { transform: rotate(150deg) translate(200px); }
.ten    { transform: rotate(180deg) translate(200px); }
.eleven { transform: rotate(210deg) translate(200px); }
.twelve { transform: rotate(240deg) translate(200px); }

我更愿意为此使用 CSS 修复程序,但我也尝试了一个可以在此处找到的 javascript 修复程序。在这个例子中,我只尝试使用左箭头。我使用 javascript 的方法是获取字符串形式的当前翻译值,rotate从中去除度数,然后根据是否按下右箭头或左箭头来添加或减去 30 度。这种方法目前的问题是它没有给我一个值element.style.webkitTransform(我正在使用 Chrome),它只是出于某种原因是空的。此外,我不希望必须在 javascript 中为所有内容添加前缀,这就是我想要仅修复 CSS 的原因

我对javascript的尝试(未经测试,因为第一行由于某种原因不起作用):

var thisTransform = circleArray[i].style.webkitTransform;
if (thisTransform.indexOf("rotate(") >= 0) {
    var newDeg = parseInt(thisTransform.split("rotate(")[1].substring(thisTransform.indexOf("deg"))) - 30;
    circleArray[i].style.webkitTransform = "rotate(" + newDeg + "deg) translate(200px) !important;";
}

旁注:我在我的项目中使用 prefixfree.min.js 来防止表单必须手动输入所有浏览器前缀

是否有针对我不知道的问题的仅 CSS 解决方案?尝试translate使用javascript获取值时导致错误的原因是什么?

4

1 回答 1

3

首先,让我说我认为最好的解决方案可能是旋转基圆;我几乎可以肯定结果会更好,更容易。

但这只是一个附带的想法,让我们来解决您发布的问题。

我已经解决了您的问题,创建了一个可以正确移动有问题的类的类。我的想法是提供一个可以进行运动的动画:

.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);}
}

这个想法是通过动画完成从 30 度到 360 度的运动,可以将其从 30 度更改为 0 度。

我为五年级提供了另一个类似的课程。

剩下的问题是脚本必须根据旋转方向将元素设置为四类或四类,五类和五类也是如此。

这导致了那个(有点混乱)脚本:

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 去你想要的地方,不旋转。

一旦决定走这条路,脚本就必须修改内圈的样式,而不是基圈的样式。为了轻松做到这一点,我在每个元素中存储了该特定元素的角度(在数据属性中)。

全新演示

生成的 HTML 类似:

<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;
    }
}
于 2013-08-31T17:42:39.080 回答