【问题标题】:Change text size and color incrementally逐步更改文本大小和颜色
【发布时间】:2018-03-05 09:36:49
【问题描述】:

我想知道是否可以在同一行上逐步更改文本大小和颜色,如下所示:

如果可能的话,我只想使用 CSS。任何其他解决方案,至少不会强迫我将每个字母放在自己的范围内,也是受欢迎的。

body {
  font-family:monospace;
}
<span style="font-size:50px;">L</span><span style="font-size:45px;opacity:0.7">o</span><span style="font-size:38px;opacity:0.5">r</span>...

【问题讨论】:

  • 您需要将每个字母都包含在一个元素中(例如span),然后使用nth-child 选择您想要的那个。
  • 我不确定如何使用纯 CSS 来完成。我使用了一个名为 letteringJS 的库,它为我自动将我的文本内容包装在 span 中。这可能会给你一个工作的基础
  • 使用javascript将字母拆分并放入span标签
  • 你肯定确实想使用 CSS。但我知道您不想将每个字母放在自己的 DOM 元素中。 (这是完全不同的两件事。)

标签: javascript html css


【解决方案1】:

没有所有这些标记的一些变换和渐变怎么办:

body {
  perspective: 250px;
  perspective-origin: bottom;
}

div {
  font-size: 70px;
  background: linear-gradient(to right, black,rgba(0,0,0,0.3),rgba(0,0,0,0.2));
  display: inline-block;
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
  transform: rotateY(70deg);
  transform-origin: left;
}
<div>
  Lorem Ipsum Lorem
</div>

【讨论】:

  • @AndreasRejbrand 此处使用 3D 转换来给出文本大小正在变化的错觉(根据问题)。
【解决方案2】:

这实际上取决于您的 HTML 标记。你不能用纯文本“Lorem ipsum”来做到这一点,但如果每个字母都非常简单地包裹在它自己的单独元素中,你就可以做到这一点:

body > span {
  font-size: 72px;
}

span > span {
  font-size: 85%;
  opacity: 0.8;
}
<span>
  L<span>
    o<span>
      r<span>
        e<span>
          m <span>
            i<span>
              p<span>
                s<span>
                  u<span>
                    m
                  </span>
                </span>
              </span>
            </span>
          </span>
        </span>
      </span>
    </span>
  </span>
</span>

但是,如果不修改现有标记或引入一些 JavaScript 来为您执行此操作,您可能无法执行此操作。

至于颜色,您可以使用这种方法更改每个字母的opacity(根据上面的示例),但我不确定这是否可以轻松实现,而无需单独对每个字母应用样式.

【讨论】:

  • 嗯,把每一个字母放在自己的&lt;span&gt;...现在把它们包装成单独的&lt;div&gt;s,设计的可能性真的是无限的! CSS 不是很棒吗?
  • @EricDuminil 太酷了。这种方法的唯一缺点是任何使包含框可见的东西(突出显示文本、添加背景、阴影等)都会很明显地表明它是 3D 过渡而不是平面设计。不过,我猜这不一定是坏事。
  • @JamesDonnelly 如果您滥用 z 顺序和剪切路径,您可以绕过它。
  • margin: 0 -.25em; 减少字母之间的间距怎么样?
【解决方案3】:

使用James Donnelly 回答一点JS:

format = ([head, ...tail]) => {
    if(tail.length == 0)
        return "<span>" + head + "</span>";
    return "<span>" + head + format(tail) + "</span>";
}

var el = document.querySelector(".test");

el.innerHTML = format(el.innerText)
.test > span {
    font-size: 72px;
}

span > span {
    font-size: 85%;
    opacity: 0.8;
}
<div class="test">
    Lorem ipsum
</div>

【讨论】:

  • 你的 JS 遇到了包含 &amp;lt; 字符的文本问题,这些将显示为无效的 html
  • 我无法重现,你能给我举个例子吗?
  • 这就是为什么不使用 JS 中的字符串来构造 DOM 的原因。当您阅读textContent 时,&lt; 之类的内容不会被编码。然后在正确编码之前从中构造 HTML。当然这会中断。
  • Here 将是一个更简洁的版本。请注意,大多数浏览器只会将流浪的 &lt; 视为文本,即使它肯定是无效的 HTML
【解决方案4】:

灵感来自 @James Donnelly 的回答

这个解决方案更加动态,跨度将使用 javascript 生成

查看代码

document.addEventListener('DOMContentLoaded', function()
{ 
    var fooDiv = document.getElementsByClassName("foo")[0];
    var text = fooDiv.innerHTML.trim();
    var textToSpans = "";
    var textLength = text.length;
    for(var i=0;i<textLength;i++){
        textToSpans += "<span>" + text[i];
    }

    for(i=0;i<textLength;i++){
        textToSpans += "</span>";
    }
    fooDiv.innerHTML = textToSpans;

    //change the class so if this code run again this div will not effected
    fooDiv.className = "bar";

}, false);
.bar > span {
    font-size: 72px;
}

span > span {
    font-size: 85%;
    opacity: 0.8;
}
<div class="foo">
    Lorem ips
</div>

【讨论】:

    【解决方案5】:

    var GradientLetters = class {
      constructor(id, fontSizeStep) {
        this.element = document.getElementById(id);
        this.fontSizeStep = fontSizeStep;  
        this.letters = document.getElementById(id).innerText.split("");
        document.getElementById(id).innerText = "";
        this.makeGradient();
      }
      makeGradient() {
        this.letters.forEach((currentValue, index) => {
          let span = document.createElement("SPAN");
          span.innerText = currentValue;
          span.style.color = "rgba(0, 0, 0, " + (1 / index) + ")";
          span.style.fontSize = 60 - (index * 2) + "px";
          this.element.appendChild(span);
    		});
      }
    }
    let gradientLetters = new GradientLetters("gradient-letters", 10);
    p {
      font-family: Arial;
    }
    &lt;p id="gradient-letters"&gt;Lorem ip&lt;/p&gt;

    不可能。 如果不包装 HTML 标记中的字母,您不能更改单个字母的 CSS 属性。 我发现的唯一内容是::first-letterselector,是第一个字母,而不是后面的。

    CSS 上下文中的解释

    CSS font-size PropertyCSS color Property 是您可以在 selectors 的上下文中定义的属性。

    选择器是与树中的元素匹配的模式,并且作为 这种形式是可用于选择节点的几种技术之一 在文档中。

    因此,定义 CSS 属性而不指向 元素(在本例中为 HTML 元素)似乎是不可能的。

    使用 JavaScript

    使用 JavaScript 可以将字符串(在本例中为 HTML 元素的 innerText,如段落)拆分为字母,将这些字母包装在 HTML 元素中,然后以多种方式使用 CSS 设置这些元素的样式。在这种情况下,最好以编程方式设置 CSS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2014-07-03
      • 2019-09-09
      • 2018-01-23
      • 1970-01-01
      • 2019-06-21
      相关资源
      最近更新 更多