应用 CSS text-shadow 时是否可以将多个元素视为一个文本?

Is it possible to treat multiple elements as one text when applying CSS text-shadow?

当将 CSS text-shadow 应用于其文本内容部分包裹在子元素中的元素时,包裹文本后的字母将在包裹元素上投射阴影,如您所见在这个例子中:

* {
  font-family: sans-serif;
  font-weight: 900;
}

.shadow {
  color: #ffd9e2;
  font-size: 3rem;
  text-shadow: 0 0 0 transparent, 0 0 10px #ff003c, 0 0 20px rgba(255, 0, 60, 0.5), 0 0 40px #ff003c, 0 0 100px #ff003c, 0 0 200px #ff003c, 0 0 300px #ff003c, 0 0 500px #ff003c, 0 0 1000px #ff003c;
}

hr {
  margin: 2em 0;
}
<span class="shadow">This <span>t</span>ext <span>c</span>onsists of multiple elements</span>
<hr>
<span class="shadow">This text consists of one single element</span>

"text" 的第一个 "t" 和 "consists" 的 "c" 由于这个原因看起来比文本的其余部分更暗。渲染引擎(testet FF 和 Chrome 最新版本)似乎也分解了多行文本以进行渲染,因此换行会在之前的行上投下阴影,但这在这里甚至没有那么麻烦。但是,我想让文字的所有字符都被视为在同一层上。

是否有一些技巧可以应用到 CSS 来使渲染行为如此?

我尝试 z-index 并在 .shadow 容器的子元素中包装 所有 文本节点,但无济于事。

您可以使用 drop-shadow() 过滤器。

演示:

* {
  font-family: sans-serif;
  font-weight: 900;
}

.shadow {
  color: #ffd9e2;
  font-size: 3rem;
  filter: drop-shadow(0 0 0 transparent)
          drop-shadow(0 0 10px #ff003c) 
          drop-shadow(0 0 20px rgba(255, 0, 60, 0.5));
}

hr {
  margin: 2em 0;
}
<span class="shadow">This <span>t</span>ext <span>c</span>onsists of multiple elements</span>
<hr>
<span class="shadow">This text consists of one single element</span>

您可以考虑使用 drop-shadow() 滤镜,但要注意它与文本阴影的作用不同。过滤器是累积的而不是单独应用的:

* {
  font-family: sans-serif;
  font-weight: 900;
}

.shadow {
  color: #ffd9e2;
  font-size: 3rem;
 filter:
  drop-shadow(0 0 10px #ff003c)
  drop-shadow(0 0 20px rgba(255, 0, 60, 0.5))
  drop-shadow(0 0 40px #ff003c);
}

hr {
  margin: 2em 0;
}
<span class="shadow">This <span>t</span>ext <span>c</span>onsists of multiple elements</span>
<hr>
<span class="shadow">This text consists of one single element</span>

为了更好的说明多重drop-shadow()滤镜的效果:

.box {
  padding:50px;
  font-size:30px;
  font-weight:bold;
}
.s {
 text-shadow: 20px 50px 0 red,150px -20px 0 blue,-20px 20px 0 green;
}

.f {
 filter: drop-shadow(20px 50px 0 red) drop-shadow(150px -20px 0 blue) drop-shadow(-20px 20px 0 green);
}
<div class="box s">some shadow</div>

<div class="box f">some filter</div>

你可以清楚地看到我们在第二个例子中有多少阴影,因为每次我们考虑前一个并且我们复制它。