【问题标题】:Render HTML elements with perspective?用透视图渲染 HTML 元素?
【发布时间】:2019-11-18 19:05:20
【问题描述】:

目标是呈现具有透视图的 HTML 元素,如下例所示。

我们尝试使用 CSS skew 转换,但这些转换看起来不正确,因为它们会扭曲元素的纵横比或以其他方式造成扭曲。

这是我们尝试过的 CSS 倾斜转换。这些都不像下面的例子那么好。

Codepen:https://codepen.io/anon/pen/MMzdPx

transform: skew(20deg, -15deg);

transform: skew(45deg, -25deg);

transform: skew(45deg, -30deg);

如何实现HTML元素的这种透视渲染?

【问题讨论】:

标签: html css matrix perspective


【解决方案1】:

如你所说,使用透视结合一些旋转

img {
  width:150px;
  margin:20px;
}
img.first {
  transform:perspective(500px) rotateY(20deg);
}
img.last {
  transform:perspective(500px) rotateY(-20deg);
}
<img src="https://i.imgur.com/DGAOsPz.png" class="first">
<img src="https://i.imgur.com/DGAOsPz.png" class="last">

img {
  width:150px;
  margin:30px;
  transform:perspective(500px)  rotateY(15deg) rotateX(50deg) rotateZ(-20deg);
}
&lt;img src="https://i.imgur.com/DGAOsPz.png" &gt;

更多细节的相关问题:

CSS 3d transform doesn't work if perspective is set in the end of property

【讨论】:

  • 我不确定提问者想要perspective projection 还是parallel projection。以上代码示例使用透视投影,但如果您想要平行投影,您可以将perspective(500px)更改为perspective(0)
【解决方案2】:

类似的东西。 我使用了 CSS 自定义属性,让计算更加明显。

请注意: 变换属性的顺序非常重要。从右到左求值:

来自MDN transform CSS

变换函数按从左到右的顺序相乘,这意味着复合变换按从右到左的顺序有效地应用。

这意味着transform: rotateX(90deg) translateX(100px)transform: translateX(100px) rotateX(90deg) 不同。前者先平移后旋转,后者先平移后平移。

.box {
  width: 130px;
  height: 268px;
  background-size: cover;
}
.box:nth-child(4n+1) {
  background: url(https://picsum.photos/id/100/136/276);
}
.box:nth-child(4n+2) {
  background: url(https://picsum.photos/id/200/136/276);
}
.box:nth-child(4n+3) {
  background: url(https://picsum.photos/id/300/136/276);
}
.box:nth-child(4n+4) {
  background: url(https://picsum.photos/id/400/136/276);
}

.container {
  transform: perspective(1200px) rotateX(60deg) rotateZ(-35deg) translate3d(-100px, -200px, -500px);
}

.skew {
  position: absolute;
  top: 200px;
  left: 50%;
  --width: 140px;
  --height: 278px;
  --x: 0;
  --y: 0;
  --offsetX: calc(var(--x) * var(--width));
  --offsetY: calc(var(--y) * var(--height));
  transform: translate(var(--offsetX), var(--offsetY));
}
.skew:nth-child(5n + 1) {
  --x: -2;
}
.skew:nth-child(5n + 2) {
  --x: -1;
}
.skew:nth-child(5n + 3) {
  --x: 0;
}
.skew:nth-child(5n + 4) {
  --x: 1;
}
.skew:nth-child(5n + 5) {
  --x: 2;
}
.skew:nth-child(n + 1):nth-child(-n + 5) {
  --y: -2;
}
.skew:nth-child(n + 6):nth-child(-n + 10) {
  --y: -1;
}
.skew:nth-child(n + 11):nth-child(-n + 15) {
  --y: 0;
}
.skew:nth-child(n + 16):nth-child(-n + 20) {
  --y: 1;
}
.skew:nth-child(n + 21):nth-child(-n + 25) {
  --y: 2;
}
<div class="container">
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
  <div class="skew box"></div>
</div>

【讨论】:

    【解决方案3】:

    可以这么说,您必须构建元素。您的代码笔中的以下内容: 修改了html:

    <div class="perspective">
    <div class="skew">
    <div class="front"></div>
    <div class="back"></div>
    <div class="left"></div>
    <div class="right"></div>
    </div>
    </div>
    

    改变了css:

    .perspective {
    position: relative;
    -webkit-perspective: 1242px; /* Safari 4-8 */
    perspective: 1242px;
    height: 2688px;
    }
    
    .front {
    width: 1242px;
    height: 2688px;
    max-width: 100%;
    max-height: 100%;
    position: absolute;
    transform: rotateX(45deg) rotateY(-60deg) translateZ(-80em);
    background: url(https://i.imgur.com/DGAOsPz.png);
    }
    
    .skew {
    transform-style: preserve-3d;
    transform: rotateX(10deg) rotateY(80deg);
    height: 2560px;
    width: 100%;
    }
    

    仍然需要在 css 中添加侧面和背面,但您可以将其粘贴到您的 codepen 中,看看它是如何工作的。

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 2011-09-20
      • 2018-08-10
      • 2017-04-01
      • 2021-11-03
      • 2023-03-23
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多