css效果记录-渐变边框,内容是透明或者高斯模糊

原创文章
声明:作者声明此文章为原创,未经作者同意,请勿转载,若转载,务必注明本站出处,本平台保留追究侵权法律责任的权利。
全栈老韩
全栈工程师,擅长iOS App开发、前端(vue、react、nuxt、小程序&Taro)开发、Flutter、React Native、后端(midwayjs、golang、express、koa)开发、docker容器、seo优化等。

这篇文章用来记录我在开发中需要实现的一种css效果,效果是一个div,有渐变颜色的边框,但是中间内容区域是透明或者高斯模糊效果。作为记录,也可以供大家参考。

最终效果

首先我们来看看最后实现的效果图:
css gradient border with blur image

上面的效果,需要我们设置相关的css属性,所以我会将我尝试的效果思路列举一下,每一个尝试也是一种类似的css效果,也作为记录。

最终效果的实现,在最后一步。

尝试: 将background分为border box和padding-box

这种方式的思路就是一个div,可以将background分为border和padding的2种box,当然还有content box,那么针对每一个box可以设置颜色渐变。

效果是:
css gradient border

缺陷是padding-box不能设置为透明transparent,因为这种渐变是border包裹范围内background颜色渐变了,border-box包裹范围内的渐变像是盖在上面。所以如果padding-box是透明或者blur高斯模糊,那么就会漏出全部的border-box的渐变效果。

这种效果的测试代码是:

test_1.html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>test-1</title>
  </head>
  <body>
    <div class="gradient-border"></div>
  </body>
  <style>
    body {
      background: rgb(33, 213, 168);
    }
    .gradient-border {
      border-radius: 20px;
      border: 10px solid transparent; // border渐变,必须要设置border宽度和颜色transparent.

      width: 400px;
      height: 200px;

      background: linear-gradient(orange) padding-box,
        linear-gradient(blue, green) border-box;

      overflow: hidden;
      /* clip: rect(0px, 400px, 200px, 0px); */
    }
  </style>
</html>

所以这种方式,只能用在padding-box区域中,不显示底下内容的场景。

高斯模糊效果

这里简单实现一个高斯模糊效果,因为在我们的最终效果中,需要有高斯模糊,那么我们可以先看看如何实现高斯模糊效果,根据代码来发散思维。

高斯模糊效果是:
css blur effect image

测试代码是:

test_2.html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div class="background" id="divB">
      <!-- This is Div B -->
      <h1>This is Div B</h1>
    </div>

    <div class="overlay" id="divA">
      <!-- This is Div A -->
      <p>This is Div A content</p>
    </div>
  </body>
  <style>
    body {
      margin: 0;
      padding: 0;
      height: 100vh;
      overflow: hidden;
    }

    .background {
      position: absolute;
      width: 100%;
      height: 100%;
      background: url("https://picsum.photos/800/600") no-repeat center/cover; // 使用一个随机底图
      z-index: 0;
    }

    .overlay {
      position: absolute;
      top: 100px;
      left: 100px;
      width: 300px;
      height: 200px;
      padding: 20px;
      z-index: 1;

      border-radius: 15px;

      // 高斯模糊效果
      backdrop-filter: blur(10px);
      -webkit-backdrop-filter: blur(10px);

      color: white;
      border: 10px solid rgba(255, 255, 255, 0.3);
    }
  </style>
</html>

从这里面可以看到高斯模糊效果是backdrop-filter来决定的,所以之前的border-boxpadding-box尝试是无法应用到这种css属性设置。

那么可以考虑使用:before:after这2个伪标签,分别设置不同的渐变,当然这确实是可以的。

最终实现代码

test.html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div class="background" id="divB">
      <!-- This is Div B -->
      <h1>This is Div B</h1>
    </div>

    <div class="glass-border" id="divA">
      <!-- This is Div A -->
      <p>This is Div A content</p>
    </div>
  </body>
  <style>
    body {
      margin: 0;
      padding: 0;
      height: 100vh;
      overflow: hidden;
    }

    .background {
      position: absolute;
      width: 100%;
      height: 100%;
      background: url("https://picsum.photos/800/600") no-repeat center/cover; // 也用一个随机图做底色
      z-index: 0;
    }

    .glass-border {
      position: absolute;
      top: 100px;
      left: 100px;
      width: 300px;
      height: 200px;
      padding: 20px;
      z-index: 1;

      background: transparent;

      color: white;

      border-radius: 15px;
      position: relative;
    }

    .glass-border::before { // border渐变色的处理
      content: "";
      position: absolute;
      top: -2px; // 内容是2px的border宽度
      left: -2px;
      right: -2px;
      bottom: -2px;
      z-index: -1; // 中间层
      border-radius: inherit;
      padding: 2px;

      background: linear-gradient(135deg, #ff00cc, #3333ff); // 作为border的渐变颜色
      mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); // 使用mask将叠加效果的中间部分给透明掉
      -webkit-mask: linear-gradient(#fff 0 0) content-box,
        linear-gradient(#fff 0 0);
      mask-composite: exclude;
      -webkit-mask-composite: destination-out;
    }

    .glass-border::after { // 高斯模糊的处理
      content: "";
      position: absolute;
      top: 0; // 直接是div A的区域设置为高斯模糊
      left: 0;
      right: 0;
      bottom: 0;
      border-radius: inherit;
      backdrop-filter: blur(10px);
      -webkit-backdrop-filter: blur(10px);
      z-index: -2; // 层级置于底部
    }
  </style>
</html>

用于记录,也希望对大家有帮助。

评论列表
全栈老韩·
大家切记这里的要点: 1. glass-border的z-index为1; 2. glass-border::before的z-index为-1; 3. glass-border::after的z-index为-2;