Grow Shadow

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <h3 class="hover-1">Hover Me</h3>
 <style>
 .hover-1 {
 background-color: #1095c1;
 color: #ffffff;
 transition: .4s;
 }
 .hover-1:hover {
 transform: scale(1.1);
 box-shadow: 0 10px 10px -10px rgba(0, 0, 0, .5);
 }
 </style>
 
 | 
Float Shadow

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | <h3 class="hover-2">Hover Me</h3>
 <style>
 .hover-2 {
 position: relative;
 line-height: 1.2em;
 background-color: #1095c1;
 color: #ffffff;
 transition: .4s;
 }
 .hover-2:after {
 content: "";
 position: absolute;
 top: 100%;
 left: 5%;
 height: 20px;
 width: 90%;
 z-index: -1;
 opacity: 0;
 background: radial-gradient(farthest-side, rgba(0, 0, 0, .35), #ffffff) no-repeat;
 transition: .4s;
 }
 .hover-2:hover {
 transform: translateY(-10px);
 }
 .hover-2:hover:after {
 opacity: 1;
 transform: translateY(10px);
 }
 </style>
 
 | 
Bubble Right

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | <h3 class="hover-3">Hover Me</h3>
 <style>
 .hover-3 {
 position: relative;
 line-height: 1.2em;
 background-color: #1095c1;
 color: #ffffff;
 }
 .hover-3:before {
 content: "";
 position: absolute;
 right: 0;
 top: 50%;
 transform: translateY(-50%);
 border: solid;
 border-width: 12px 0 12px 15px;
 border-color: transparent transparent transparent #1095c1;
 z-index: -1;
 transition: .4s;
 }
 .hover-3:hover:before {
 transform: translate(100%, -50%);
 }
 </style>
 
 | 
3D 旋转

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | <h3 class="hover-4">Hover Me</h3>
 <style>
 .hover-4 {
 padding: 8px 8px 8px 22px;
 background: linear-gradient(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.4)) left/14px 100% no-repeat;
 polygon(14px 3px, 14px 0, 100% 0, 100% 100%, 14px 100%, 14px calc(100% - 3px));
 transition: 0.4s, color 0.4s 0.4s, background-color 0.4s 0.4s;
 }
 .hover-4:hover {
 background-color: #000;
 color: #fff;
 clip-path: polygon(0px 3px, 14px 0, 100% 0, 100% 100%, 14px 100%, 0 calc(100% - 3px));
 transform: perspective(1000px) rotateY(40deg);
 transition: 0.4s 0.4s, color 0.4s, background-color 0.4s;
 }
 </style>
 
 | 
通过 padding 在左侧留出 14px *100% 的空间,向其中填充背景图,用作翻转后的阴影部分。
初始时, clip-path 的范围包括除了最左边 14px * 100% 的所有部分,即显示没有背景的部分。当 hover 时,改变 clip-path,将左侧背景图也包含进去,但是左上和左下两个点的纵坐标少取了一些,以呈现出立体的感觉。
perspective 属性设置从何处查看一个元素的角度,单位为 px,值越小角度越大。
注意:hover 前后的 clip-path 形状的坐标点数量应保持一致,只通过改变坐标点的值来改变形状,因为这样可以有更好的过渡效果。
下面我们来看一个例子:

| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | <div class="box"><img src="https://i.picsum.photos/id/1011/400/250.jpg?hmac=E9wN15u_CpjA8P_xTXExwDTjYdKQ0olRCmuV3x893fAhttps://i.picsum.photos/id/1011/400/250.jpg?hmac=E9wN15u_CpjA8P_xTXExwDTjYdKQ0olRCmuV3x893fA" alt="">
 </div>
 
 <style>
 img {
 padding: 20px 20px 0 20px;
 outline: 20px solid rgba(0, 0, 0, .4);
 outline-offset: -20px;
 clip-path: polygon(
 20px 20px,
 calc(100% - 20px) 20px,
 calc(100% - 20px) calc(100% - 20px),
 calc(100% - 20px - 10px) calc(100% - 20px),
 calc(20px + 10px) calc(100% - 20px),
 20px calc(100% - 20px)
 );
 transition: 1s;
 }
 img:hover {
 transform: perspective(1000px) rotateX(40deg);
 clip-path: polygon(
 20px 20px,
 calc(100% - 20px) 20px,
 calc(100% - 20px) calc(100% - 20px),
 calc(100% - 20px - 10px) 100%,
 calc(20px + 10px) 100%,
 20px calc(100% - 20px)
 );
 }
 </style>
 
 | 
由图可知,旋转后的阴影部分也是图片的一部分,那怎么实现这种效果呢?
这里用到了 outline 属性。它与 border 的效果相似。不同的是:
- outline 不占用布局空间,它不是盒子模型的一部分; 
- 它创建的轮廓四条边都是一样的,不能单独为某一条边设置样式; 
- 它创建的轮廓可以向内扩展(outline-offset 为负),而 border 只能向外。 
这里主要使用到了它的第三条特性。
(1)首先,为了在图片底部设置高 20px 的阴影效果,我们设置
| 12
 3
 
 | outline: 20px solid rgba(0, 0, 0, .4);outline-offset: -20px;
 padding: 20px 20px 0 20px;
 
 | 
效果如下:

(2)通过 clip-path 进行区域裁剪。初始时,裁剪没有阴影的部分,hover 时将底部的阴影也裁剪出来,为了有立体感,最下面两个坐标点向中间靠拢 10px。效果如下:

(3)通过旋转即可呈现出最后的效果。