一个闪闪发光的标题

朋友最近接了个小项目,要结尾款了,客户突然来了个要让标题闪闪发光的需求。朋友让帮忙,做好了请吃鸡腿。看在这客户这么重视界面效果的份上 我决定试试,这里简单记录一下。给出以下3种效果。

一、自发光

比较容易实现,用文字阴影模拟发光产生的光晕效果,用动画改变它们的亮度即可。

css 复制代码
.lighting-el { 
    animation: lighting 2s linear infinite; 
    color: rgb(210, 210, 210);
}
@keyframes lighting { 
    0%,100% { 
        color: rgb(210, 210, 210); 
        text-shadow: 0 0 5px rgb(210, 210, 210); 
    } 
    40% { 
        color: rgb(255, 255, 255); 
        text-shadow: 0 0 15px rgb(255, 255, 255); 
    } 
}

二、文字流光

用一个渐变色在背景上反复移动,模拟流光的效果。也可以作为加载动画使用。svg实现如下:

html 复制代码
<defs> 
    <!--线性渐变,0% ,100% 时设置透明度为0--> 
    <linearGradient id="line-gradient" x1="0%" y1="40%" x2="100%" y2="60%"> 
        <stop offset="0%" stop-color="#A9A7A7" stop-opacity="0" /> 
        <stop offset="50%" stop-color="#A9A7A7" stop-opacity="0.8" />
        <stop offset="100%" stop-color="#A9A7A7" stop-opacity="0" /> 
    </linearGradient> 
    <!--流光背景动画。用pattern定义一个背景,width和height指定的是图像范围,而不是整体进行缩放-->
    <pattern id="light-bg" width="100%" height="100%"> 
    <!--宽、高要能覆盖文字--> 
        <rect x="0" y="0" width="200" height="100" fill="#fff"></rect>
        <rect transform="skewX(-20)" x="0" y="0" width="50" height="120" fill="url(#line-gradient)"> <!--指定x属性,一直重复向右移动即可--> 
        <animate attributeName="x" from="-20" to="240" begin="0s" dur="2s" repeatCount="indefinite" /> </rect> 
    </pattern> 
</defs> 
<g transform="translate(0,60)">
<!--fill属性应用 pattern定义的背景动画--> 
<text fill="url(#light-bg)" x="0" y="50" style="font-size: 30px;font-weight: 700;font-family: 'KaiTi';">文字流光</text> 
</g>

三、闪闪发光

类似不连续的光泽物覆盖物体,表面常伴随有光点闪烁的效果。用svg模拟实现如下:

(1)用 定义一个闪光用的星星,用高斯模糊柔和一下边缘。

(2)使用柏林噪声和位置替换滤镜对我们准备好的条纹背景制作一个不连续的光泽表面纹理。

(3)用元素引用定义好的星星,用动画改变透明度模仿闪烁效果即可。

html 复制代码
<defs> 
    <!--高斯模糊-->
    <filter id="gs-filter"> 
        <feGaussianBlur in="sourceGraphic" stdDeviation="1" /> 
    </filter> 
    <filter id="noise-filter"> 
        <feTurbulence type="turbulence" baseFrequency="0.81" numOctaves="2" stitchTiles="no-Stitch" /> <feDisplacementMap in="SourceGraphic" xChannelSelector="R" yChannelSelector="B" scale="30" /> 
    </filter> 
    <!--星星,加一点模糊柔和一下边缘--> 
    <symbol id="star-symbol" fill="#fff" filter="url(#gs-filter)"> 
        <path d="M0 25L23 23L25 0L27 23L50 25L27 27L25 50L23 27Z" /> 
        <path d="M0 25L23 23L25 0L27 23L50 25L27 27L25 50L23 27Z" transform="rotate(45),scale(0.5)" transform-origin="25 25" /> 
    </symbol> 
    <!--不连续的光泽背景 边缘部分在经过滤镜后光泽分布不均匀-->
    <!--所以调整x从4%开始(也可以用viewbox+preserveAspectRatio属性控制用中间部分显示) --> 
    <pattern id="light-bg2" width="100%" height="100%" x="4%"> 
        <g filter="url(#noise-filter)"> 
            <rect x="0" y="0" width="500" height="95" fill="#619af5"></rect> 
            <rect x="0" y="0" width="500" height="10" fill="#fff" stroke-width="4" stroke="#6c6a6a"></rect> 
            <rect x="0" y="15" width="500" height="10" fill="#fff" stroke-width="4" stroke="#6c6a6a"></rect> 
            <rect x="0" y="30" width="500" height="10" fill="#fff" stroke-width="4" stroke="#6c6a6a"></rect> 
            <rect x="0" y="45" width="500" height="10" fill="#fff" stroke-width="4" stroke="#6c6a6a"></rect> 
            <rect x="0" y="60" width="500" height="10" fill="#fff" stroke-width="4" stroke="#6c6a6a"></rect> 
            <rect x="0" y="75" width="500" height="10" fill="#fff" stroke-width="4" stroke="#6c6a6a"></rect> 
            <rect x="0" y="85" width="500" height="10" fill="#fff" stroke-width="4" stroke="#6c6a6a"></rect> 
        </g> 
    </pattern> 
</defs> 
<g transform="translate(50,260)"> 
    <text fill="url(#light-bg2)" x="0" y="30" style="font-size: 50px;font-weight: 700;font-family: 'Fantasy';">闪闪发光</text> 
    <use opacity="1" xlink:href="#star-symbol" transform-origin="25 25" transform="matrix(0.8,0,0,0.8,20,0)"> 
        <!--用values属性来控制星星的闪烁频率--> 
        <animate attributeName="opacity" values="1;0;1;1;1;1;1;1;1;0" begin="0s" dur="2s" repeatCount="indefinite" /> </use> 
    <use opacity="1" xlink:href="#star-symbol" transform-origin="25 25" transform="translate(66,-28),scale(0.6),rotate(20)"> 
        <animate attributeName="opacity" values="1;0;1;1;1;1;1;1;1;1;1" begin="1s" dur="2s" repeatCount="indefinite" /> </use> 
    <use opacity="0" xlink:href="#star-symbol" transform-origin="25 25" transform="matrix(0.5,0,0,0.5,170,10)"> 
        <animate attributeName="opacity" values="0;1;1;0;0;0;0;0;0" begin="1.5s" dur="2s" repeatCount="indefinite" /> 
    </use> 
</g>

让朋友选一种,然后调整下文字,位置就差不多了。不得不说鸡腿味道还可以。

快元旦了,先祝大家元旦快乐吧。

相关推荐
zqx_74 分钟前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己21 分钟前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称44 分钟前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色1 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2341 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河1 小时前
CSS总结
前端·css
BigYe程普2 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
余生H2 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
程序员-珍2 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
axihaihai2 小时前
网站开发的发展(后端路由/前后端分离/前端路由)
前端