想要在旋转时显示元素的厚度

Posted

技术标签:

【中文标题】想要在旋转时显示元素的厚度【英文标题】:want to show the thickness of an element while it rotate 【发布时间】:2012-07-23 14:31:12 【问题描述】:

我通过 CSS 将一枚硬币沿 Y 轴旋转 90 度。有没有办法让我可以在硬币旋转后显示硬币的厚度,我想我可以在硬币沿 Y 轴旋转后缩放 Y,但这似乎不起作用。如果可能的话,请提出一些方法来做同样的事情。 link_on_js fiddle 相同。请使用 webkit 浏览器打开链接。

css

.coin 
    display: block;
    background: url("url-to-image-of-coin.jpg");
    background-size: 100% 100%;
    width: 100px;
    height: 100px;
    margin: auto;
    border-radius: 100%;
    transition: all 500ms linear;


.flip 
    transform: rotateY(180deg);

html

<div class="coin"></div>

jquery

$('.coin').click(function() 
    $(this).toggleClass('flip');
);

小提琴

http://jsfiddle.net/7EtLu/22/

【问题讨论】:

“硬币的厚度”是什么意思?它只是二维的,不存在真正的 z 轴。 因为我使用硬币的 2-D 图像但实际上硬币是 3-D 对象所以当我应该沿 Y 轴旋转它时我应该看到厚度以及具有逼真的效果.这可以用 css 本身完成吗?? 啊,好吧。我认为 CSS 不能满足您的要求。这看起来像是 Canvas 的任务。但我没有这方面的经验。 好吧,即使我不知道,谢谢你的时间 :) 【参考方案1】:

@joshnh 感谢提供的灵感,这里稍作修改使其看起来更像:

  <div class="flip-card">
    <div class="flip-card-inner">
      <div class="flip-card-front"></div>
      <div class="flip-card-thick"></div>
      <div class="flip-card-back"></div>
    </div>
  </div>
.flip-card 
  background-color: transparent;
  width: 300px;
  height: 300px;
  perspective: 1000px;


.flip-card-inner 
  position: relative;
  width: 100%;
  height: 100%;
  text-align: center;
  background: transparent url(https://i.imgur.com/GPCt3mC.jpg) no-repeat;
  background-size: 100% 100%;
  border-radius: 100%;
  transition: transform 4s;
  transform-style: preserve-3d;



.flip-card-front, .flip-card-back, .flip-card-inner:before, .flip-card-inner:after  
  background-color: #a37131;
  position: absolute;
  width: 100%;
  height: 100%;
  border-radius: 100%;
  overflow: hidden;
  z-index: 1;


.flip-card-inner:before 
  content: '';
  top: 0;
  left: 0;
  transform: rotateY(180deg) translateZ(1px);
  background-image: -webkit-linear-gradient(hsla(0,0%,100%,.25), hsla(0,0%,0%,.25));


.flip-card-inner:after 
  content: '';
  top: 0;
  left: 0;
  transform: rotateY(180deg) translateZ(10px);
  background-image: -webkit-linear-gradient(hsla(0,0%,100%,.25), hsla(0,0%,0%,.25));


.flip-card-front 
  background-color: #bbb;
  color: black;


.flip-card-back 
  background-color: #a37131;
  color: white;
  transform: rotateY(180deg) translateZ(11px);


.flip-card-thick 
  background-color: #a37131;
  background-image: -webkit-linear-gradient(hsla(0,0%,100%,.25), hsla(0,0%,0%,.25));
  bottom: 0;
  left: 130px;
  position: absolute;
  top: 0px;
  width: 10px;
  z-index: -10;
  transform: rotateY(-90deg);
  transform-origin: 100% 50%;


.flip-card:hover .flip-card-inner 
  transform: rotateY(180deg);

codepen

【讨论】:

【参考方案2】:

您可以使用伪元素来产生类似的效果。这是一个例子:http://jsfiddle.net/joshnh/y7rQL/

&lt;div class="coin"&gt;&lt;/div&gt;
body 
    transform: perspective(500px);
    transform-style: preserve-3d;

.coin 
    background-image: url("http://www.coolemails4u.com/wp-content/uploads/2010/10/indian_rupee.png");
    background-size: 100% 100%;
    border-radius: 100%;
    height: 100px;
    margin: 50px auto;
    position: relative;
    transition: .5s linear;
    transform-style: preserve-3d;
    width: 100px;

.coin:after 
    background-color: #262626;
    background-image: -webkit-linear-gradient(hsla(0,0%,100%,.25), hsla(0,0%,0%,.25));
    bottom: 0;
    content: '';
    left: 45px;
    position: absolute;
    top: 0;
    transform: rotateY(-90deg);
    transform-origin: 100% 50%;
    width: 5px;
    z-index: -10;

.coin:before 
    background-color: #262626;
    background-image: -webkit-linear-gradient(hsla(0,0%,100%,.25), hsla(0,0%,0%,.25));
    border-radius: 100%;
    content: '';
    height: 100px;
    left: 0;
    position: absolute;
    top: 0;
    transform: translateZ(-5px);
    width: 100px;

.coin:hover 
    transform: rotateY(90deg);
​

另外,这是一个旋转 180 度的版本(虽然不是很好):http://jsfiddle.net/joshnh/Bz22S/

【讨论】:

@joshnh 非常感谢你的回复真的很有帮助:) ..... 真的很棒你是怎么做到的...... @joshnh 我试图在我的大代码中使用你的方法,我的硬币 div 在其他 div 的大树中。似乎 Preserve-3d 属性不起作用,您能建议我在哪些情况下不维护 preserve-3d 并且 -webkit-transition-style 只是设置为 flat。请帮助 嗯,奇怪。可能值得问另一个问题?如果没有进一步的信息,很难知道发生了什么。 您好,这是 180 度以上旋转的固定版本,看起来与 90 度旋转一样好。 jsfiddle.net/t8gberzy/1 由于某种原因,我无法在 translateZ 的父元素中转换伪元素,所以布局没有那么苗条,但它可以工作并且看起来还不错。 一些解释:::before是硬币的背面,而::after模拟硬币的边缘。当您显着减慢转换速度时,这个技巧就很明显了。

以上是关于想要在旋转时显示元素的厚度的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 在 Digital Crown 旋转期间显示视图

IOS 6 - 自动旋转 MPMovieplayer

旋转框列表,仅显示更改的值

悬停的Bootstrap旋转木马标题

在 Objective-C 中消除旋转方向

IOS:UITextView 旋转 iOS 7 换行文本