你所不知道的 CSS 阴影技巧与细节

前端之家收集整理的这篇文章主要介绍了你所不知道的 CSS 阴影技巧与细节前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

,介绍了一些关于 box-shadow 的用法。

,挖掘了其他很多有关 CSS 阴影的点子,是之前的文章没有覆盖到的新内容,而且有一些很有意思,遂打算再起一篇。

Box-shadow 与 filter:drop-shadow,为啥?因为使用其他属性也可以模拟阴影,而且是各种各样的阴影。下面且听我娓娓道来~dp q2w17km a5m p35

Box-shadow,大部分时候,我们使用它都是用来生成一个两侧的投影,或者一个四侧的投影。如下:

image

生成一个单侧的投影呢?

Box-shadow 的用法定义:

Highlighter">
Box-shadow: none | [inset? && [   ? ? ? ] ]#
}

Box-shadow: 1px 2px 3px 4px #333 为例,4 个数值的含义分别是,x 方向偏移值、y 方向偏移值 、模糊半径、扩张半径。

生成的阴影将被包含在原来的元素之下,除非给它设定一个方向的偏移量。所以这个时候,我们给定一个方向的偏移值,即可实现单侧投影:

image

0 = -0,所以当 box-shadow 的模糊半径和扩张半径都为 0 的时候,我们也可以得到一个和元素大小一样的阴影,只不过被元素本身遮挡住了,我们尝试将其偏移出来。

image

Box-shadow 是可以设置多层的,也就是多层阴影,而且可以进行过渡变换动画(补间动画)。但是 background-image: linear-gradient(),也就是渐变背景是不能进行补间动画的。

Box-shadow 实现原本只能利用渐变才能实现的背景图:

image

Box-shadow,实现它的 CSS 代码如下(可以更简化):

Highlighter">
.shadow::before {
content: "";
position: absolute;
width: 50px;
height: 50px;
top: -50px;
left: -50px;
Box-shadow:
50px 50px #000,150px 50px #000,250px 50px #000,50px 100px #000,150px 100px #000,250px 100px #000,50px 150px #000,150px 150px #000,250px 150px #000,50px 200px #000,150px 200px #000,250px 200px #000,50px 250px #000,150px 250px #000,250px 250px #000;
}

Highlighter">

Box-shadow 呢?因为它可以进行补间动画,像这样,这是使用渐变做不到的:

bgshadow

bgshadow2

qq 20181031140253

主题是立体投影。

Box-shadow、text-shadow 或者 drop-shadow,而是我们使用其他元素或者属性模拟元素的阴影。而这样做的目的,是为了能够突破 Box-shadow 这类元素的一些定位局限。让阴影的位置、大小、模糊度可以更加的灵活。

自定义阴影的位置,让它更加立体:

image

bos-shadow ,看上去和立体没什么关系,接下来,我们通过 div 的伪元素,给它生成一个和原图边角形状类似的图形,再通过 transform 位移一下,可能是这样:

image

生成的元素进行一些虚化效果(filter或者Box-shadow都可以),就可以实现一个边角看起来像被撕开的立体效果

image

代码非常简单,伪 CSS 代码示意如下:

Highlighter">
div::before {
content: "";
position: absolute;
top: 50%;
left: 5%;
right: 5%;
bottom: 0;
border-radius: 10px;
background: hsl(48,20%);
transform: translate(0,-15%) rotate(-4deg);
transform-origin: center center;
Box-shadow: 0 0 20px 15px hsl(48,20%);
}

  • 生成一个大小与父元素相近的元素,然后对其进行 rotate 以及定位到合适位置,再赋于阴影操作

Txt Shadow
----- div { text-shadow: 6px 6px 3px hsla(14,30%,1); }

image

文字阴影,最常见的方法就是使用多层文字阴影叠加。

Box-shadow 一样,text-shadow 是可以叠加多层的!但是对于单个元素而言, drop-shadow的话就只能是一层。

文字,我们试着叠加个 50 层文字阴影试一下。额,50 层手写,其实很快的~image

生成 50 层阴影的 function 就好,我们每向右和向下偏移 1px,生成一层 text-shadow:

Highlighter">
@for $i from 1 through 50 {
    $val: #{$val},#{$i}px #{$i}px #{$color};
}

@return $val;

}

div {
text-shadow: makeLongShadow(hsl(14,30%));
}

代码。经过编译后,就会生成如下 CSS:

Highlighter">

效果:

image

文字阴影,明暗度和透明度应该都是不断变化的。这个需求,SASS 可以很好的实现,下面是两个 SASS 颜色函数

  • fade-out 改变颜色的透明度,让颜色更加透明
  • desaturate 改变颜色的饱和度值,让颜色更少的饱和

函数,可以看看这里:

makeLongShadow function 函数:

@for $i from 1 through 50 { $color: fade-out(desaturate($color,1%),.02); $val: #{$val},#{$i}px #{$i}px #{$color}; } @return $val;

}

image

文字的立体阴影。运用在 div 这些容器上也是可以的。当然这里还有一种挺有意思的方法。假设我们,有一个矩形元素,希望给他添加一个长投影,像下面这样:

image

生成这种长投影,刚刚说的叠加多层阴影可以,再就是借助元素的两个伪元素,其实上面的图是这样的:

image

transform: skew() 变换以及从实色到透明色的背景色变化,实现了长投影的效果

box-shadow 、filter: drop-shadow() 、text-shadow 。但是,使用它们生成的阴影通常只能是单色或者同色系的。

image

image

filter: blur 模糊滤镜,我们可以假装生成渐变色或者说是颜色丰富的阴影效果

图片:

image

添加一层与原图颜色相仿的阴影效果,核心 CSS 代码如下:

Highlighter">
&::after {
    content: "";
    position: absolute;
    top: 10%;
    width: 100%;
    height: 100%;
    background: inherit;
    background-size: 100% 100%;
    filter: blur(10px) brightness(80%) opacity(.8);
    z-index: -1;
}

}

image

生成一个与原图一样大小的新图叠加在原图之下,然后利用滤镜模糊 filter: blur() 配合其他的亮度/对比度,透明度等滤镜,制作出一个虚幻的影子,伪装成原图的阴影效果

filter: blur(10px) brightness(80%) opacity(.8); 。

box-shadow实现的一些灯光效果。 

box-shadow 过渡效果与白色文字的叠加:

lightshadow

lightshadow

image

加上它的两个伪元素,刚好可以凑成这三个形状,我们试着实现以下,简单 CSS 代码如下:

Highlighter">
--- div { position: relative; width: 37px; height: 218px; background: #fff;
&::before {
    content: "";
    position: absolute;
    width: 100px;
    height: 100px;
    border: 37px solid #fff;
    border-top: 37px solid transparent;
    border-radius: 50%;
    top: 123px;
    left: -137px;
    transform: rotate(45deg);
}

    &::after {
    content: "";
    position: absolute;
    width: 140px;
    height: 140px;
    border: 30px solid #fff;
    border-right: 30px solid transparent;
    border-top: 30px solid transparent;
    border-left: 30px solid transparent;
    top: -100px;
    right: -172px;
    border-radius: 100%;
    transform: rotate(45deg);
}

}

代码就可以生成整个形状的主体:image

filter: drop-shadow() 登场,它可以在元素呈现之前,为元素的渲染提供一些效果,最常见的也就用它渲染整体阴影。我们通常会用它来实现对话框的小三角与整个对话框的阴影效果,像下面这样,左边是使用 drop-shadow 的效果,右边是使用普通 Box-shadow效果

image

用法,上图效果来自这里:

filter: drop-shadow() 生成它的第一层左边的蓝色阴影,添加在主体 div:

&::before,&::after {
...
}
}

image

添加一层红色 filter: drop-shadow() 在右侧就大功告成!

Box-shadow 一样,text-shadow 是可以叠加多层的!但是对于单个元素而言, drop-shadow 的话就只能是一层。

filter: drop-shadow() 生成另一侧的红色投影,不过还好,我们还有两个伪元素的filter: drop-shadow() 以及 Box-shadow 还没有用上,经过一番尝试:

Highlighter">
Box-shadow: 11.6px 10px 0 0 #fe2d52;
&::before {
    ....
    filter: drop-shadow(16px 0px 0 #fe2d52);
}

&::after {
    ....
    filter:drop-shadow(14px 0 0 #fe2d52);
}

}

Box-shadow 以及两个伪元素的 filter: drop-shadow() ,在单个标签的限制下,最终结果如下:

image

mix-blend-mode 也是可以实现的,下面给出实现方法如下,感兴趣的同学可以看看:


,以分类的形式,展示不同 CSS 属性或者不同的课题使用 CSS 来解决的各种方法。更多有意思的 CSS 技巧可以在这里找到,而且是每日更新。

 ,持续更新,欢迎点个 star 订阅收藏。

文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

dio controls="controls" style="display: none;">

原文链接:https://www.f2er.com/css/71044.html

猜你在找的CSS相关文章