Skip to content

Latest commit

 

History

History
119 lines (96 loc) · 2.94 KB

css3_perspective.md

File metadata and controls

119 lines (96 loc) · 2.94 KB

#[翻译]CSS3 perspective 用法

CSS3 perspective属性让元素拥有了视野和视角的效果,而不是像以往的贴在屏幕上的平面,模拟了眼睛与物体之前的距离带来的远近视差效果。比如你站在铁轨上,往铁轨的方向看去,你会看到铁轨并不是平行的,而是趋于相交的。

它值的大小决定了眼睛与元素的距离,值越小则离得越近,值越大则离的越远。同样在页面上的两个2D正方形,如果perspective属性的值不同,则大小就不一样。

需要注意的是,perspective并不影响当前元素的渲染,而是影响它的所有子元素。这也是它跟*transform:perspective()*方法的主要区别,例子如下。

<div class="parent perspective">
    <h1>Using perspective property on parent</h1>
    <div class="child"></div>
    <!--......-->
</div>

<div class="parent transform">
    <h1>Using transform: perspective() on children</h1>
    <div class="child"></div>
    <!--......-->
</div>
.parent.perspective {
  perspective: 50em;
}

.parent.perspective .child {
  transform: rotateX(50deg);
  background: tomato;
}

.parent.transform .child {
  transform: perspective(50em) rotateX(50deg);
  background: deepskyblue;
}

下图左边为perspective属性的效果,右边为transform:perspective()的效果

让我们看一个更cool的例子

<div class="wrapper w1">
  <h1><code>perspective: 1000px</code></h1>
  <div class="cube">
    <div class="side  front">1</div>
    <div class="side   back">6</div>
    <div class="side  right">4</div>
    <div class="side   left">3</div>
    <div class="side    top">5</div>
    <div class="side bottom">2</div>
  </div>
</div>
<div class="wrapper w2">
  <h1><code>perspective: 250px</code></h1>
  <div class="cube">
    <div class="side  front">1</div>
    <div class="side   back">6</div>
    <div class="side  right">4</div>
    <div class="side   left">3</div>
    <div class="side    top">5</div>
    <div class="side bottom">2</div>
  </div>
</div>
.wrapper {
  width: 50%;
  float: left;
}

.w1 {
  perspective: 1000px;
}

.w2 {
  perspective: 250px;
}

.wrapper h1 {
  text-align: center;
}

.cube {
  font-size: 4em;
  width: 2em;
  margin: 1.5em auto;
  transform-style: preserve-3d;
  transform: rotateX(-40deg) rotateY(32deg);
}

.side {
  position: absolute;
  width: 2em;
  height: 2em;
  
  background: rgba(tomato, .6);
  border: 1px solid rgba(0,0,0,.5);
  
  color: white; 
  text-align: center;
  line-height: 2em;
}

.front  { transform:                  translateZ(1em); }
.top    { transform: rotateX( 90deg)  translateZ(1em); }
.right  { transform: rotateY( 90deg)  translateZ(1em); }
.left   { transform: rotateY(-90deg)  translateZ(1em); }
.bottom { transform: rotateX(-90deg)  translateZ(1em); }
.back   { transform: rotateY(-180deg) translateZ(1em); }

效果如下图: