发布于 2026-01-06 2 阅读
0

使用 CSS 创建玻璃(3 种方法和样式)DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

使用 CSS 创建玻璃效果(3 种方法和样式)

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

人类朋友们,你们好!

在本文中,我将演示三种使用 CSS 创建玻璃效果的方法。先简单介绍一下背景:我多年来一直在创建玻璃风格的网站,因为我个人非常喜欢这种风格,但它似乎直到最近才在现代网络上流行起来。看起来每个人都想赶上这股潮流,所以我想……何乐而不为呢?

屏幕截图显示了这 3 种方法

在 CSS 中创建玻璃效果,我通常使用两种主要方法,稍后我会演示。不过,还有第三种方法,你可能之前没有考虑过。使用这种方法,你可以为玻璃效果添加一些“光泽”,尤其是在与其他两种方法结合使用时。

遗憾的是,第三种方法存在一些问题,稍后我会解释。

关于在设计中使用玻璃材质的一点说明:

“玻璃”效果,或者至少是模拟玻璃效果的效果,非常时尚且赏心悦目,但只有搭配合适的背景才能发挥其作用。模拟“玻璃”效果需要运用对比,这有利于提高可视性,但如果您不了解自己在做什么,或者考虑不周,就很容易出错。

也就是说,至少在我看来,“玻璃”图案与对比鲜明的渐变色、纯色深色背景(阴影外凸)、浅色背景(阴影内凹)以及照片搭配使用时,效果往往最佳:

这是我公司主页的截图,展示了各种玻璃风格的照片。

现在让我们进入有趣的部分——编码。

本教程中所有示例均采用以下样式:

按照我的惯例,我不喜欢写一篇使用自定义视觉效果却不解释我是如何做的教程,所以这里简单介绍一下。

我有3个元素divs,它们的样式属性都相同:


div {
  align-items: center;
  background-color: rgba(35, 35, 35, 0.1);
  border: 1px solid rgba(235, 235, 235, 0.1);
  border-radius: 15px;
  color: white;
  display: flex;
  font-size: clamp(12px, 3vw, 2rem);
  font-weight: 300;
  letter-spacing: .375ch;
  justify-content: center;
  height: 27.35vh;
  margin: auto;
  position: relative;
  text-transform: uppercase;
  width: 27.35vw;
}
Enter fullscreen mode Exit fullscreen mode

它们都使用 Flexbox 布局在文档主体中,body 元素的高度设置为100vh(view-height),背景图像使用线性渐变:

body {
  align-items: center;
  background-image: linear-gradient(rgb(105, 35, 135), rgb(75, 35, 95), rgb(35, 48, 135));
  background-attachment: fixed;
  background-size: cover;
  display: flex;
  justify-content: space-around;
  margin: 0;
  padding: 0;
  height: 100vh;
}
Enter fullscreen mode Exit fullscreen mode

方法一:使用“box-shadow:”和“background-color:”

第一种方法运行的屏幕截图

.glass0 {
  box-shadow: inset 0 0 15px rgba(135, 135, 135, .1), 0 0 18px 3px rgba(0, 0, 0, .3);
}
Enter fullscreen mode Exit fullscreen mode

这是最直接的方法,你可能已经见过很多次了。它的结构很简单,但如果与合适的审美相结合,效果却出奇地好:

这是我的网站截图,该网站大量使用了方法 1。

你可以通过省略第一个阴影(带内嵌效果)来获得“透明玻璃”效果,也可以通过调整阴影样式来获得不同的效果。无论哪种方法,它都快速简便,并且能带来不错的效果。

方法二——使用伪元素filter: blur()

这种方法虽然用途广泛,但如果过度使用,确实会带来性能问题。在这种情况下,我们的做法是将一个伪元素(::after::before)放置在主元素(本身也可以设置为类似玻璃的样式)后面。

方法二的屏幕截图

代码:

.glass1 {
  box-shadow: 0 0 18px 3px rgba(0, 0, 0, .3);
}

.glass1::after {
  background-color: rgba(195, 195, 195, .1);
  bottom: 10px;
  content: '';
  filter: blur(32px);
  left: 10px;
  opacity: .5;
  position: absolute;
  right: 10px;
  top: 10px;
  z-index: -1;
}
Enter fullscreen mode Exit fullscreen mode

注: 我写了一篇更详细的指南(解释了这种方法的原理),链接如下:https://dev.to/rolandixor/achieving-backdrop-blur-without-backdrop-filter-16ii


真实案例:玻璃制造商

这是 Glass Maker 网站的截图,Glass Maker 是我创建的一个框架,用于向任何网站添加玻璃效果。

方法三——模拟光泽

这种方法在实现上最为复杂。除非你天生数学好,否则需要反复测试才能掌握。它的效果很棒,响应也很快,但如果你使用百分比或屏幕尺寸来确定位置,可能需要一些帮助。

方法三的截图

代码:

.glass2 {
  box-shadow: 0 0 18px 3px rgba(0, 0, 0, .3);
}

.glass2::after {
  background-color: rgba(255, 255, 255, .6);
  bottom: 49.65%;
  content: '';
  filter: blur(8px);
  left: .865%;
  position: absolute;
  right: .865%;
  top: 49.65%;
  transform: rotate(-45deg) skewX(20deg);
  z-index: -1;
}
Enter fullscreen mode Exit fullscreen mode

我还没在实际应用中使用过这种方法,但它的效果应该相当不错。不过,根据你想要达到的效果,你可能需要稍微调整一下。


请注意:本教程中
没有使用* backdrop-filter: blur();。虽然它很酷,也能产生令人兴奋的效果,但在撰写本文时,Firefox 尚不支持它。在 Safari 和其他基于 Webkit 内核的浏览器中,它仍然只能通过前缀来使用。我在这里使用的方法应该适用于所有现代浏览器。


今天就到这里!

你会注意到第三种方法需要一些调整才能正确扩展,但别担心,我将来可能会修复它。

您可以在 CodePen 上找到此示例的代码,链接如下:https://codepen.io/rolandixor/pen/dyRBOxO

你可以在评论区分享你的结果,我很期待看到你的发现!

文章来源:https://dev.to/rolandixor/creating-glass-with-css-3-methods-styles-2kdm