当前位置:首页 > JavaScript

js实现内发光

2026-02-02 23:19:17JavaScript

使用CSS box-shadow实现内发光

在JavaScript中可以通过动态修改元素的box-shadow样式属性来实现内发光效果。CSS的box-shadow属性支持inset参数用于创建内阴影效果。

const element = document.getElementById('targetElement');
element.style.boxShadow = 'inset 0 0 10px 5px rgba(255, 0, 0, 0.5)';

这段代码会给ID为targetElement的元素添加红色半透明的内发光效果。参数分别表示:水平偏移(0)、垂直偏移(0)、模糊半径(10px)、扩展半径(5px)和颜色。

js实现内发光

使用Canvas绘制内发光效果

对于更复杂的内发光需求,可以使用Canvas API进行绘制:

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.width = 200;
canvas.height = 200;

// 绘制矩形
ctx.fillStyle = '#333';
ctx.fillRect(50, 50, 100, 100);

// 创建内发光效果
ctx.shadowColor = 'rgba(0, 255, 255, 0.8)';
ctx.shadowBlur = 15;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;

// 使用复合操作实现内阴影
ctx.globalCompositeOperation = 'source-atop';
ctx.fillRect(50, 50, 100, 100);

结合SVG滤镜创建高级内发光

通过JavaScript动态创建SVG滤镜可以实现更精细的内发光控制:

js实现内发光

const svgNS = "http://www.w3.org/2000/svg";
const filter = document.createElementNS(svgNS, "filter");
filter.setAttribute("id", "inner-glow");
filter.setAttribute("x", "-20%");
filter.setAttribute("y", "-20%");
filter.setAttribute("width", "140%");
filter.setAttribute("height", "140%");

const feOffset = document.createElementNS(svgNS, "feOffset");
feOffset.setAttribute("in", "SourceGraphic");
feOffset.setAttribute("dx", "0");
feOffset.setAttribute("dy", "0");
feOffset.setAttribute("result", "offOut");

const feGaussianBlur = document.createElementNS(svgNS, "feGaussianBlur");
feGaussianBlur.setAttribute("in", "offOut");
feGaussianBlur.setAttribute("stdDeviation", "5");
feGaussianBlur.setAttribute("result", "blurOut");

const feComposite = document.createElementNS(svgNS, "feComposite");
feComposite.setAttribute("in", "blurOut");
feComposite.setAttribute("in2", "SourceAlpha");
feComposite.setAttribute("operator", "out");
feComposite.setAttribute("result", "compOut");

filter.appendChild(feOffset);
filter.appendChild(feGaussianBlur);
filter.appendChild(feComposite);

document.getElementById('svgDefs').appendChild(filter);

使用WebGL实现3D内发光

对于需要高性能3D内发光效果的场景,可以使用WebGL:

const gl = canvas.getContext('webgl');
const program = createProgram(gl, vertexShader, fragmentShader);

// 在片段着色器中实现内发光
const fragmentShader = `
precision mediump float;
uniform vec2 resolution;
uniform float time;

void main() {
    vec2 uv = gl_FragCoord.xy / resolution;
    float dist = distance(uv, vec2(0.5));
    float glow = smoothstep(0.3, 0.0, dist);
    gl_FragColor = vec4(0.0, 0.8, 1.0, 1.0) * glow;
}
`;

响应式内发光动画

结合CSS动画和JavaScript事件监听器,可以创建响应式的内发光效果:

const glowingElement = document.querySelector('.glow-box');

window.addEventListener('mousemove', (e) => {
    const rect = glowingElement.getBoundingClientRect();
    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;

    const centerX = rect.width / 2;
    const centerY = rect.height / 2;

    const distance = Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2));
    const maxDistance = Math.sqrt(Math.pow(centerX, 2) + Math.pow(centerY, 2));
    const intensity = 1 - (distance / maxDistance);

    glowingElement.style.boxShadow = `inset 0 0 ${intensity * 30}px rgba(0, 255, 255, ${intensity * 0.7})`;
});

这些方法提供了从简单到复杂的不同实现方案,可以根据具体需求选择合适的内发光实现方式。CSS方案适合大多数常规需求,而Canvas、SVG和WebGL方案则适用于需要更高级视觉效果的情况。

标签: js
分享给朋友:

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.defin…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Pa…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…