旋转时保持盒子阴影方向一致

Chr*_*ris 19 html css css3 css-transforms css-animations

当给出例如<div>盒子阴影以及旋转时,它将导致盒子阴影方向的旋转 - 当盒子阴影应该产生照明幻觉时,这是有问题的.

示例:https://jsfiddle.net/5h7z4swk/

div {
  width: 50px;
  height: 50px;
  margin: 20px;
  box-shadow: 10px 10px 10px #000;
  display: inline-block;
}
#box1 {
  background-color: #b00;
}
#box2 {
  background-color: #0b0;
  transform: rotate(30deg);
}
#box3 {
  background-color: #00b;
  transform: rotate(60deg);
}
#box4 {
  background-color: #b0b;
  transform: rotate(90deg);
}
@keyframes spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
#box6 {
  background-color: #0bb;
  animation-name: spin;
  animation-duration: 2s;
  animation-iteration-count: infinite;
}
Run Code Online (Sandbox Code Playgroud)
<div id="box1"></div>
<div id="box2"></div>
<div id="box3"></div>
<div id="box4"></div>
<div id="box6"></div>
Run Code Online (Sandbox Code Playgroud)

用div旋转的box-shadow

这个问题的答案应该类似于这个模拟:

在旋转期间尊重Shdaow方向

如何旋转<div>并仍保持盒子阴影方向相同?

解决方案应该是纯CSS ...

注意:CSS中的动画用于演示目的.用例将使用JavaScript来设置旋转.但JavaScript对盒子阴影一无所知,因为定义一个(或许多......)阴影是设计的责任.这就是它应该是纯CSS解决方案的原因.

web*_*iki 25

使用CSS变换,在旋转期间保持偏移框阴影的方向一致.
这种方法依赖于变换原点随变换移动的事实.这意味着当在同一元素上设置多个变换时,每个变换的坐标系将根据先前的变换而变化.

在以下示例中,blue元素是伪元素,shadow是div元素:

div {
  width: 40px; height: 40px;
  margin: 40px;
  box-shadow: 0px 0px 10px 5px #000;
  animation: spinShadow 2s infinite;
  background-color: #000;
}
@keyframes spinShadow {
  to { transform: rotate(360deg); }
}
div:before {
  content: '';
  position: absolute;
  left:-5px; top:-5px;
  width: 50px; height: 50px;
  transform: rotate(0deg) translate(-10px, -10px) rotate(0deg);
  animation:inherit;
  animation-name: spinElt;
  background-color: #0bb;
}
@keyframes spinElt {
  to { transform: rotate(-360deg) translate(-10px, -10px) rotate(360deg); }
}
Run Code Online (Sandbox Code Playgroud)
<div></div>
Run Code Online (Sandbox Code Playgroud)

伪元素上的transition属性的说明(有关步骤的说明,请参阅以下代码段):

transform: rotate(-360deg) translate(-10px, -10px) rotate(360deg)
Run Code Online (Sandbox Code Playgroud)
  1. rotate(-360deg) 计算父项的旋转以使伪元素成为静态.
  2. translate(-10px, -10px) 转换伪元素以使阴影偏移
  3. rotate(360deg) 伪元素以与父元素相同的方向旋转

div {
  width: 40px; height: 40px;
  margin: 40px;
  box-shadow: 0px 0px 10px 5px #000;
  animation: spinShadow 2s infinite;
  background-color: #000;
}
@keyframes spinShadow {
  to { transform: rotate(360deg); }
}
div:before {
  content: '';
  position: absolute;
  left:-5px; top:-5px;
  width: 50px; height: 50px;
  animation:inherit;
  background-color: #0bb;
}
#first:before{
  transform: rotate(0deg);
  animation-name: first;
}  
@keyframes first {
  to { transform: rotate(-360deg); }
}
#second:before{
  transform: rotate(0deg) translate(-10px, -10px);
  animation-name: second;
}  
@keyframes second {
  to { transform: rotate(-360deg) translate(-10px, -10px); }
}
#complete:before{
  transform: rotate(0deg) translate(-10px, -10px) rotate(0deg);
  animation-name: complete;
}  
@keyframes complete {
  to { transform: rotate(-360deg) translate(-10px, -10px) rotate(360deg); }
}
Run Code Online (Sandbox Code Playgroud)
<ol>
  <li>Counter rotate:<div id="first"></div></li>
  <li>Translate :<div id="second"></div></li>
  <li>Rotate:<div id="complete"></div></li>
<ol>
Run Code Online (Sandbox Code Playgroud)

  • 哇.比我想象的要容易得多,非常聪明.做得很好 (3认同)

G-C*_*Cyr 8

你也可以在动画帧中整合盒子阴影方向:

div {
  display: inline-block;
  margin: 1em ;
  height: 50px;
  width: 50px;
  box-shadow: 15px 15px 15px 5px gray;
  animation: rte 5s infinite linear;
}

.red {
  background: red
}

.green {
  background: green;
  animation-delay:2s;
}

.blue {
  background: blue;
  animation-delay:4s;
}

.bob {
  background: #b0b;
  animation-delay:6s;
}

.cyan {
  background: cyan;
  animation-delay:8s;
}

@keyframes rte {
  25% {
    box-shadow:  15px -15px 15px 5px gray;
  }
  50% {
      box-shadow:  -15px -15px 15px 5px gray;
  }
  75% {
    box-shadow:  -15px 15px 15px 5px gray;
  }
  100% {
    transform: rotate(360deg);
  }
}
Run Code Online (Sandbox Code Playgroud)
<div class="red"></div>
<div class="green"></div>
<div class="blue"></div>
<div class="bob"></div>
<div class="cyan"></div>
Run Code Online (Sandbox Code Playgroud)