实现原理

主要图形的组成元素由背景和前景图两个元素,以下示例代码中,背景元素使用伪元素 figure::before 表示, 前景元素使用 figure img 表示,当鼠标 hover 悬浮至 figure 元素时,背景元素产生变大效果,前景元素产生变大并向上移动效果,从而从视觉上实现弹出效果。

背景元素 figure::before

前景元素 figure img

1. 使用 overflow: hidden 方式

主体元素的 html 结构由一个 figure 元素包裹的 img 元素构成:

<figure>
<img src='./man.png' alt='Irma'>
</figure>

css 中设置了两个变量 --hov--not-hov 用于控制 hover 元素时的放大以及位移效果。并对 figure 元素添加 overflow: hidden,设置 padding-top: 5% 用于前景元素超出背景元素时不被截断(非必需:并使用了 clamp() 函数用来动态设定 border-radius 以动态响应页面缩放)

figure {
--hov: 0;
--not-hov: calc(1 - var(--hov));
display: grid;
place-self: center;
margin: 0;
padding-top: 5%;
transform: scale(calc(1 - .1*var(--not-hov)));
overflow: hidden;
border-radius: 0 0 clamp(4em, 20vw, 15em) clamp(4em, 20vw, 15em);
}
figure::before, figure img {
grid-area: 1/1;
place-self: end center;
}
figure::before {
content: "";
padding: clamp(4em, 20vw, 15em);
border-radius: 50%;
background: url('./bg.png') 50%/cover;
}
figure:hover {
--hov: 1;
}
img {
width: calc(2*clamp(4em, 20vw, 15em));
border-radius: clamp(4em, 20vw, 15em);
transform: translateY(calc((1 - var(--hov))*10%)) scale(calc(1.25 + .05*var(--hov)));
}

2. 使用 clip-path: inset() 方式

<figure>
<img src='./man.png' alt='Irma'>
</figure>

样式基本上与第一种相同,使用 clip-path 来截取圆形背景区域。

figure {
--hov: 0;
--not-hov: calc(1 - var(--hov));
display: grid;
place-self: center;
margin: 0;
padding-top: 5%;
transform: scale(calc(1 - .1*var(--not-hov)));
clip-path: inset(0 round 0 0 clamp(4em, 20vw, 15em) clamp(4em, 20vw, 15em));
}
figure::before, figure img {
grid-area: 1/1;
place-self: end center;
}
figure::before {
content: "";
padding: clamp(4em, 20vw, 15em);
border-radius: 50%;
background: url('./bg.png') 50%/cover;
}
figure:hover {
--hov: 1;
}
figure:hover::before {
box-shadow: 1px 1px 10px rgba(0, 0, 0, .3);
}
img {
width: calc(2*clamp(4em, 20vw, 15em));
border-radius: clamp(4em, 20vw, 15em);
transform: translateY(calc((1 - var(--hov))*10%)) scale(calc(1.25 + .05*var(--hov)));
}

完整示例

  <h2>使用overflow: hidden方式</h2>
<figure>
<img src='./man.png' alt='Irma'>
</figure>
<h2>使用clip-path: path()方式</h2>
<figure>
<img src='./man.png' alt='Irma'>
</figure>
body {
display: grid;
background: #FDFC47;
background: -webkit-linear-gradient(to right, #24FE41, #FDFC47);
background: linear-gradient(to right, #24FE41, #FDFC47);
}
figure {
--hov: 0;
--not-hov: calc(1 - var(--hov));
display: grid;
place-self: center;
margin: 0;
padding-top: 5%;
transform: scale(calc(1 - .1*var(--not-hov)));
}
figure:nth-of-type(1) {
overflow: hidden;
border-radius: 0 0 clamp(4em, 20vw, 15em) clamp(4em, 20vw, 15em);
}
figure:nth-of-type(2) {
clip-path: inset(0 round 0 0 clamp(4em, 20vw, 15em) clamp(4em, 20vw, 15em));
}
figure, figure img {
transition: transform 0.2s ease-in-out;
}
figure::before, figure img {
grid-area: 1/1;
place-self: end center;
}
figure::before {
padding: clamp(4em, 20vw, 15em);
border-radius: 50%;
background: url('./bg.png') 50%/cover;
content: "";
transition: .25s linear;
}
figure:hover {
--hov: 1;
}
figure:hover::before {
box-shadow: 1px 1px 10px rgba(0, 0, 0, .3);
}
img {
width: calc(2*clamp(4em, 20vw, 15em));
border-radius: clamp(4em, 20vw, 15em);
transform: translateY(calc((1 - var(--hov))*10%)) scale(calc(1.25 + .05*var(--hov)));
}

文章地址: https://www.cnblogs.com/dragonir/p/14663284.html 作者:dragonir

最新文章

  1. HDU 1729 Stone Game【SG函数】
  2. 转I2s
  3. 设计模式之美:Mediator(中介者)
  4. 十步图解CSS的position
  5. 将war文件解压到指定目录
  6. ibatis2.3中#和$符号的区别(转)
  7. Linked List vs Array
  8. 【BZOJ 1045】 1045: [HAOI2008] 糖果传递
  9. JDBC操作数据库的学习(2)
  10. eclipse中使用git进行版本号控制
  11. 微信小程序怎么做出前端table的效果
  12. JAVA设计模式总结之六大设计原则
  13. 强连通分量&amp;hdu_1269&amp;Codeforce 369D
  14. [UWP]使用Acrylic
  15. Hibernate二级缓存简述及基于Spring4,Hibernate5,Ehcache3的二级缓存配置
  16. FIDDLER的使用方法及技巧总结
  17. Python3 在操作excel时报PermissionError: [Errno 13] Permission denied: &#39;D:/workstation/yhdx_auto/config/case.xls&#39;错误
  18. 大数据时代,Wyn Enterprise和您一起探讨CIO的困境和出路 ZT
  19. 使用CCS调试基于AM335X的SPL、Uboot(原创)
  20. iOS项目之WKWebView替换UIWebView相关

热门文章

  1. 教你吃透CSS的盒子模型(Box Model)
  2. 23_MySQL单行和多行子查询语法规则(重点)
  3. ECMAScript 等性运算符
  4. 开发工具-scala处理json格式利器-json4s
  5. Mybatis-Plus插件配置
  6. gitlab和gitlab项目迁移
  7. 利用Visual Studio调试JavaScript脚本
  8. 细说MySQL连接查询:内连、左连和右连
  9. Linux ctrl+z挂起的进程恢复与杀死
  10. 【HTB系列】Beep