CSS3带阴影的3D盒子



我正在制作一个通知系统。我希望这个通知像一个旋转的盒子一样显示,有点像iOS中的一些通知,屏幕顶部像立方体一样旋转。

现在,立方体的正面和背面应该是透明的/与背景相同的颜色。当它转动时,一个阴影应该落在与观众前方不平行的两侧,就好像有一盏灯在盒子上发光一样。这能做到吗?

为了更清楚:由于前面&盒子的背面与背景颜色相同,当转动盒子时,它看起来不像是一个盒子在转动,而是一张旋转到位的纸片。所以我想要的是立方体的面得到一个阴影,这取决于它们相对于观察者的角度。

例如,一旦正面(因为它与背景色相同,所以你无法真正看到它)旋转1度,它应该会变得更暗/更亮。另一个学位,多一点。因此,只有当人脸与用户直接平行时,才能显示人脸的真实颜色。这将产生一种错觉,即有一个盒子,而不是一张纸。

我在立方体上使用此教程:http://desandro.github.io/3dtransforms/docs/cube.html

这是一把小提琴:http://jsfiddle.net/BqJMW/3/

另一个问题是,如果你知道我的意思的话,目前的文本似乎有点冗长。通常情况下,#cube上的transform: translateZ(-25px);(参见下面的代码)应该解决这个问题,但它似乎仍然不成比例。

CSS

body {
    background: #ebebeb;
}
.container {
    width: 200px;
    height: 50px;
    position: relative;
    -webkit-perspective: 1000px;
    perspective: 1000px;
}
#cube {
    width: 100%;
    height: 100%;
    position: absolute;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
    -webkit-transition: -webkit-transform 1s;
    transition: transform 1s;
    -webkit-transform: translateZ(-25px);
    transform: tranlateZ(-25px);
}
#cube figure {
    margin:0;
    display: block;
    position: absolute;
    width: 100%;
    height: 100%;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
}
#cube .front {
    background: transparant;
    -webkit-transform: translateZ(25px);
    transform: translateZ(25px);
}
#cube .top {
    background: green;
    -webkit-transform: rotateX(-90deg) translateZ(25px);
    transform: rotateX(-90deg);
}
#cube .back {
    background: transparant;
    -webkit-transform: rotateX(180deg) translateZ(25px);
    transform: rotate(180deg);
}
#cube.show-front {
    -webkit-transform:translateZ(-25px);
    tranform: translateZ(-25px);
}
#cube.show-top {
    -webkit-transform: translateZ(-25px);
    transform: translateZ(-25px);
    -webkit-transform: rotateX(90deg);
    transform: rotateX(90deg);
}
#cube.show-back {
    -webkit-transform: translateZ(-25px);
    transform: translateZ(-25px);
    -webkit-transform: rotateX(180deg);
    transform: rotateX(180deg);
}

HTML

<section class="container">
  <div id="cube">
    <figure class="front">Front</figure>
    <figure class="top">Your notification</figure>
    <figure class="back">Back</figure>
  </div>
</section>

通过将通知面的初始颜色设置为最终颜色的较暗版本,我们可以在该面的color属性上使用CSS3转换,以便在面旋转时将其动画设置为较浅的颜色。

我添加了一个颜色较浅的"绿色"新类,该类将添加到通知面中/从中删除,并更改了初始color,为#cube .top添加了新的转换。

我还纠正了CSS中的一些拼写错误(tranformtransformtransparanttransparent),并从.show-front|top|back类中删除了重复的-webkit-transform:translateZ(-25px);和无前缀版本,因为它们在同一类中被重写。

最后,由于通知面是由25px向查看器翻译的,因此文本看起来很模糊(在Chrome上)。这似乎可以通过为我移除-webkit-perspective: 1000px;来消除。如果你想移除它,我会把它留给你。

请参阅演示或以下代码:

CSS

body {
    background: #ebebeb;
}
.container {
    width: 200px;
    height: 50px;
    position: relative;
    -webkit-perspective: 1000px;
    perspective: 1000px;
}
#cube {
    width: 100%;
    height: 100%;
    position: absolute;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
    -webkit-transition: -webkit-transform 1s;
    transition: transform 1s;
    -webkit-transform: translateZ(-25px);
    transform: translateZ(-25px);
}
#cube figure {
    margin:0;
    display: block;
    position: absolute;
    width: 100%;
    height: 100%;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
}
#cube .front {
    background: transparent;
    -webkit-transform: translateZ(25px);
    transform: translateZ(25px);
}
#cube .top{
    background-color:darkgreen;
    -webkit-transform: rotateX(-90deg) translateZ(25px);
    transform: rotateX(-90deg);
    -webkit-transition:background-color .5s;
}
#cube .top.show {
    background-color:green;
}
#cube .back {
    background: transparent;
    -webkit-transform: rotateX( 180deg ) translateZ(25px);
    transform: rotate(180deg);
}
#cube.show-front{
}
#cube.show-top {
    -webkit-transform: rotateX(90deg);
    transform: rotateX(90deg);
}
#cube.show-back {
    -webkit-transform: rotateX(180deg);
    transform: rotateX(180deg);
}

JavaScript

$('.showfront').click(function () {
    $('.top').removeClass('show');
    $('#cube').removeClass().addClass('show-front');
});
$('.showtop').click(function () {
    $('.top').addClass('show');
    $('#cube').removeClass().addClass('show-top');
});
$('.showback').click(function(){
    $('.top').removeClass('show');
    $('#cube').removeClass().addClass('show-back');
});

最新更新