美文网首页
使用CSS滤镜属性filter实现电影、模糊及融合效果

使用CSS滤镜属性filter实现电影、模糊及融合效果

作者: 酷酷的凯先生 | 来源:发表于2022-08-08 15:14 被阅读0次

前言

在处理图片时,若想让一张图像呈现各种不同的视觉效果,可使用CSS中的filter属性,可为元素指定各种滤镜效果,比如模糊、灰度、明暗度、颜色偏移等。

CSS filter的基础使用非常简单可参照官网,也可以通过指定这些函数的值来实现想要的效果,如下:

/*使用单个滤镜  */
filter: blur(5px);  // 高斯模糊
filter: brightness(0.4);  // 变得明亮,值为 0% 将创建全黑图像
filter: contrast(200%);  // 图像的对比度,值是 0% 的话,图像会全黑
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: contrast(175%) brightness(3%);

/* 不使用滤镜 */
filter: none;

模糊效果

假定情景:有三张默认全部清晰显示的图片,鼠标hover时,其余两张模糊,当前的清晰显示,实现如下:

1659927608986.png
html 代码

<div>
    <p> <span>这是第一张</span>  </p>
    <p> <span>这是第二张</span> </p>
    <p> <span>这是第三张</span> </p>
</div>

css 代码

div {
    display: flex;
    width: 660px;
    margin: 100px auto;
    padding: 30px 30px 20px;
    justify-content: space-between;
    background: #f2f2f2;
    p {
        position: relative;
        height: 180px;
        width: 180px;
        span {
            position: absolute;
            left: 52px;
            bottom: 30px;
            font-weight: 700;
            z-index: 1;
        }
    }
}

实现思路:是将背景加在p元素的伪类上,当元素不是焦点时,为该元素的伪类加上滤镜

div {
    display: flex;
    width: 660px;
    margin: 100px auto;
    padding: 30px 30px 20px;
    justify-content: space-between;
    background: #f2f2f2;
    p {
        position: relative;
        height: 180px;
        width: 180px;
        span {
            position: absolute;
            left: 52px;
            bottom: 30px;
            font-weight: 700;
            z-index: 1;
        }
        &::before {
            z-index: 1;
            content: "";
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            border-radius: 20px;
            filter: blur(0px) opacity(1);
            transition: filter 200ms linear, transform 200ms linear;
            background: url(./assets/logo.png);
            background-size: 100% 100%;
        }
    }
}

注意:这里不能将滤镜直接加在p元素上而是其伪类上。因为父元素加了滤镜,它的子元素都会一起由该滤镜改变,会导致上面的文字也变模糊。

增加hover模糊效果:通过css选择器选出非hoverp元素,给其伪类添加模糊、透明度和明暗度的滤镜

div {
    display: flex;
    width: 660px;
    margin: 100px auto;
    padding: 30px 30px 20px;
    justify-content: space-between;
    background: #f2f2f2;
    p {
        position: relative;
        height: 180px;
        width: 180px;
        span {
            position: absolute;
            left: 52px;
            bottom: 30px;
            font-weight: 700;
            z-index: 1;
        }
        &::before {
            z-index: 1;
            content: "";
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            border-radius: 20px;
            filter: blur(0px) opacity(1);
            transition: filter 200ms linear, transform 200ms linear;
            background: url(./assets/logo.png);
            background-size: 100% 100%;
        }
        &:hover:before {
            filter: saturate(1.2);
            transform: scale(1.05);
        }
    }
    &:hover > p:not(:hover):before {
        filter: blur(5px) opacity(0.6) brightness(0.8);
    }
}

效果如下:

1659929463168.png

褪色效果

实现思路:通过sepia滤镜将图像基调转换为深褐色,再通过降低 饱和度saturate和 色相旋转hue-rotate微调,模拟老照片的效果,代码如下:

p {
    position: relative;
    height: 180px;
    width: 180px;
    filter: sepia(30%) saturate(40%) hue-rotate(5deg);
    transition: transform 0.5s;
    span {
        position: absolute;
        left: 52px;
        bottom: 30px;
        font-weight: 700;
        z-index: 1;
    }
    &::before {
        z-index: 1;
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        border-radius: 20px;
        filter: blur(0px) opacity(1);
        transition: filter 200ms linear, transform 200ms linear;
        background: url(./assets/logo.png);
        background-size: 100% 100%;
    }
    
    &:hover {
        filter: none;
        transform: scale(1.2) translateX(10px);
        z-index: 1;
    }
}

灰度效果

grayscale() 函数将改变输入图像灰度。amount 的值定义了转换的比例。值为 100% 则完全转为灰度图像,值为 0% 图像无变化。值在 0%100% 之间,则是效果的线性乘数。若未设置值,默认是 0

实现思路:在html上加上filter: grayscale(100%)如下:

html{
    filter: grayscale(100%);
}
1659930673466.png

电影效果

brightness()函数将线性乘法器应用于输入图像,使其看起来或多或少地变得明亮。值为 0% 将创建全黑图像。值为 100% 会使输入保持不变。其他值是效果的线性乘数。如果值大于 100% 提供更明亮的结果。若没有设置值,默认为 1

实现思路:通过调整背景图的明暗度文字的透明度来模拟电影谢幕的效果,代码如下:

html 代码
<div>
    <div class="box"></div>
    <div class="text">
        <p> <span>这是第一张</span> </p>
        <p> <span>这是第二张</span> </p>
        <p> <span>这是第三张</span> </p>
    </div>
</div>

css 代码

div {
    width: 660px;
    height: 200px;
    margin: 100px auto;
    background: blue;
    position: relative;
    .box {
        position: absolute;
        width: 100%;
        height: 100%;
        animation: fade-away 2.5s linear forwards; //forwards当动画完成后,保持最后一帧的状态
    }
    .text {
        position: absolute;
        line-height: 55px;
        color: #fff;
        font-size: 36px;
        text-align: center;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        opacity: 0;
        animation: show 2s cubic-bezier(0.74, -0.1, 0.86, 0.83) forwards; // 用到了贝赛尔曲线
    }
    @keyframes fade-away {
        30% {
            filter: brightness(1);
        }
        100% {
            filter: brightness(0);
        }
    }
    @keyframes show {
        20% {
            opacity: 0;
        }
        100% {
            opacity: 1;
        }
    }
}

融合效果

实现思路:需要用到的滤镜是blurcontrast

html  代码

 <div>
    <div class="box1"> </div>
    <div class="box2"> </div>
</div>

css 代码

div {
    margin: 50px auto;
    height: 140px;
    width: 400px;
    background: #fff; //给融合元素的父元素设置背景色
    display: flex;
    align-items: center;
    justify-content: center;
    filter: contrast(30); //给融合元素的父元素设置contrast
    div {
        border-radius: 50%;
        position: absolute;
        filter: blur(10px); //给融合元素设置 blur => 高斯模糊
    }
    .box1 {
        height: 90px;
        width: 90px;
        background: #03a9f4;
        transform: translate(-50px);
        animation: 2s moving linear infinite alternate-reverse;
    }

    .box2 {
        height: 60px;
        width: 60px;
        background: #0000ff;
        transform: translate(50px);
        animation: 2s moving linear infinite alternate;
    }

    @keyframes moving {
        0% {
            transform: translate(50px);
        }
        100% {
            transform: translate(-50px);
        }
    }
}

友情提示:blur设置图像的模糊程度,contrast设置图像的对比度。当两者像上面那样组合时,就会产生神奇的融合效果

  1. contrast滤镜应用在融合元素的父元素上,且父元素必须设置background
  2. blur滤镜应用在融合的子元素上

加载动画

在上述的基础上还可以实现loading动画,如下:

html 代码

<div class="container">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
</div>

.container {
    margin: 10px auto;
    height: 140px;
    width: 300px;
    background: #fff; //父元素设置背景色
    display: flex;
    align-items: center;
    filter: contrast(30); //父元素设置contrast

    .box {
        height: 50px;
        width: 60px;
        background: #e00606;
        border-radius: 50%;
        position: absolute;
        filter: blur(20px);  
        transform: scale(0.1);
        transform-origin: left top;
    }

    .box {
        animation: move 4s cubic-bezier(0.44, 0.79, 0.83, 0.96) infinite;
    }
    .box:nth-child(2) {
        animation-delay: 0.4s;
    }
    .box:nth-child(3) {
        animation-delay: 0.8s;
    }
    .box:nth-child(4) {
        animation-delay: 1.2s;
    }
    .box:nth-child(5) {
        animation-delay: 1.6s;
    }

    @keyframes move {
        0% {
            transform: translateX(10px) scale(0.3);
        }
        45% {
            transform: translateX(135px) scale(0.8);
        }
        85% {
            transform: translateX(270px) scale(0.1);
        }
    }
}

本人理解的还比较粗浅,希望大神指点一二~~

相关文章

网友评论

      本文标题:使用CSS滤镜属性filter实现电影、模糊及融合效果

      本文链接:https://www.haomeiwen.com/subject/grlwwrtx.html