一个元素即可实现 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,采用意译。


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


相关文章
|
6月前
【最简洁】一句CSS3代码实现不规则自定义背景图拼接样式,多用于异形弹窗背景图
【最简洁】一句CSS3代码实现不规则自定义背景图拼接样式,多用于异形弹窗背景图
|
11月前
|
前端开发 安全 容器
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图(二)
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图
|
11月前
|
前端开发
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图(一)
CSS基本知识之复合选择器、元素显示模式、背景图片位置,精灵图
|
JavaScript API 容器
彻底弄懂元素样式、位置、大小相关计算
在我们日常开发中偶尔会碰到获取元素样式、设置某元素样式、计算元素位置、计算滚动距离等需求。但是js中关于元素位置、样式、大小的api种类繁多,稍不留神就会搞不清楚。今天笔者就带你彻底弄清楚,让你在这类问题上不再迷茫。
215 0
|
前端开发 容器
每日一题:如何判断一个元素是否在可视区域中?
每日一题:如何判断一个元素是否在可视区域中?
361 0
每日一题:如何判断一个元素是否在可视区域中?
|
存储 算法
漫画:寻找无序数组的第k大元素(修订版)
题目是什么意思呢?比如给定的无序数组如下: 如果 k=6,也就是要寻找第6大的元素,这个元素是哪一个呢? 显然,数组中第一大的元素是24,第二大的元素是20,第三大的元素是17 ...... 第6大的元素是9。
135 0
漫画:寻找无序数组的第k大元素(修订版)
|
前端开发
css布局技巧-文字围绕浮动元素巧妙运用
解释 我们前面讲浮动的时候说道浮动的元素会“飞起来”,不占有位置,会破毁标准流,导致浮动的元素下面的标准流会跑到浮动元素的位置被浮动的元素压住,但是,我们之前在浮动那一节说过,浮动产生的目的就是让文字围绕浮动元素的,即浮动的盒子不会压住文字,利用这个特性可以很好的简化某些布局。
275 0
css布局技巧-文字围绕浮动元素巧妙运用
如何用C#显示竖排文字?
看这个题目,应该觉的这个问题不难,刚开始我也是这么想,可是目前我手头上的参考资料上没有一个介绍竖直显示文字的,上网查资料只发现一个有用的,可是实现起来比较麻烦,需要进行坐标转换,旋转,还得平移,没办法,为了实现下图Y方向坐标的标注,只好这样了
1195 0
|
前端开发 JavaScript Web App开发
如何用纯 CSS 创作从按钮两侧滑入装饰元素的悬停特效
效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/yRyOZr 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
1058 0
|
JavaScript
如何用DOM 元素就能画出国宝熊猫
效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/odKrpy 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
904 0