Code前端首页关于Code前端联系我们

CSS滤镜的神奇用途:网站变灰、元素高亮、高亮、磨砂玻璃效果

terry 2年前 (2023-09-27) 阅读数 64 #数据结构与算法

基本概念

CSS滤镜属性将模糊或色移等图形效果应用于元素来创建滤镜。滤镜通常用于修改图像渲染、背景和边框。它的值可以是 filter function 或使用 url 添加 svg 过滤器

filter: <filter-function> [<filter-function>]* | none
filter: url(file.svg#filter-element-id)

可以使用具有属性 filterbackgroundfilter。其数据类型由以下过滤器函数之一确定。每个函数都需要一个参数。如果该参数无效,则过滤器不会生效。下面解释一下滤镜函数的含义:

  • blur():使图像模糊
  • bright():使图像变亮或变暗'
  • :增大或减小图像的对比度
  • drop-shadow( ):在图像后面应用投影
  • grayscale():将图像转换为灰度ate ()
:更改整体图像的色调

  • invert():反转图像的颜色
  • opacity():更改图像的透明度)‷) :输入的过饱和或去饱和图像
  • sepia():将图像转换为棕褐色
  • 使用示例

    /* 使用SVG filter */
    filter: url("filters.svg#filter-id");
    /* 使用filter函数 */
    filter: blur(5px);
    filter: brightness(0.4);
    filter: contrast(200%);
    filter: drop-shadow(16px 16px 20px blue);
    filter: grayscale(50%);
    filter: hue-rotate(90deg);
    filter: invert(75%);
    filter: opacity(25%);
    filter: saturate(30%);
    filter: sepia(60%);
    /* 多个filter */
    filter: contrast(175%) brightness(3%);
    /* 不使用filter */
    filter: none;
    /* 全局变量 */
    filter: inherit;
    filter: initial;
    filter: unset;

    CSS filter 神奇用途:网页置灰、元素强调、高亮、毛玻璃效果

    案例应用

    一般更智能的阴影效果 使用 box-shadow 属性做到了使用语法 box-shadow(x offset, y offset, Blursize, Shadowsize, colorvalue, inset) 可以轻松为元素添加阴影效果,但是 box-shadow 也有一个缺点:为透明图像添加阴影效果时,无法穿透元素,只能添加到透明图像元素的盒模型中。 。目前filter属性的drop-shadow方法可以很好的解决这个问题。它添加的阴影可以渗透到元素中,而不是将其添加到元素盒模型的边界。优越的。使用

    drop-shadow 添加的阴影与 box-shadow 相同,只不过它可以穿透透明元素。如果您的浏览器支持硬件加速,请使用滤镜添加的阴影效果会更加真实。

    drop-shadow的语法如下(除了不支持设置inset,其余与❙完全相同):❙›

    filter: drop-shadow(x偏移, y偏移, 模糊大小, 色值);

    例如: 下图是分别使用 box-shadowfilter: drop Shadow 与透明元素的比较。 ,网站灰显

    将会发生重大灾难或事故 在其他哀悼日,国企和政府机构的网站经常会收到要求将其所有页面灰显的请求。或者许多网页都有一种样式效果,当鼠标悬停在灰色元素上时,会改变鼠标悬停的颜色。此时,可以使用filter属性的grayscale方法来实现。可以通过设置filter:graylevel(100%)页面元素来调整元素灰度。页面元素可能会变灰。以下示例中,标签 body h1img 和 是标签,未添加 之前的样式是如下所示。

    <body>
      <h1 class="title">FUTURAMA</h1>
      <img class="img" width="500"  />
    </body>

    CSS filter 神奇用途:网页置灰、元素强调、高亮、毛玻璃效果

    现在我们将类.gray添加到元素body可以页面。

    .gray {
      filter: grayscale(100%);
    }

    CSS filter 神奇用途:网页置灰、元素强调、高亮、毛玻璃效果

    为了兼容IE8等其他低版本浏览器,我们可以添加浏览器前缀和过滤器svg

    .gray {
      -webkit-filter: grayscale(1);
      -webkit-filter: grayscale(100%);
      -moz-filter: grayscale(100%);
      -ms-filter: grayscale(100%);
      -o-filter: grayscale(100%);
      filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
      filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
      filter: grayscale(100%);
    }

    在处理紧急需要将网站灰化时,往往需要在上线一定时间后删除此功能。第一次上线时,我们还可以添加下面类似的方法来控制灰度效果的自动上线和下线时间。这样,当到达预定时间时,它可以自动删除,从而无需经历两次构建过程。 ?

    (function setGray() {
      var endTime = Date.parse("Apr 06 2077 00:00:01");
      var timestamp = Date.parse(new Date());
      if (timestamp <= endTime) {
        document.querySelector('html').classList.add('gray');
      }
    })();

    高亮和元素高亮

    亮度实现元素高亮效果的方法,可以用在菜单栏、光标当前所在的图像列表 ,或选定的内容。以下是两种将 亮度饱和度 添加到一组按钮菜单面板以通过更改亮度和饱和度来突出显示元素的方法。

    CSS filter 神奇用途:网页置灰、元素强调、高亮、毛玻璃效果

    <div class="container">
      <a class="button">?</a>
      <a class="button">?</a>
      <a class="button">?</a>
      <a class="button dark">?</a>
      <a class="button dark">?</a>
      <a class="button dark">?</a>
      <a class="button disabled">?</a>
      <a class="button disabled">?</a>
      <a class="button disabled">?</a>
    </div>
    .container {
      margin: 40px;
    }
    .button {
      padding: 0.5em 0.5em;
      background: #E0E0E0;
      border-radius: 3px;
    }
    .button.dark {
      background: #333;
    }
    .button:hover:not(.disabled) {
      cursor: pointer;
      border-radius: 3px;
      filter: brightness(110%) saturate(140%);
    }
    .button.disabled {
      filter: grayscale(100%);
    }

    磨砂玻璃效果

    磨砂玻璃效果(磨砂玻璃效果),顾名思义,就是类似于半透明磨砂玻璃的效果。可在iOSWindows 10等系统中广泛使用UI《CSS揭秘》等作品中也有系统的讲解。下面总结了分别使用 filter:blurbackgroundfilter:blur 实现此效果的两种方法。

    有两个元素div具有相同的类名glass,并且它们添加了两个类-❀by❀by glass -by-backdrop -过滤器

    来区分这两种方法。

    <div class="glass glass-by-filter"></div>
    <div class="glass glass-by-backdrop-filter"></div>

    磨砂玻璃元素的通用样式、尺寸设置、圆角等基本样式:

    .glass {
      height: 300px;
      width: 300px;
      border: 1px groove #EFEFEF;
      border-radius: 12px;
      background: rgba(242, 242, 242, 0.5);
      box-shadow: 0 0.3px 0.7px rgba(0, 0, 0, 0.126),
        0 0.9px 1.7px rgba(0, 0, 0, 0.179), 0 1.8px 3.5px rgba(0, 0, 0, 0.224),
        0 3.7px 7.3px rgba(0, 0, 0, 0.277), 0 10px 20px rgba(0, 0, 0, 0.4);
    }

    滤镜:blur法,会在设置中添加一个伪元素::beforeblur方法并放置在底层,以达到毛玻璃效果。

    .glass-by-filter {
      z-index: 1;
      box-sizing: border-box;
      position: relative;
    }
    .glass-by-filter::before {
      content: "";
      position: absolute;
      top: 0; right: 0; bottom: 0; left: 0;
      z-index: -1;
      background: inherit;
      filter: blur(10px);
    }

    背景滤镜:blurblur直接添加到元素上,以实现毛玻璃效果。

    .glass-by-backdrop-filter {
      backdrop-filter: blur(10px);
    }

    的效果如下图所示(左:filter,右:backgroundfilter): :玻璃边框扩展:https: /css-tricks .com/blur重新…
    CSS filter 神奇用途:网页置灰、元素强调、高亮、毛玻璃效果

    艺术照!即使是简单版的insatagram

    复古,版画、油画、漫画、液化、老照片、性冷淡、莫兰迪、赛博朋克、旺达幻视风格都可以实现!

    通过组合滤镜的所有方法,您可以创建任何您想要的效果。下面是一个简单的方法设置器filter,可以调整每种方法的值,并实时显示图像滤镜效果。如下所示。

    CSS filter 神奇用途:网页置灰、元素强调、高亮、毛玻璃效果

    页面主要代码如下。控制区域#imageEditor是表单表单。表单的每一行控制过滤方法的值。显示区域#imageContainer内部包含一个元素img,该元素受生成的滤镜filter

    <form id="imageEditor">
      <p>
        <label for="gs">Grayscale</label>
        <input id="gs" name="gs" type="range" min="0" max="100" value="0">
      </p>
      <p>
        <label for="blur">Blur</label>
        <input id="blur" name="blur" type="range" min="0" max="10" value="0">
      </p>
      <p>
        <label for="br">Exposure</label>
        <input id="br" name="br" type="range" min="0" max="200" value="100">
      </p>
      <p>
        <label for="ct">Contrast</label>
        <input id="ct" name="ct" type="range" min="0" max="200" value="100">
      </p>
      <p>
        <label for="huer">Hue Rotate</label>
        <input id="huer" name="huer" type="range" min="0" max="360" value="0">
      </p>
      <p>
        <label for="opacity">Opacity</label>
        <input id="opacity" name="opacity" type="range" min="0" max="100" value="100">
      </p>
      <p>
        <label for="invert">Invert</label>
        <input id="invert" name="invert" type="range" min="0" max="100" value="0">
      </p>
      <p>
        <label for="saturate">Saturate</label>
        <input id="saturate" name="saturate" type="range" min="0" max="500" value="100">
      </p>
      <p>
        <label for="sepia">Sepia</label>
        <input id="sepia" name="sepia" type="range" min="0" max="100" value="0">
      </p>
      <input type="reset" form="imageEditor" id="reset" value="Reset" />
    </form>
    <div id="imageContainer" class="center">
      <img >
    </div>
    function editImage() {
      var gs = $("#gs").val();                // grayscale
      var blur = $("#blur").val();            // blur
      var br = $("#br").val();                // brightness
      var ct = $("#ct").val();                // contrast
      var huer = $("#huer").val();            // hue-rotate
      var opacity = $("#opacity").val();      // opacity
      var invert = $("#invert").val();        // invert
      var saturate = $("#saturate").val();    // saturate
      var sepia = $("#sepia").val();          // sepia
      $("#imageContainer img").css(
        "filter", 'grayscale(' + gs+
        '%) blur(' + blur +
        'px) brightness(' + br +
        '%) contrast(' + ct +
        '%) hue-rotate(' + huer +
        'deg) opacity(' + opacity +
        '%) invert(' + invert +
        '%) saturate(' + saturate +
        '%) sepia(' + sepia + '%)'
      );
      $("#imageContainer img").css(
        "-webkit-filter", 'grayscale(' + gs+
        '%) blur(' + blur +
        'px) brightness(' + br +
        '%) contrast(' + ct +
        '%) hue-rotate(' + huer +
        'deg) opacity(' + opacity +
        '%) invert(' + invert +
        '%) saturate(' + saturate +
        '%) sepia(' + sepia + '%)'
      );
    }
    // 当input值发生变化时即时应用滤镜
    $("input[type=range]").change(editImage).mousemove(editImage);

    影响,现在我们只实现实时过滤器预览。未来将实现的功能包括支持复杂的svg滤镜模板、导出和下载等。完成这些步骤后,您将不再需要下载额外的滤镜来为照片中的照片添加滤镜。未来。 APP?。完整版示例代码:https://codepen.io/dragonir/p... 点击预览

    节省空间,加快网站加载速度

    实践证明,同一图像会降低亮度、对比度和饱和度。与原图相比,缩小后的体积可以减少很大一部分体积空间2M。缩小并保存图像后,可压缩至约1M。在网页上,我们可以使用被弱化的图片,然后通过CSS过滤器恢复它们。这样就可以达到压缩资源量、提高网站加载速度、改善用户体验的目的。

    具体操作请阅读以下说明:

    对比度交换技术:使用 CSS 滤镜 提高图像性能 https://css-tricks.com/contra... ⓙ 兼容性

    从查询caniuse的结果可以看出,属性css过滤器在现代浏览器中已经得到很好的支持,除了IE♾之外。可以在大多数其他浏览器中正常使用,并且如果需要可以在浏览器中添加核心前缀。不过,官网上也针对该问题给出了以下三个提示。相信后续的浏览器升级会逐渐修复这些问题:

    • 在 Safari 中,如果子元素有动画效果,则不会应用滤镜。
    • 目前,没有浏览器支持 spread-radius 过滤器的 drop-shadow 方法。
    • Edge 浏览器中,如果元素或子元素设置为 负 z 索引,则无法使用过滤器。

    CSS filter 神奇用途:网页置灰、元素强调、高亮、毛玻璃效果

    总结

    本文简单列出了一些常用的使用 CSS 滤镜 的页面效果。事实上,每个内置方法filter都有无限的可能性。高级应用如invert反色效果悬停以及调整网站的棕色值❀epi护眼等。如果你发挥想象力和创造力,filter可以很好地应用到实践中。

    以下示例是很好的应用。如果有兴趣,可以扩展阅读和学习:

    • 冰冻玻璃效果 https://codepen.io/KazuyoshiG... 点击预览
    • 破碎玻璃效果 https://codepen.io /bajjy/pen/...点击预览
    • 使用滤镜实现的转场效果 https://codepen.io/nxworld/de...
    • 反转按钮 https://codepen.io/monkey - com...点击预览
    • 老照片https://codepen.io/dudleystor...点击预览
    • 高级滤镜编辑器:https://codepen.io/stou / p...点击预览

    最后附上复古莫兰迪冷油画效果滤镜,是使用图中上面的滤镜编辑器编辑的。 (哇,太哇了,CSS爵爵子yyds?))文章地址:https://segmentfault1.com/a

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门