175 6191 5976

添加官方微信

领创时代关于网站建设、青岛画册设计、青岛网站设计的观点和相关新闻 将我们的想法与焦点与你共享

网站中如何使用CSS添加SVG过滤器

2019-05-09 来源:小领

SVG已经出现多年但网站设计师仍然在不断探索其新的用法。在本文中,重点将放在通过SVG应用的过滤器上,但不是将它们应用于SVG图像,我们将向您展示如何将它们应用于任何常规页面内容。

过滤器应用于SVG的方式实际上是通过CSS,告诉它过滤器具有什么ID。例如,使用相同的想法,过滤器可以应用于常规文本。关于这一点的好处在于,您可以为文本添加一些出色的图形外观,这在以前只能通过应用大量Photoshop滤镜并保存为图像才能实现。使用SVG过滤器,文本仍然可访问和可选,因为它仍然只是页面上的常规文本元素。 

这里的代码将为文本创建一个置换贴图,该贴图还包含一个alpha贴图,使其看起来像水,并符合页面的主题。然后将创建另一个过滤器,使菜单显示为水斑点,它们稍微粘在一起,但随着它们向远处移动而分开。同样,这与此特定页面的主题保持一致,并显示了将SVG过滤器应用于其他内容的两种创造性方法。

有兴趣了解有关SVG的更多信息?请查看我们关于您在网络上需要了解的有关SVG的所有内容的文章。或者,使用其中一个很酷的CSS动画示例为您的网站添加一些兴趣。


首先,您需要使用上面的链接下载项目文件。完成后,将start project文件夹拖到代码IDE上,然后打开index.html页面。您将看到已经编写了一些页面内容。需要创建标题部分,这将包含受SVG过滤器影响的标题。在这里添加代码,就在body标签内。

<div class="bg">
        <div class="middle">
            <h2 class="headline">Underwater 
            Adventure Park</h2>
            <div class="intro_block">

现在标题已完成,所有文本都已就绪。如果您此刻在浏览器中查看您的页面,您将看到一个带有一些文本的水图像。标题仍然是当前没有样式的,它将被设计为并应用了SVG过滤器。

<h3 class="subhead">Experience the Ocean 
<br>Like Never Before</h3>
                <p class="intro">Underwater 
                Adventure Park is an experience 
                unlinke anything you have ever 
                had. Travel to the depths of 
                the Ocean and walk among the 
                Sea Life!</p>
            </div>
        </div>
    </div>
SVG代码可以添加到页面的任何位置,但是因为它不会被看到,所以最好将它放在关闭body标签之前的底部。SVG滤波器产生湍流噪声。请注意,过滤器具有ID - 这使CSS能够将其应用于页面上的另一个元素。

<svg xmlns="http://www.w3.org/2000/svg">
        <filter id="displacementFilter">
            <feTurbulence type="turbulence" 
            baseFrequency="0.004" numOctaves=
            "2" result="turbulence" />
        </filter>
</svg>
现在转到page.css文件,最重要的是页面其余部分的CSS代码将是我们的新CSS所在的位置。这里SVG设置为根本不显示在页面上。标题2标记设置为应用了正确的字体。

svg {
    display: none;
}
h2 {
    font-size: 5.5vw;
    font-family: 'Crete Round', serif;
}
该行高设置为零,因为后来的标题将动画,所以有在其网页上缩放控制是非常重要的。它也给了一些填充,使其周围有适量的空间,颜色也会改变。

.headline {
    line-height: 0;
    display: inline-block;
    padding: 70px;
    color: #ccffff;


在完成标题类时,下一行将SVG中的displacementFilter ID 应用于文本。该translate3d确保文本变成硬件加速。比例稍微改变,以确保当应用位移时,它看起来是正确的。

    filter: url(#displacementFilter);
    transform: translate3d(0, 0, 0);
    transform: scaleY(1.8) rotateY(-2deg);
}


如果在此阶段测试过滤器,则湍流会完全取代文本。这很容易解决。返回index.html页面中的过滤器代码。这将采用湍流和源图形(即文本),并将其应用为位移滤波器。尝试改变湍流中的基频和八度音阶数。

<feDisplacementMap in2="turbulence" in="
SourceGraphic" scale="30" xChannelSelector="R" 
yChannelSelector="G" result="disp" />


水边效果的边缘看起来有点刺耳。这可以用高斯模糊来治愈。在置换贴图后添加代码。当您刷新页面时,它确实模糊了文本,但位移消失了。同样,这些元素可以在创建效果的途中修复。


<feGaussianBlur in="SourceGraphic" 
stdDeviation="15" result="blr" />


在先前的高斯模糊下方添加复合线。您将看到它将模糊和位移结合在一起,并且还为文本创建了水润的半透明效果。它已经在某种程度上软化边缘,但还不够。如果原始模糊可以加入到这里会很好。

<feComposite in="blr" in2="disp" operator="in" result="comp" />

使用CSS添加SVG过滤器:合并模糊

通过合并操作,它看起来会更好

合并操作使复合的最终结果与模糊效果合并。现在看起来它适合背景图像,似乎适合穿过水面的光线。关于文本的最好的部分是它仍然是可选择的和页面的一部分,不像你在Photoshop中创建它。

<feMerge result="final">
                <feMergeNode in="blr" />
                <feMergeNode in="comp" />
            </feMerge>

返回page.css文件并添加关键帧,如下所示。这只会将字体大小从零垂直宽度扩展到5.5垂直宽度。在开始时,这将应用于标题,以便文本在屏幕上放大并放置到位。随着文本的移动,位移也会随着长度的变化而变化,产生水样的波纹。

@keyframes scaler {
    from {
        font-size: 0vw;
    }
    to {
        font-size: 5.5vw;
    }
}


该H2以前在步骤4中添加的风格与这个新的代码,这增加了CSS动画4秒的标题替换该代码。动画停止并保留在最后一个关键帧上。保存并在浏览器中测试它以查看文本到位。

h2 {
    line-height: 0;
    font-size: 0vw;
    animation-name: scaler;
    animation-duration: 4s;
    animation-fill-mode: forwards;
    font-family: 'Crete Round', serif;
}

现在让我们使用另一个SVG滤镜创建一个合适的水斑动画。将以下导航内容添加到正文代码的最顶部,在本教程第一步中开始的标题之前。这将创建一个圆圈汉堡菜单的基础知识。

<nav class="menu">
        <input type="checkbox" href="#" class=
        "menu-open" name="menu-open" id="menu-
        open" />
        <label class="menu-open-button" 
        for="menu-open">
            <span class="hamburger 
            hamburger-1"></span>
            <span class="hamburger 
            hamburger-2"></span>
            <span class="hamburger 
            hamburger-3"></span>
        </label>

现在可以添加其余的导航元素。这也使用Font Awesome开源图标库,该库已被添加到head部分以从该库的CDN链接。每个菜单圆形元素都有一个图标。

<a href="#" class="menu-item"> <i class="fa 
fa-car"></i> </a>
        <a href="#" class="menu-item"> <i 
        class="fa fa-ship"></i> </a>
        <a href="#" class="menu-item"> <i 
        class="fa fa-map"></i> </a>
        <a href="#" class="menu-item"> <i 
        class="fa fa-suitcase"></i> </a>
    </nav>

将为此效果添加另一个过滤器。在SVG中,在先前添加的代码的结束过滤器标记之后添加此代码。这里的效果以与以前非常相似的方式建立起来。这将使菜单看起来像粘稠的液体分开。

<filter id="shadowed-blob">
            <feGaussianBlur in="SourceGraphic" 
            result="blur" stdDeviation="20" />
            <feColorMatrix in="blur" mode=
            "matrix" values="1 0 0 0 0  0 1 0 0 
            0  0 0 1 0 0  0 0 0 18 -7" 
            result="blob" />
            <feGaussianBlur in="blob" 
            stdDeviation="3" result="shadow" />
            <feColorMatrix in="shadow" mode=
            "matrix" values="0 0 0 0 0  0 0 0 0 
            0  0 0 0 0 0  0 0 0 1 -0.2" 
            result="shadow" />

CSS代码现在可以添加到不同的design.css中,只是为了将所有导航CSS保存在同一个地方。添加了一些代码,但这里的过滤器应用于菜单,这将是一个固定的菜单,以便它始终显示在屏幕上。

.menu {
    filter: url(“#shadowed-blob");
    position: fixed;
    padding-top: 20px;
    padding-left: 80px;
    width: 650px;
    height: 150px;
    box-sizing: border-box;
    font-size: 20px;
    text-align: left;
}
当菜单打开时,菜单设置为不可见。创建每个菜单项的悬停元素,以便当用户将鼠标悬停在此时进行更改。当菜单项返回其原始位置时,菜单的每个子项都会有0.4秒的转换。 

.menu-open {
    display: none;
}
.menu-item:hover {
    background: #47959f;
    color: #b2f0f8;
}
.menu-item:nth-child(3), .menu-item:nth-
child(4), .menu-item:nth-child(5), .menu-
item:nth-child(6) {
    transition-duration: 400ms;
}

第一个菜单项实际上是菜单的第三个子项,因为它前面有一个复选框和汉堡包。添加此选项可使第一个菜单元素在用户单击菜单后移动到位。每个菜单元素都会以稍长的时间移出。

.menu-open:checked + .menu-open-button {
    transition-timing-function: linear;
    transition-duration: 400ms;
    transform: scale(0.8, 0.8) translate3d
    (0, 0, 0);
}
.menu-open:checked ~ .menu-item {
    transition-timing-function: cubic-
    bezier(0.165, 0.84, 0.44, 1);
}
.menu-open:checked ~ .menu-item:nth-child(3) {
    transition-duration: 390ms;
    transform: translate3d(110px, 0, 0);
}


使用CSS添加SVG过滤器:剩余移动

以不同的速度移动菜单元素以获得更加流畅的外观

剩余的菜单元素以不同的速度移出。这使得元素能够在动画的早期阶段粘在一起,这将使用SVG滤镜提供斑点的液体外观。保存文档并在浏览器中查看完成的结果。

.menu-open:checked ~ .menu-item:nth-child(4) {
    transition-duration: 490ms;
    transform: translate3d(220px, 0, 0);
}
.menu-open:checked ~ .menu-item:nth-child(5) {
    transition-duration: 590ms;
    transform: translate3d(330px, 0, 0);
}
.menu-open:checked ~ .menu-item:nth-child(6) {
    transition-duration: 690ms;
    transform: translate3d(440px, 0, 0);
}

版权声明:转载此文章须经 领创时代 同意,并请附上 领创时代 及本页链接http://www.leadnov.com/newsItem.aspx?id=132
创造品牌视觉体验 X 创新IT技术赋能企业
领创帮助您创新品牌战略,让品牌成为最具价值的资产。
中国·山东 青岛市市北区郑州路43号橡胶谷A栋
热线:175 6191 5976
微信:leadnov
Copyright © 2018-2020 leadnov.com 版权所有
鲁公网安备37020302372323
ICP证: 鲁ICP备18056479号

关注领创公众平台

添加官方微信

175 6191 5976