我要找的是:

一种为角色的一半设置样式的方法。(在这种情况下,一半的字母是透明的)

我目前搜索并尝试的内容(运气不佳):

半个字符/字母的样式设置方法使用CSS或JavaScript设置字符的部分样式将CSS应用于50%的字符

下面是我试图获得的一个例子。

对此,是否存在CSS或JavaScript解决方案,还是我必须求助于图像?我宁愿不走图像路线,因为文本最终将动态生成。


更新:

既然很多人都问我为什么要塑造一个角色的一半,这就是为什么。我所在的城市最近花了25万美元为自己定义了一个新的“品牌”。这个标志就是他们想出的。许多人抱怨网站的简单和缺乏创造力,并继续这样做。我的目标是把这个网站当成一个笑话。输入“哈利法克斯”,你就会明白我的意思。


当前回答

您可以使用以下代码。在此示例中,我使用了h1标记,并添加了一个属性数据title text=“Display text”,它将在h1标记文本元素上显示不同颜色的文本,这会产生如下示例所示的半彩色文本效果

正文{文本对齐:居中;边距:0;}h1小时{颜色:#111;字体系列:arial;位置:相对;字体系列:“Oswald”,无衬线;显示:内联块;字体大小:2.5em;}h1::之后{content:attr(数据标题文本);颜色:#e554e;位置:绝对;左:0;顶部:0;剪辑:矩形(0,1000px,30px,0);}<h1 data title text=“显示文本”>显示文本</h1>

其他回答

像这样的短文本怎么样?

如果你使用循环,用JavaScript重复字符,它甚至可以处理更长的文本。总之,结果是这样的:

邮政编码{位置:相对;显示:内联块;字体大小:60px;颜色:红色;}p.char:之前{位置:绝对;内容:属性(字符);宽度:50%;溢出:隐藏;颜色:黑色;}<p class=“char”char=“S”>S</p><p class=“char”char=“t”>t</p><p class=“char”char=“a”>a</p><p class=“char”char=“c”>c</p><p class=“char”char=“k”>k</p><p class=“char”char=“o”>o</p><p class=“char”char=“v”>v</p><p class=“char”char=“e”>e</p><p class=“char”char=“r”>r</p><p class=“char”char=“f”>f</p><p class=“char”char=“l”>l</p><p class=“char”char=“o”>o</p><p class=“char”char=“w”>w</p>

这是一个仅针对整行文本的CSS解决方案,而不仅仅是字符元素。

第二部分{位置:相对;顶部:2米;高度:2米;文本转换:全宽;}div:之前,div:之后{content:attr(数据内容);位置:绝对;顶部:0;右:0;底部:0;左:0;}div:之后{颜色:红色;/*单个字符的掩码。通过重复此掩码,所有字符串都将被掩码*/-webkit掩码图像:线性渐变(向右,透明0,透明.5em,白色.5em,白1em);-webkit掩码重复:repeat-x;/*向右重复面罩*/-webkit掩码大小:1em;/*单个字符的相对宽度*//*非供应商掩码设置*/遮罩图像:线性渐变(向右,透明0,透明.5em,白色.5em,白1em);掩码重复:repeat-x;掩模尺寸:1em;}/*演示目的*/input[name=“fontSize”]:第一个类型:checked ~ div{字体大小:1em;}input[name=“fontSize”]:第一个类型+input:checked ~ div{字体大小:2em;}input[name=“fontSize”]:第一个类型+input+input:checked ~ div{字体大小:3em;}字体大小:<input type=“radio”name=“fontSize”value=“1em”><input type=“radio”name=“fontSize”value=“2em”checked><input type=“radio”name=“fontSize”value=“3em”><div data content=“仅限CSS的解决方案…”></div><div data content=“在Firefox上试用!”></div>

其想法是为每个字符应用一个水平CSS掩码,隐藏其前半部分[0-0.5em],并显示后半部分[0.5em-1em]。

掩码的宽度为掩码大小:1em,以匹配字符串中第一个字符的宽度。通过使用掩码repeat:repeat-x,相同的掩码将应用于第二个、第三个字符,依此类推。

我原以为使用单格字体可以解决使用相同宽度字母的问题,但我错了。相反,我通过使用文本转换解决了这个问题:我相信,不幸的是,只有Firefox才支持全宽度。

使用相对单位em允许设计根据字体大小进行放大/缩小。

适用于所有浏览器的Vanilla JavaScript解决方案

如果Firefox不是一个选项,那么使用此脚本进行救援。

它通过为每个字符插入子跨度来工作。在每个span中,从字母的宽度(即span元素的宽度)[0%-50%]和[50%-100%]处放置一个非重复CSS掩码。

这样,我们就不再有使用相同宽度字符的限制。

常量dataElement=document.getElementById(“data”),content=dataElement.textContent,zoom=功能(fontSize){dataElement.style['font-size']=fontSize+'em';};while(dataElement.firstChild){dataElement.firstChild.remove()}对于(var i=0;i<content.length;++i){常量spanElem=document.createElement('span'),ch=含量[i];spanElem.setAttribute('data-ch',ch);spanElem.appendChild(document.createTextNode(ch==''?'\u00A0':ch));data.appendChild(spanElem);}#数据{位置:相对;顶部:2米;高度:2米;字体大小:2em;}#数据跨度{显示:内联块;位置:相对;颜色:透明;}#数据跨度:之前,#数据范围:之后{content:attr(数据ch);显示:内联块;位置:绝对;顶部:0;右:0;底部:0;左:0;文本对齐:居中;颜色:初始;}#数据范围:之后{颜色:红色;-webkit掩码图像:线性渐变(向右,透明0,透明50%,白色50%,白色100%);掩模图像:线性梯度(向右,透明0,透明50%,白色50%,白色100%);}字体大小:<input-type=“range”min=1 max=4 step=0.05 value=2 oninput=“zoom(this.value)”onchange=“zoom(this.value)”><div id=“data”>后备解决方案。。。对于所有浏览器</div>

是的,您可以只使用一个字符和CSS:

http://jsbin.com/rexoyice/1/

h1小时{显示:内联块;边距:0;/*用于演示片段*/线条高度:1em;/*用于演示片段*/字体系列:helvetica,arial,sans-serif;字号:粗体;字体大小:300px;背景:线性梯度(向右,#7db9e8 50%,#1e5799 50%);背景剪辑:文本;-webkit文本填充颜色:透明;}<h1>X(X)</h1>

从视觉上看,所有使用两个字符的示例(无论是通过JS、CSS伪元素还是HTML)看起来都很好,但请注意,所有这些都会向DOM添加内容,这可能会导致可访问性——以及文本选择/剪切/粘贴问题。


JSFiddle演示

我们将只使用CSS伪选择器来实现!

该技术将使用动态生成的内容和不同的字体大小和宽度。

HTML格式:

<div class='split-color'>Two is better than one.</div>

CSS:

.split-color > span {
    white-space: pre-line;
    position: relative;
    color: #409FBF;
}

.split-color > span:before {
    content: attr(data-content);
    pointer-events: none;  /* Prevents events from targeting pseudo-element */
    position: absolute;
    overflow: hidden;
    color: #264A73;
    width: 50%;
    z-index: 1;
}

要包装动态生成的字符串,可以使用如下函数:

// Wrap each letter in a span tag and return an HTML string
// that can be used to replace the original text
function wrapString(str) {
  var output = [];
  str.split('').forEach(function(letter) {
    var wrapper = document.createElement('span');
    wrapper.dataset.content = wrapper.innerHTML = letter;

    output.push(wrapper.outerHTML);
  });

  return output.join('');
}

// Replace the original text with the split-color text
window.onload = function() {
    var el  = document.querySelector('.split-color'),
        txt = el.innerHTML;
    
    el.innerHTML = wrapString(txt);
}

另一种仅使用CSS的解决方案(如果您不想编写特定于字母的CSS,则需要数据属性)。这一款更全面(已测试IE 9/10、Chrome最新版本和FF最新版本)

跨度{位置:相对;颜色:rgba(50,50200,0.5);}跨度:之前{content:attr(数据字符);位置:绝对;宽度:50%;溢出:隐藏;颜色:rgb(50,50200);}<span data char=“X”>X</span>