扩大使用 "box-shadow "和 "border-radius "的范围(附代码示例)

141 阅读7分钟

本集将探讨box-shadowborder-radius 的扩展用法,并以一个使用这些属性来增强图片展示的着陆页演示作为结束。

你将学会:

  • border-radius 的扩展语法,以及何时使用哪种类型的单位来设置数值
  • 如何创建多个box-shadow
  • 关于box-shadowinset
  • 如何用inset "破解 "box-shadow ,以应用流行的图像过滤技术

border-radius#的概述

现在的孩子们再也不用为你希望显示为圆形的div的每个角创建gif了😂真的,border-radius 的发布和最终支持是CSS中最重要的里程碑之一。

为了复习一下,下面是它经常被使用的方式:

border-radius: 50%;

对于一个正方形元素来说,这将导致一个圆形的外观。

或者将其缩减,使原本尖锐的方形角略微圆润一些,比如对于一个按钮或卡片,你可能会使用:

border-radius: 8px;

有一种方法可以让你更进一步,就是使用两个值,第一个值设置左上角和右下角,第二个值设置右上角和左下角:

border-radius: 20% 50%;

这......看起来有点像柠檬?

example of two value border-radius

现在,给定相同的值,但不同的尺寸,这些结果会有相当大的差异。

same border-radius value applied to various size divs

我们也可以设置所有四个角:

/* top-left | top-right | bottom-right | bottom-left */
border-radius: 3vw 4vw 8vw 2vw;

example with all four corners set on border-radius

但是等等--还有更多

有一个超级大的扩展语法,允许你定义每个角的水平和垂直半径。默认的圆角是非常圆的,添加额外的半径可以改变产生角的 "剪裁",从而允许出现时髦的 "圆球 "形状。

"blob" shape with border-radius expanded syntax

看看Jhey的这个border-radius playground,它有一个配置面板和实时预览,可以生成扩展语法border-radius

border-radius#的单位

注意,我们使用了一些不同的单位。%,px, 以及vw ,这是 "视口宽度 "的视口单位。

百分比值是相对于元素的大小而言的,这意味着如果元素被预期为各种尺寸的话,其可预测性较低。对于50% 这个例子,一旦元素不再是正方形,它就开始显得更加椭圆。

当你想得到不基于元素而基于也许是设计规格的一致结果时,绝对单位,如pxrem 是首选。

相对单位,如视口单位或em ,如果你想获得一致的结果,但也想获得一个比例的元素,那么就会有好处:

  • 视口单位将在 "桌面 "上计算得更大,在 "移动 "上计算得更小,但在圆形的外观上保持一致
  • em 将根据 ,导致字体较大的元素的圆角较多,字体较小的元素的圆角较少。font-size

box-shadow#的概述

就我个人而言,当它达到相当的支持度时,使box-shadow 最让我兴奋的事情是以一种更原始的方式从页面上弹出模型🙏。

有一段时间,它们对于我们所谓的 "骨骼形态设计 "是至关重要的。在过去的一年里,他们在 "新形态设计 "方面又有了新的发展。

这些术语对你来说是新的吗?这里有一个很好的概述,用UX Collective的例子对每一个术语进行了比较。

但是,我现在通常使用box-shadow ,只是在按钮或卡片等东西上微妙地暗示了一下高度。

/* offset-x | offset-y | blur-radius | spread-radius | color */
box-shadow: 3px 4px 5px 0px rgba(0, 0, 0, 0.38);

demo of basic box-shadow

省略blur-radiusspread-radius 是可以接受的,这将导致一个更清晰的阴影,因为失去了模糊性。阴影也不会延伸到偏移值之外,因为传播的目的是为了超越元素的尺寸。

在上面的例子中,我们基本上给了阴影一个 "光源",它在元素的左上方,而元素的右下方又 "投射 "了阴影。

相反,你可以把偏移量设置为0,以获得一个在元素周围相等的阴影,尽管至少需要blur-radius 。如果还提供了spread-radius ,这将对阴影施加比例,使其超出元素的尺寸。

box-shadow: 0 0 0.25em 0.25em rgba(0, 0, 0, 0.25);

no offset box-shadow

我喜欢用box-shadow ,在按钮上提供一个自定义的视觉:focus 状态。与border 不同,box-shadow 不会改变元素的计算尺寸,这意味着添加或删除它不会导致它或它周围的元素从回流中转移。请看关于按钮的那一集,看看这个方法。

box-shadow 的一个独特的功能是能够应用倍数。

box-shadow: 2px 4px 0 4px yellowgreen, 4px 8px 0 8px pink, 8px 10px 0 12px navy;

multiple box-shadow values

叠加顺序 "是这样的:第一组 "在上面",或者说在视觉上最接近元素,然后从那里往下。这就是为什么必须增加spread-radius ,否则 "较低 "的层将不可见(除了偏移量不重叠的地方)。

我们也可以通过增加inset 的值将box-shadow 翻到元素的内部

box-shadow: inset 0 0 12px 4px rgba(0, 0, 0, 0.8);

这些值将应用一个非常直白的 "嵌入 "阴影外观,元素看起来 "沉入 "了页面。

inset box-shadow

box-shadow 图片的黑客技术#

我喜欢使用inset 阴影的两种替代方法是用于图像。

关键在于堆叠的顺序,以及box-shadow 放在通过background-image 应用的图像之上

晕染

第一种是作为 "晕影",这是一种摄影技术,照片的边缘柔和地淡化到背景中。这有助于突出照片的主题,特别是如果主题位于中心位置。

然而,inset 属性不能直接用于<img/> ,因为它被认为是一个 "空 "元素,不是一个容器元素。

background-image 来代替,下面的CSS被应用到容器上:

.vignette-container {
  width: 30vmin;
  height: 30vmin;
  box-shadow: inset 0 0 4vmin 3vmin rgba(0, 0, 0, 0.5);
}

下面是一个比较,左边的图片应用了晕轮,右边的没有:

two images where left image has vignette applied

我们使用了vmin 单位,这样box-shadow 就可以相对于整个图片的大小进行缩放,而图片的大小也是在vmin 中设置的。这是由于box-shadow 无法使用百分比来设置,这使得相对于元素的数值设置有点困难。因此,黑客中的黑客是使用视口单位来设置元素的预期尺寸,以便在不同的视口尺寸下对box-shadow 有更可预测的结果。

图像颜色屏幕

当我在使用background-image ,但又希望有一个颜色 "屏幕 "时,我发现了这个技术--这意味着需要在图像上放置一个半透明的颜色填充。这是一个有用的技术,可以帮助捍卫任何放置在背景图像上的文本的对比度,也可以在其他不相关的一组图像中创造视觉一致性。

我以前的解决方案--使用了很多年--是在包含元素上的一个额外的绝对位置:before ,在那里应用屏幕颜色background-color

这是新的inset box-shadow 解决方案。

box-shadow: inset 0 0 0 100vmax rgba(102, 76, 202, 0.65);

左边是屏幕的对比,右边是没有屏幕的对比。

screen comparison images

你发现黑客了吗?我提到百分比是不允许的--但由于视口单位是允许的,我们把spread 设置为100vmax ,这可能会覆盖任何元素,除非你的元素大于视口最大宽度或最大高度的两倍

等一下--为什么是双倍?因为spread 是从元素的所有侧面创建的,所以它至少是vmax 的两倍。你可以通过使用上述值并将你的容器至少设置为width: 100vw; height: 100vh ,看看在什么时候容器的中间没有被覆盖,来测试一下。

如果你把它用于比英雄图像更多的东西,例如,只需根据需要增加,如增加到200vmax

如果有人知道这样做会影响性能,请告诉我。