通常而言,我们生成阴影的方式大多是 box-shadowfilter: drop-shadow()text-shadow

box-shadow

CSS3 box-shadow 属性用来描述一个元素的一个或多个阴影效果,该属性几乎可以让你完成你想要的任何阴影效果。 box-shadow 属性语法和取值非常灵活,对于新手有点不容易理解。总结一下语法和 box-shadow 属性各种阴影效果。

语法

box-shadow 可以设置 5 个值:x偏移量 y偏移量 阴影模糊半径 阴影扩散半径 阴影颜色

  1. /* offset-x | offset-y | color */
  2. box-shadow: 60px -16px teal;
  3. 阴影的水平位置 垂直位置 颜色
  4. 上面表示为 阴影位置相对元素位置水平(向右)偏移60px,垂直(向上)偏移-16px
  5. /* offset-x | offset-y | blur-radius 模糊| color */
  6. box-shadow: 10px 5px 5px black;
  7. 模糊值越大,阴影就越大越淡
  8. /* offset-x | offset-y | blur-radius | spread-radius 扩大 | color */
  9. box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);
  10. 扩大的默认值为0,不扩大,与元素大小相同,取正值时,阴影扩大;取负值时,阴影收缩。
  11. /* inset | offset-x | offset-y | color */
  12. box-shadow: inset 5em 1em gold;
  13. inset设置内阴影,原本默认为外阴影
  14. /* Any number of shadows, separated by commas */
  15. box-shadow: 3px 3px red, -1em 0 0.4em olive;
  16. /* Global keywords */
  17. box-shadow: inherit;
  18. box-shadow: initial;
  19. box-shadow: unset;

box-shadow 阴影 - 图1
阴影中心点 x 轴偏移了 300px,y 轴偏移了 300px:

box-shadow 阴影 - 图2

那阴影扩散半径是啥意思?
看这张图就明白了:
box-shadow 阴影 - 图3
还有阴影模糊半径:
box-shadow 阴影 - 图4

再来看下这几个值:

  1. box-shadow: 300px 300px 30px 100px blue;

x 轴位移、y 轴位移都是指中心点的位移。阴影的半径就是 width/2 + 扩散半径 + 模糊半径。
而且 box-shadow 可以设置多个,通过逗号分隔,也就是多重阴影。

示例

shadow-blur 动态阴影

利用 filter: blur 模糊滤镜,我们可以生成与背景图片颜色相仿的阴影效果

其简单的原理就是,利用伪元素,生成一个与原图一样大小的新图叠加在原图之下,然后利用滤镜模糊 filter: blur() 配合其他的亮度/对比度,透明度等滤镜,制作出一个虚幻的影子,伪装成原图的阴影效果。重要的就是filter: blur(10px) brightness(80%) opacity(.8);

  1. .shadow-blur {
  2. position: relative;
  3. background: url($img) no-repeat center center;
  4. }
  5. .shadow-blur::before {
  6. content: "";
  7. display: block;
  8. background: inherit;
  9. filter: blur(10rpx);
  10. opacity: 0.4;
  11. position: absolute;
  12. width: 100%;
  13. height: 100%;
  14. top: 10rpx;
  15. left: 10rpx;
  16. z-index: -1;
  17. transform-origin: 0 0;
  18. border-radius: inherit;
  19. transform: scale(1, 1);
  20. }
  21. /* 或者 */
  22. .shadow-blur::after {
  23. content: "";
  24. position: absolute;
  25. top: 10%;
  26. width: 100%;
  27. height: 100%;
  28. background: inherit;
  29. background-size: 100% 100%;
  30. filter: blur(10px) brightness(80%) opacity(.8);
  31. z-index: -1;
  32. }

image.png

  1. <div class="dynamic-shadow-parent">
  2. <div class="dynamic-shadow"></div>
  3. </div>
  4. .dynamic-shadow-parent {
  5. position: relative;
  6. z-index: 1;
  7. }
  8. .dynamic-shadow {
  9. position: relative;
  10. width: 10rem;
  11. height: 10rem;
  12. background: linear-gradient(75deg, #6d78ff, #00ffb8);
  13. }
  14. .dynamic-shadow::after {
  15. content: '';
  16. width: 100%;
  17. height: 100%;
  18. position: absolute;
  19. background: inherit;
  20. top: 0.5rem;
  21. filter: blur(0.4rem);
  22. opacity: 0.7;
  23. z-index: -1;
  24. }

image.png

box-shadow盒阴影图形生成技术