一个元素即可实现 3D 插图效果

简介: 仅使用一个 <img> 标签,使用一个小技巧就可以创建一个 3D 插图,没有为伪元素,没有其他其他标签,没使用 SVG。仅仅是一个标签配合一些 CSS 样式。

image.png


一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情


仅使用一个 <img> 标签,使用一个小技巧就可以创建一个 3D 插图,没有为伪元素,没有其他其他标签,没使用 SVG。仅仅是一个标签配合一些 CSS 样式。


效果图如下:


image.png


不错哦~


我们来看下代码,分解下:


<img src="https://picsum.photos/id/1069/500/300" >
复制代码


html 代码没什么好说的了吧~ 就是一个 img 标签。


img {
  --x:10px;
  --y:20px;
  clip-path:polygon(
       var(--y)              var(--y),
       calc(100% - var(--y)) var(--y),
       calc(100% - var(--y)) calc(100% - var(--y)),
       var(--y)              calc(100% - var(--y)),
       0 calc(100% - var(--x) - var(--y)),
       0 calc(var(--x) + var(--y)));
  margin:30px;
  transform:perspective(1000px) rotateY(40deg);
  outline: var(--y) solid rgba(0,0,0,0.4);
  outline-offset: calc(-1*var(--y));
  padding:var(--y) var(--y) var(--y) 0;
  transition:1s all;
  max-width:100%;
  display:block;
  margin:auto;
}
img:hover {
  transform:perspective(1000px) rotateY(0deg);
  clip-path:polygon(
       var(--y)              var(--y),
       calc(100% - var(--y)) var(--y),
       calc(100% - var(--y)) calc(100% - var(--y)),
       var(--y)              calc(100% - var(--y)),
       var(--y)  calc(100% - var(--x) - var(--y)),
       var(--y)  calc(var(--x) + var(--y))
    );
}
复制代码


我们先对 img 原始的样式了解~


我们先预设变量 --x: 10px;--y: 20px。然后第一步对 <img> 标签添加轮廓:


/* [1] outline */
outline: var(--y) solid rgba(0,0,0,0.4);
复制代码


image.png


第二步,添加轮廓的偏移:


/* [2] outline-offset */
outline-offset: calc(-1*var(--y));
复制代码


相当于给图片添加了边框的遮罩层。


image.png


第三步,使用 padding 保留图片左侧的轮廓遮罩。


/* [3] padding */
padding:var(--y) var(--y) var(--y) 0;
复制代码


image.png


之后,我们使用路径裁切 clip-path,将图片裁剪出一个多边形 -- 使用 polygon


/* [4] clip-path */
clip-path:polygon(
       var(--y)              var(--y),  /* a 点 */
       calc(100% - var(--y)) var(--y),  /* b 点 */
       calc(100% - var(--y)) calc(100% - var(--y)), /* c 点 */
       var(--y)              calc(100% - var(--y)), /* d 点 */
       0 calc(100% - var(--x) - var(--y)), /* x 点 */
       0 calc(var(--x) + var(--y))); /* y 点 */
复制代码


image.png


咦,这样看着是不是像 3d 图片了呢~


为了更加逼真,我们加上 tranform 属性:


/* [5] transform */
transform:perspective(1000px) rotateY(40deg);
复制代码


image.png


这里我们使用了透视效果,相当于,我们在 Z 轴上距离原点 1000px 处防止了投影仪;让后我们将图在 y 轴上正向旋转 40 度。


下面我们加上 hover 效果,先上图:


image.png


我们对裁切的路径的点做出了调整,上面是 hover 稳定后的效果图,更改了点 x -> x'y -> y' 两处,并恢复了图片在 y 恢复为 0,如下:


transform:perspective(1000px) rotateY(0deg);
clip-path:polygon(
       var(--y)              var(--y), /* a 点 */
       calc(100% - var(--y)) var(--y), /* b 点 */
       calc(100% - var(--y)) calc(100% - var(--y)), /* c 点 */
       var(--y)              calc(100% - var(--y)), /* d 点 */
       var(--y)  calc(100% - var(--x) - var(--y)), /* x' 点 */
       var(--y)  calc(var(--x) + var(--y))); /* y' 点 */
复制代码


当然,为了动画更加平滑,需要添加 transition 效果,这里添加了:


transition:1s all;
复制代码


表明所有的动画将在 1s 内平滑移动。


当然,上面只是对图片的左边进行 3D 透视效果而已,你可以对其底部进行透视,比如:


image.png


本文翻译自 3D image with one element,采用意译。


上面的知识点,你学废了没? 💨


相关文章
|
7月前
【最简洁】一句CSS3代码实现不规则自定义背景图拼接样式,多用于异形弹窗背景图
【最简洁】一句CSS3代码实现不规则自定义背景图拼接样式,多用于异形弹窗背景图
|
前端开发 安全 容器
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图(二)
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图
|
前端开发
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图(一)
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图
|
JavaScript API 容器
彻底弄懂元素样式、位置、大小相关计算
在我们日常开发中偶尔会碰到获取元素样式、设置某元素样式、计算元素位置、计算滚动距离等需求。但是js中关于元素位置、样式、大小的api种类繁多,稍不留神就会搞不清楚。今天笔者就带你彻底弄清楚,让你在这类问题上不再迷茫。
218 0
python 绘图 实现图中为字体添加下标、上标
python 在绘图添加图例时,一些数学符号或者公式常常包含上标和下标,这里简单描述了如何实现上述要求。
python 绘图 实现图中为字体添加下标、上标
|
前端开发
SVG 入门基础(2)形状元素
SVG 入门基础(2)形状元素
137 0
SVG 入门基础(2)形状元素
|
前端开发 容器
每日一题:如何判断一个元素是否在可视区域中?
每日一题:如何判断一个元素是否在可视区域中?
363 0
每日一题:如何判断一个元素是否在可视区域中?
|
存储 算法
漫画:寻找无序数组的第k大元素(修订版)
题目是什么意思呢?比如给定的无序数组如下: 如果 k=6,也就是要寻找第6大的元素,这个元素是哪一个呢? 显然,数组中第一大的元素是24,第二大的元素是20,第三大的元素是17 ...... 第6大的元素是9。
137 0
漫画:寻找无序数组的第k大元素(修订版)
如何用C#显示竖排文字?
看这个题目,应该觉的这个问题不难,刚开始我也是这么想,可是目前我手头上的参考资料上没有一个介绍竖直显示文字的,上网查资料只发现一个有用的,可是实现起来比较麻烦,需要进行坐标转换,旋转,还得平移,没办法,为了实现下图Y方向坐标的标注,只好这样了
1199 0
|
前端开发 JavaScript Web App开发
如何用纯 CSS 创作从按钮两侧滑入装饰元素的悬停特效
效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/yRyOZr 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
1065 0