You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CSS实现NVG夜视效果?求实现思路与指导

用CSS实现夜视仪(NVG)效果的完整方案

1. 基础绿色色调转换

夜视仪的核心是偏绿的色调,用CSS滤镜就能快速实现,无需修改原图:

.nvg-container {
  filter: sepia(100%) hue-rotate(90deg) saturate(300%) brightness(1.2);
}
  • sepia(100%):先把画面转成棕褐色基底
  • hue-rotate(90deg):将色调旋转到绿色区间
  • saturate(300%):提高饱和度让绿色更鲜艳
  • brightness(1.2):提亮画面模拟夜视的增益效果

想要更细腻的色调,可叠加半透明绿色层:

.nvg-container::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(0, 220, 80, 0.25);
  mix-blend-mode: multiply;
  pointer-events: none;
}

2. 发光效果(高亮元素/边缘光晕)

分两种场景模拟夜视仪的发光特性:

  • 文本/局部元素发光:用text-shadow或box-shadow实现
.nvg-highlight {
  text-shadow: 0 0 4px #0f0, 0 0 8px #0f0, 0 0 12px #0f0;
  /* 块状元素用box-shadow */
  box-shadow: 0 0 6px #0f0, 0 0 12px #0f0;
}
  • 全局画面光晕:用模糊滤镜模拟整体发光感
.nvg-container::before {
  content: "";
  position: absolute;
  inset: 0;
  background: inherit;
  filter: blur(6px) brightness(1.4);
  z-index: -1;
  opacity: 0.6;
}

3. 噪点纹理模拟

CSS没有原生噪点滤镜,两种简单实现方法:

方法1:径向渐变点阵噪点

.nvg-noise {
  position: absolute;
  inset: 0;
  background-image: radial-gradient(rgba(0,255,100,0.08) 1px, transparent 1px);
  background-size: 3px 3px;
  opacity: 0.4;
  pointer-events: none;
}

方法2:SVG湍流噪点(更真实)

内嵌SVG滤镜后应用到容器:

.nvg-container {
  filter: sepia(100%) hue-rotate(90deg) saturate(300%) brightness(1.2) url(#noise-filter);
}

对应的SVG放在页面中:

<svg width="0" height="0">
  <filter id="noise-filter">
    <feTurbulence type="fractalNoise" baseFrequency="0.65" numOctaves="3" stitchTiles="stitch"/>
    <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  </filter>
</svg>

4. 扫描线效果

模拟CRT夜视仪的扫描线,用线性渐变+动画实现:

.nvg-scanlines {
  position: absolute;
  inset: 0;
  background: linear-gradient(transparent 50%, rgba(0,220,80,0.1) 50%);
  background-size: 100% 2px;
  pointer-events: none;
  animation: scanlineMove 0.1s linear infinite;
}

@keyframes scanlineMove {
  0% { background-position: 0 0; }
  100% { background-position: 0 2px; }
}

完整示例代码

将所有效果组合后的HTML和CSS结构:

<div class="nvg-container">
  <img src="your-image.jpg" alt="Night vision view">
  <div class="nvg-noise"></div>
  <div class="nvg-scanlines"></div>
</div>

<svg width="0" height="0">
  <filter id="noise-filter">
    <feTurbulence type="fractalNoise" baseFrequency="0.65" numOctaves="3" stitchTiles="stitch"/>
    <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0"/>
  </filter>
</svg>
.nvg-container {
  position: relative;
  width: 800px;
  height: 600px;
  overflow: hidden;
  filter: sepia(100%) hue-rotate(90deg) saturate(300%) brightness(1.2) url(#noise-filter);
}

.nvg-container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.nvg-container::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(0, 220, 80, 0.25);
  mix-blend-mode: multiply;
  pointer-events: none;
}

.nvg-container::before {
  content: "";
  position: absolute;
  inset: 0;
  background: inherit;
  filter: blur(6px) brightness(1.4);
  z-index: -1;
  opacity: 0.6;
}

.nvg-noise {
  position: absolute;
  inset: 0;
  background-image: radial-gradient(rgba(0,255,100,0.08) 1px, transparent 1px);
  background-size: 3px 3px;
  opacity: 0.4;
  pointer-events: none;
}

.nvg-scanlines {
  position: absolute;
  inset: 0;
  background: linear-gradient(transparent 50%, rgba(0,220,80,0.1) 50%);
  background-size: 100% 2px;
  pointer-events: none;
  animation: scanlineMove 0.1s linear infinite;
}

@keyframes scanlineMove {
  0% { background-position: 0 0; }
  100% { background-position: 0 2px; }
}

额外技巧

  • 视频内容直接替换<img>为<video>,效果同样适用
  • 调整滤镜参数可适配不同风格:比如旧款夜视仪偏黄,把hue-rotate调到70deg左右
  • 给容器加黑色遮罩或圆角,可模拟夜视仪目镜边框

内容的提问来源于stack exchange,提问作者Osama Hima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:10:40