当前位置:首页 > JavaScript

js实现内发光

2026-03-15 23:46:34JavaScript

使用CSS box-shadow 实现内发光

在JavaScript中动态设置CSS的box-shadow属性可以轻松实现内发光效果。box-shadowinset参数是关键。

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

参数说明:

js实现内发光

  • inset:表示阴影向内扩散
  • 0 0:X/Y偏移量设为0表示均匀发光
  • 10px:模糊半径控制发光范围
  • 5px:扩展半径控制发光强度
  • rgba():颜色和透明度设置

使用Canvas绘制内发光效果

对于需要更复杂控制的场景,可以使用Canvas API:

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

function drawInnerGlow(element, color, size) {
  const rect = element.getBoundingClientRect();
  canvas.width = rect.width;
  canvas.height = rect.height;

  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = color;
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  ctx.globalCompositeOperation = 'destination-in';
  ctx.fillStyle = 'black';
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  ctx.globalCompositeOperation = 'source-over';
  ctx.filter = `blur(${size}px)`;
  ctx.drawImage(canvas, 0, 0);

  element.style.backgroundImage = `url(${canvas.toDataURL()})`;
}

SVG滤镜实现方案

通过动态创建SVG滤镜可以实现高质量的内发光:

js实现内发光

function createSvgGlow(element, color, blur) {
  const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
  const filter = document.createElementNS("http://www.w3.org/2000/svg", "filter");
  filter.id = "inner-glow";

  const flood = document.createElementNS("http://www.w3.org/2000/svg", "feFlood");
  flood.setAttribute("flood-color", color);

  const composite = document.createElementNS("http://www.w3.org/2000/svg", "feComposite");
  composite.setAttribute("in2", "SourceAlpha");
  composite.setAttribute("operator", "in");

  const blurFilter = document.createElementNS("http://www.w3.org/2000/svg", "feGaussianBlur");
  blurFilter.setAttribute("stdDeviation", blur);

  filter.appendChild(flood);
  filter.appendChild(composite);
  filter.appendChild(blurFilter);
  svg.appendChild(filter);

  document.body.appendChild(svg);

  element.style.filter = "url(#inner-glow)";
}

使用WebGL实现高级发光

对于需要高性能或复杂效果的场景:

const gl = canvas.getContext('webgl');
const program = createProgram(gl, vsSource, fsSource);

function renderInnerGlow() {
  gl.useProgram(program);
  gl.uniform2f(resolutionUniform, canvas.width, canvas.height);
  gl.uniform4f(glowColorUniform, 1.0, 0.0, 0.0, 0.5);
  gl.drawArrays(gl.TRIANGLES, 0, 6);
}

// 顶点和片段着色器需要包含发光算法

响应式内发光实现

结合ResizeObserver实现响应式调整:

const observer = new ResizeObserver(entries => {
  entries.forEach(entry => {
    const { width, height } = entry.contentRect;
    const glowSize = Math.min(width, height) * 0.1;
    entry.target.style.boxShadow = `inset 0 0 ${glowSize}px rgba(255,255,255,0.7)`;
  });
});

observer.observe(document.getElementById('target'));

每种方法适用于不同场景:CSS方案最简单,Canvas/SVG适合复杂图形,WebGL适合高性能需求。可以根据项目需求选择合适的技术方案。

标签: js
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…