【问题标题】:CSS3 3D Box With Shadows带阴影的 CSS3 3D 框
【发布时间】:2013-07-28 00:59:05
【问题描述】:

我正在制作一个通知系统。我希望此通知显示为一个会转动的框,有点像 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>

【问题讨论】:

  • 我不太了解阴影部分。您是否有机会以不同的方式描述它或添加显示阴影的简单图像?
  • @andyb:我已经澄清了我的答案。我不擅长photoshop,否则我会做一个快速的模型。如果不清楚,我可以尝试在 css 中摸索一些东西。
  • 好的,我现在明白了 :-) 我想我也有一个解决方案。尽快发布!

标签: css rotation shadow


【解决方案1】:

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

我添加了一个新的类,其将添加/删除到通知面,并更改了初始的color 添加了一个新的过渡到#cube .top .

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

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

查看demo或以下代码:

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

【讨论】:

  • 非常简洁的解决方案!将 transition: transform .5s 设置为 1s,因为立方体旋转了 1s,并为其他面实现了它:jsfiddle.net/RsXy7/1
  • 是的,我一直在研究过渡时间,但不确定您是否需要它们来匹配。应用于其他面的效果看起来不错:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2013-06-20
  • 2017-01-30
相关资源
最近更新 更多