3D立方体中的css3变换原点问题

eir*_*ios 9 html css css3 css-transforms css-animations

我创建了css-cube并将其旋转:hover.

但它的旋转是基于立方体的一面!

我想从它的中心旋转它,就像在这个例子中一样.我正在尝试属性但没有得到理想的结果.

我也尝试在一个立方体内放置一个中间飞机,但在那种情况下悬停不起作用!

.contain {
    width: 300px;
    height: 300px;
    -webkit-perspective: 500px;
    perspective: 500px;
    position: absolute;
}
.main {
    position:relative;
    width:100px;
    height:100px;
    margin:100px 100px;
    background:#07a;
    overflow:visible;
    transition: all linear,transform cubic-bezier(0.4, 0.25, 0.14, 1.5),background cubic-bezier(0.4, 0.25, 0.14, 1.5);
    transition-duration: 700ms;
    -moz-transform-style: preserve-3d;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
    transform-origin: center center;
}

.main:hover{
    transform:rotateY(180deg);
}

.top, .right, .left, .bottom,.lid{
    position:absolute;
    width:100px;
    height:100px;
    z-indexd:999;
    transition:  all 1s ease;
}
.top {
    background:crimson;
    top:-100px;
    transform-origin : 50% 100%;
    transform:rotateX(-90deg);
}
.bottom {
    background:crimson;
    bottom:-100px;
    transform-origin :100% 0%;
    transform:rotateX(90deg);
}
.left {
    background:#ccc;
    left:-100px;
    transform-origin :100% 0%;
    transform:rotateY(90deg);
}
.right {
    background:#ccc;
    right:-100px;
    transform-origin : 0% 0%;
    transform:rotateY(-90deg);
}
.lid {
    background:#07a;
    transform: translateZ(170px);
    transform-origin : 0% 0%;
    transform:translateZ(100px);
}
Run Code Online (Sandbox Code Playgroud)
<div class="contain">
            <div class="main">
                <div class="lid"></div>
                <div class="top"></div>
                <div class="right"></div>
                <div class="left"></div>
                <div class="bottom"></div>
            </div>
        </div>
Run Code Online (Sandbox Code Playgroud)

val*_*als 4

问题是你需要将变换原点设置在立方体的中心,而立方体是一个 3d 元素。你错过了第三维度!

所以应该是

transform-origin: center center 50px;
Run Code Online (Sandbox Code Playgroud)

因为你的立方体边长是 100px

transform-origin: center center 50px;
Run Code Online (Sandbox Code Playgroud)
.contain {
    width: 300px;
    height: 300px;
    -webkit-perspective: 500px;
    perspective: 500px;
    position: absolute;
}
.main {
    position:relative;
    width:100px;
    height:100px;
    margin:100px 100px;
    background:#07a;
    overflow:visible;
    transition: all linear,transform cubic-bezier(0.4, 0.25, 0.14, 1.5),background cubic-bezier(0.4, 0.25, 0.14, 1.5);
    transition-duration: 700ms;
    -moz-transform-style: preserve-3d;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
    transform-origin: center center 50px;
}

.main:hover{
    transform:rotateY(180deg);
}

.top, .right, .left, .bottom,.lid{
    position:absolute;
    width:100px;
    height:100px;
    z-indexd:999;
    transition:  all 1s ease;
}
.top {
    background:crimson;
    top:-100px;
    transform-origin : 50% 100%;
    transform:rotateX(-90deg);
}
.bottom {
    background:crimson;
    bottom:-100px;
    transform-origin :100% 0%;
    transform:rotateX(90deg);
}
.left {
    background:#ccc;
    left:-100px;
    transform-origin :100% 0%;
    transform:rotateY(90deg);
}
.right {
    background:#ccc;
    right:-100px;
    transform-origin : 0% 0%;
    transform:rotateY(-90deg);
}
.lid {
    background:#07a;
    transform: translateZ(170px);
    transform-origin : 0% 0%;
    transform:translateZ(100px);
}
Run Code Online (Sandbox Code Playgroud)

  • 很高兴它有帮助!我已经在答案开头解释了它是如何工作的。变换原点必须位于立方体的中心,否则当你旋转它时看起来很奇怪。您已将其设置为 x 和 y 坐标的中心,但未设置为 z 坐标的中心。由于您的元素没有深度,中心在这里不起作用,您需要明确设置它(50px) (2认同)