当前位置:首页 > 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)和颜色。

使用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滤镜可以实现更精细的内发光控制:

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事件监听器,可以创建响应式的内发光效果:

js实现内发光

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
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现验证码

js实现验证码

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

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…

js实现导航菜单

js实现导航菜单

使用HTML和CSS创建基础结构 导航菜单的基础结构通常由HTML的无序列表(<ul>)和列表项(<li>)组成,每个列表项包含一个链接(<a>)。CSS用于样式化…