【问题标题】:Transform origin so animation don't jump变换原点,使动画不会跳跃
【发布时间】:2014-10-04 22:50:51
【问题描述】:

我创建了一个动画微调器,它是使用由背景渐变制成的“披萨片”构建的。问题是我无法弄清楚起源应该是什么。动画一直在跳跃。

看小提琴: http://jsfiddle.net/eqc05bkf/

我怎样才能摆脱跳跃?

HTML:

<div class="slices bar">
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
</div>

CSS:

.slices {
    width:100px;
    height:100px;
    position:relative;
    transform-origin: right bottom;
    -webkit-animation: spin 2.8s infinite steps(8);
    -moz-animation: spin 2.8s infinite steps(8);
    -ms-animation: spin 2.8s infinite steps(8);
    -o-animation: spin 2.8s infinite steps(8);
    animation: spin 2.8s infinite steps(8);
}
.slices.bar div {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 35px;
    left: 45px;
    border-radius: 50%;
    background: linear-gradient(45deg, #CDCDCD 50%, transparent 50%) 0 0;
    background-repeat: no-repeat;
    background-size: 50% 50%;
    transform-origin: 56px 52px;
    /* container height / 2 */
}
@-webkit-keyframes spin {
    to {
        transform: rotate(1turn);
    }
}
@-moz-keyframes spin {
    to {
        transform: rotate(1turn);
    }
}
@-ms-keyframes spin {
    to {
        transform: rotate(1turn);
    }
}
@keyframes spin {
    to {
        transform: rotate(1turn);
    }
}
.slices.bar div:nth-child(1) {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
    background: linear-gradient(45deg, red 50%, transparent 50%) 0 0;
    background-repeat: no-repeat;
    background-size: 50% 50%;
}
.slices.bar div:nth-child(2) {
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
}
.slices.bar div:nth-child(3) {
    -webkit-transform: rotate(90deg);
    transform: rotate(90deg);
}
.slices.bar div:nth-child(4) {
    -webkit-transform: rotate(135deg);
    transform: rotate(135deg);
}
.slices.bar div:nth-child(5) {
    -webkit-transform: rotate(180deg);
    transform: rotate(180deg);
}
.slices.bar div:nth-child(6) {
    -webkit-transform: rotate(225deg);
    transform: rotate(225deg);
}
.slices.bar div:nth-child(7) {
    -webkit-transform: rotate(270deg);
    transform: rotate(270deg);
}
.slices.bar div:nth-child(8) {
    -webkit-transform: rotate(315deg);
    transform: rotate(315deg);
}

【问题讨论】:

    标签: css animation css-transforms


    【解决方案1】:

    我稍微修改了您的代码。首先,我添加了一个容器 div 并简单地旋转了它。 fiddle

    HTML:

    <div id='hold'>
        <div class="slices bar">
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
        </div>
    </div>
    

    CSS:

    .slices {
        width:100px;
        height:100px;
        position:relative;
        margin-top: -31px;
        margin-left: -45px;
        transform-origin: right bottom;
        /*-webkit-animation: spin 2.8s infinite steps(8);
        -moz-animation: spin 2.8s infinite steps(8);
        -ms-animation: spin 2.8s infinite steps(8);
        -o-animation: spin 2.8s infinite steps(8);
        animation: spin 2.8s infinite steps(8);*/
    }
    #hold {
        width: 112px;
        height: 112px;
        border-radius: 50%;
        overflow: hidden;
        -webkit-animation: spin 2.8s infinite steps(8);
        -moz-animation: spin 2.8s infinite steps(8);
        -ms-animation: spin 2.8s infinite steps(8);
        -o-animation: spin 2.8s infinite steps(8);
        animation: spin 2.8s infinite steps(8);
    }
    .slices.bar div {
        width: 100%;
        height: 100%;
        position: absolute;
        top: 35px;
        left: 45px;
        border-radius: 50%;
        background: linear-gradient(45deg, #CDCDCD 50%, transparent 50%) 0 0;
        background-repeat: no-repeat;
        background-size: 50% 50%;
        transform-origin: 56px 52px;
        /* container height / 2 */
    }
    @-webkit-keyframes spin {
        to {
            transform: rotate(1turn);
        }
    }
    @-moz-keyframes spin {
        to {
            transform: rotate(1turn);
        }
    }
    @-ms-keyframes spin {
        to {
            transform: rotate(1turn);
        }
    }
    @keyframes spin {
        to {
            transform: rotate(1turn);
        }
    }
    .slices.bar div:nth-child(1) {
        -webkit-transform: rotate(0deg);
        transform: rotate(0deg);
        background: linear-gradient(45deg, red 50%, transparent 50%) 0 0;
        background-repeat: no-repeat;
        background-size: 50% 50%;
    }
    .slices.bar div:nth-child(2) {
        -webkit-transform: rotate(45deg);
        transform: rotate(45deg);
    }
    .slices.bar div:nth-child(3) {
        -webkit-transform: rotate(90deg);
        transform: rotate(90deg);
    }
    .slices.bar div:nth-child(4) {
        -webkit-transform: rotate(135deg);
        transform: rotate(135deg);
    }
    .slices.bar div:nth-child(5) {
        -webkit-transform: rotate(180deg);
        transform: rotate(180deg);
    }
    .slices.bar div:nth-child(6) {
        -webkit-transform: rotate(225deg);
        transform: rotate(225deg);
    }
    .slices.bar div:nth-child(7) {
        -webkit-transform: rotate(270deg);
        transform: rotate(270deg);
    }
    .slices.bar div:nth-child(8) {
        -webkit-transform: rotate(315deg);
        transform: rotate(315deg);
    }
    

    【讨论】:

    • 太棒了!谢谢!还有一个问题:您是否知道值与容器#hold 和.slices 的大小之间的关系?现在旋转器相当大。我正在用 LESS 编写代码,并希望使用少量变量来控制组件,但在我看来,某些值(即 .slices.bar div 中的变换原点,...)似乎只是随机值。
    • 好的,我简化了代码,现在看起来更清晰了。 jsfiddle.net/rr2syj91/2 但要成为一名完美主义者,必须提到线条彼此之间并不完美对齐。知道如何解决吗?
    • 白线?老实说,不是真的。我试着摆弄切片边距,这确实重新定位了它们,但我发现只要一半的馅饼对齐,另一半就没有对齐,而且馅饼的距离越来越远。我个人会将此归咎于 CSS 渲染的限制。对不起,我无法提供更多帮助:(
    • 没问题,无论如何我都非常感谢您的帮助!当我在中间的顶部使用一个遮蔽的白色圆圈使其看起来是空心的并将其调整为更小的尺寸时,我几乎看不出任何问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2021-04-27
    相关资源
    最近更新 更多