colortext.js文档
<style>.art p { margin: 12px 0; font-size: 18px; }
.text { margin: 20px auto; padding: 12px; width: 700px; background: white; font: normal 20px sans-serif; border: 1px solid gray; }
.mum { position: relative; margin: 12px 0; padding: 10px; font: normal 16px/20px Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; color: black; background: rgba(240, 240, 240,.95); border: thin solid orange; border-radius: 6px; }
.mum ::selection { background-color: rgba(0,100,100,.35); }
.mum div { margin: 0; padding: 0; }
.mum cl-cd { display: block; position: relative; margin: 0 0 0 50px; padding: 0 0 0 10px; white-space: pre-wrap; overflow-wrap: break-word; border-left: 1px solid silver; }
.mum cl-cd::before { position: absolute; content: attr(data-idx); width: 50px; color: gray; text-align: right; transform: translate(-70px); }
.tRed { color: red; }
.tBlue { color: blue; }
.tGreen { color: green; }
.tDarkRed { color: darkred; }
.tMagenta { color: magenta; }
</style>
<div class="art">
<p><span class="tRed">colortext.js</span> 用于给web文档中 class="c7" 的所有html元素渲染彩色字效果,演示如下:</p>
<div id="mytext" class="text c7">君不见黄河之水天上来,奔流到海不复回。君不见高堂明镜悲白发,朝如青丝暮成雪。人生得意须尽欢,莫使金樽空对月。天生我材必有用,千金散尽还复来。烹羊宰牛且为乐,会须一饮三百杯。岑夫子,丹丘生,将进酒,杯莫停。与君歌一曲,请君为我倾耳听。钟鼓馔玉不足贵,但愿长醉不复醒。古来圣贤皆寂寞,惟有饮者留其名。陈王昔时宴平乐,斗酒十千恣欢谑。主人何为言少钱,径须沽取对君酌。五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。</div>
<h2 id="h2" class="tMid c7">Hello Javascript!</h2>
<h3>使用方法:</h3>
<p class="c7">方法一:适用于自由环境</p>
<div class='mum'>
<cl-cd data-idx="1"><<span class="tDarkRed">script</span>></cl-cd>
<cl-cd data-idx="2"> <span class="tGreen">// 自定义颜色数组 :省略则使用默认七彩色</span></cl-cd>
<cl-cd data-idx="3"> <span class="tBlue">var</span> hlColors = [<span class="tMagenta">'red'</span>,<span class="tMagenta">'green'</span>,<span class="tMagenta">'blue'</span>,<span class="tMagenta">'orange'</span>,<span class="tMagenta">'magenta'</span>];</cl-cd>
<cl-cd data-idx="4"><<span class="tDarkRed">/script</span>></cl-cd>
<cl-cd data-idx="5"> </cl-cd>
<cl-cd data-idx="6"><<span class="tDarkRed">script</span> charset=<span class="tMagenta">"utf-8"</span> src=<span class="tMagenta">"https://638183.freep.cn/638183/web/js2024/colortext.js"</span>><<span class="tDarkRed">/script</span>></cl-cd>
</div>
<p>上法,如果使用默认颜色,代码仅需第6行。若使用自己定义的颜色,设置颜色的代码块应放在引用资源文档之前,颜色数量不限(下法同)。</p>
<p class="c7">方式二:适用于dz论坛</p>
<div class='mum'>
<cl-cd data-idx="1"><<span class="tDarkRed">script</span>></cl-cd>
<cl-cd data-idx="2"> <span class="tBlue">var</span> sf = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="3"> sf.charset = <span class="tMagenta">'utf-8'</span>;</cl-cd>
<cl-cd data-idx="4"> sf.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js2024/colortext.js'</span>;</cl-cd>
<cl-cd data-idx="5"> <span class="tRed">document</span>.body.appendChild(sf);</cl-cd>
<cl-cd data-idx="6"> <span class="tGreen">// 自定义颜色数组 :可以省略</span></cl-cd>
<cl-cd data-idx="7"> <span class="tBlue">var</span> hlColors = [<span class="tMagenta">'red'</span>,<span class="tMagenta">'green'</span>,<span class="tMagenta">'blue'</span>,<span class="tMagenta">'orange'</span>,<span class="tMagenta">'magenta'</span>];</cl-cd>
<cl-cd data-idx="8"><<span class="tDarkRed">/script</span>></cl-cd>
</div>
<p>此法,自定义颜色数组放前放后都生效。</p>
<p>正确引用资源文档后,页面所有的 class="c7" 的元素,文本都将是出彩的,例如如下的div和h2:</p>
<div class='mum'>
<cl-cd data-idx="1"><<span class="tDarkRed">div</span> class=<span class="tMagenta">"c7"</span>>DIV盒子输出彩色字<<span class="tDarkRed">/div</span>></cl-cd>
<cl-cd data-idx="2"><<span class="tDarkRed">h</span>2 class=<span class="tMagenta">"middle c7"</span>>莫道君行早<<span class="tDarkRed">/h</span>2></cl-cd>
</div>
<p>上面代码,h2标签的class有两个名称,一个是 middle,一个是 c7,后者是渲染彩色字的标识。</p>
<h3>着色的效果:</h3>
<p><span class="c7">colortext</span>渲染彩色字的效果取决于浏览器对 ::highlight() 伪元素的支持与否,若<span class="tRed">支持</span>:</p>
<p>每一个字,含字母、标点等,其着色机制是从预定义的颜色中随机抽去的,每一个字节一种颜色,着色速度快、性能消耗低。</p>
<p>若<span class="tRed">不支持</span>:</p>
<p>使用渐变背景着色方法,具体是使用重复性线性渐变背景+前景色透明来实现,按 200*40px 的尺寸重复渐变,列的颜色一致,行的颜色随机平铺并以 200*40 为单位重复往右铺开。背景渐变作用于文本整体而非单个文字,可能出现一个字出现多种颜色的现象。整体性能也很好,资源消耗不算高。</p>
<h3>关于兼容问题:</h3>
<p>colortext 已经考虑了主要的兼容性问题,但如果浏览器连 background-clip 都不支持,那得通过一个字一个字地加上 span 标签,资源消耗偏大、运行速度偏慢,很遗憾,colortext 没有使用此实现机制。</p>
<p>最后给出一个论坛使用的完整实例代码:</p>
<div class='mum'>
<cl-cd data-idx="1"><<span class="tDarkRed">style</span>></cl-cd>
<cl-cd data-idx="2"> #tBox { <span class="tBlue">font-size:</span> 20px; }</cl-cd>
<cl-cd data-idx="3"><<span class="tDarkRed">/style</span>></cl-cd>
<cl-cd data-idx="4"> </cl-cd>
<cl-cd data-idx="5"><<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"tBox"</span> class=<span class="tMagenta">"c7"</span>></cl-cd>
<cl-cd data-idx="6"> 花潮论坛<<span class="tDarkRed">br</span>></cl-cd>
<cl-cd data-idx="7"> 条条道路通水吧</cl-cd>
<cl-cd data-idx="8"><<span class="tDarkRed">/div</span>></cl-cd>
<cl-cd data-idx="9"> </cl-cd>
<cl-cd data-idx="10"><<span class="tDarkRed">script</span>></cl-cd>
<cl-cd data-idx="11"> <span class="tBlue">var</span> sf = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="12"> sf.charset = <span class="tMagenta">'utf-8'</span>;</cl-cd>
<cl-cd data-idx="13"> sf.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js2024/colortext.js'</span>;</cl-cd>
<cl-cd data-idx="14"> <span class="tRed">document</span>.body.appendChild(sf);</cl-cd>
<cl-cd data-idx="15"> <span class="tBlue">var</span> hlColors = [<span class="tMagenta">'red'</span>,<span class="tMagenta">'green'</span>,<span class="tMagenta">'blue'</span>];</cl-cd>
<cl-cd data-idx="16"><<span class="tDarkRed">/script</span>></cl-cd>
</div>
</div>
<script>
var sf = document.createElement('script');
sf.charset = 'utf-8';
sf.src = 'https://638183.freep.cn/638183/web/js2024/colortext.js';
document.body.appendChild(sf);
</script>
【附】colortext.js 源码
/* colorfont.js by Mahei on 2024-6-17
彩色字效果 :渲染 class="c7" 元素
① 浏览器支持 CSS Custom Highlight API 使用 ::highlight() 渲染
② 否则使用 background-clip: text 渲染
可以定义自己的颜色数组 hlColors
*/
(function() {
if(typeof hlColors === 'undefined' || hlColors === null) hlColors = ['#ad26ad', '#5d0a99','#0000ff',' #07c607', '#b3b308', '#ffa500', '#ff0000'];
const highlights = [], cnum = hlColors.length;
const pseudoHLight = () => {
const hstr = hlColors.map((c,k) => `::highlight(color-${k+1}) {color: ${c}; }`).join('\n');
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = hstr;
document.body.appendChild(style);
for (let i = 0; i < cnum; i++) {
const colorHighlight = new Highlight();
highlights.push(colorHighlight);
CSS.highlights.set(`color-${i + 1}`, colorHighlight);
}
};
const bgHLight = () => {
const bg = [...new Set(hlColors)] ;
const hstr = `.bgHLight {
background-image: repeating-linear-gradient(to right, ${bg});
background-size: 200px 40px;
color: transparent;
background-clip: text;
-webkit-background-clip: text;
}`;
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = hstr;
document.body.appendChild(style);
};
const bgColorText = (ele) => {
const walker = document.createTreeWalker(ele, NodeFilter.SHOW_TEXT);
ele.classList.add('bgHLight');
};
const colorText = (ele) => {
const walker = document.createTreeWalker(ele, NodeFilter.SHOW_TEXT);
while(walker.nextNode()) {
const textNode = walker.currentNode;
const text = textNode.textContent;
for(let i = 0; i < text.length; i++) {
const range = new Range();
range.setStart(textNode, i);
range.setEnd(textNode, i + 1);
highlights.add(range);
}
}
};
const setFontColor = (eles) => {
eles.forEach(ele => {
if(CSS.highlights) {
colorText(ele);
}else{
bgColorText(ele);
}
})
};
CSS.highlights ? pseudoHLight() : bgHLight();
const elems = document.querySelectorAll('.c7');
setFontColor(elems);
})();
本帖最后由 马黑黑 于 2024-6-17 12:48 编辑 <br /><br /><div style="font-size: 2em;" class="c7">
庆历四年春,滕子京谪守巴陵郡。越明年,政通人和,百废具兴。<br>乃重修岳阳楼,增其旧制,刻唐贤今人诗赋于其上。属予作文以记之。<br><br>
予观夫巴陵胜状,在洞庭一湖。衔远山,吞长江,浩浩汤汤,横无际涯。朝晖夕阴,气象万千。此则岳阳楼之大观也。前人之述备矣。然则北通巫峡,南极潇湘,迁客骚人,多会于此,览物之情,得无异乎?<br>
若夫霪雨霏霏,连月不开,阴风怒号,浊浪排空,日星隐耀,山岳潜形;商旅<br>不行,樯倾楫摧;薄暮冥冥,虎啸猿啼。登斯楼也,则有去国怀乡,忧讒畏讥,满目萧然,感极而悲者矣。<br>
至若春和景明,波澜不惊,上下天光,一碧万顷;沙鸥翔集,锦鳞游泳;岸芷汀兰,<br>郁郁青青;而或长烟一空,皓月千里,浮光跃金,静影沉璧;渔歌互答,此乐何极!登斯楼也,则有心旷神怡,宠辱偕忘,把酒临风,其喜洋洋者矣。<br><br>
嗟夫!予尝求古仁人之心,或异二者之为。何哉?不以物喜,不以己悲。居庙堂之高,则忧其民;处江湖之远,则忧其君。是进亦忧,退亦忧。然则何时而乐耶?<br>其必曰“先天下之忧而忧,后天下之乐而乐”乎。噫,微斯人,吾谁与归!<br>
</div>
<script>
var sf1 = document.createElement('script');
sf.charset = 'utf-8';
sf1.src = 'https://638183.freep.cn/638183/web/js2024/colortext.js';
document.body.appendChild(sf1);
</script> 发现这个用默认的也好看,毕竟设置的颜色也是随机出现的{:4_204:} 这个能让文字五颜六色的,真有趣{:4_187:} 嵌网名比较好。 樵歌 发表于 2024-6-17 12:39
嵌网名比较好。
什么都行的,你试试看 红影 发表于 2024-6-17 12:28
这个能让文字五颜六色的,真有趣
彩色字很多年前,大约20年前吧,就在论坛流星开来了,那时网上有很多在线生成彩色字的程序,都是用 span 一个字一个字地上色的 红影 发表于 2024-6-17 12:27
发现这个用默认的也好看,毕竟设置的颜色也是随机出现的
默认颜色数组其实是 mdn 举例用的颜色:
https://developer.mozilla.org/zh-CN/docs/Web/CSS/::highlight 果然火狐和百分着色效果完全不一样。。
火狐渐变出现一个字多种色,好像是一片一片的上色。。
百分浏览器是一个字一个字上色,字字不同。 东篱闲人 发表于 2024-6-17 11:59
本帖最后由 马黑黑 于 2024-6-17 12:47 编辑
庆历四年春,滕子京谪守巴陵郡。越明年,政通人和,百 ...
{:4_190:} 本帖最后由 南无月 于 2024-6-17 12:52 编辑 <br /><br /><style>
#tBox { font-size: 50px; font-weight:bold;}
</style>
<div id="tBox" class="c7">
彩虹字最新实现方法,快乐灌水吧<br>
</div>
<script>
var sf = document.createElement('script');
sf.charset = 'utf-8';
sf.src = 'https://638183.freep.cn/638183/web/js2024/colortext.js';
document.body.appendChild(sf);
var hlColors = ['red','green','blue'];
</script> 南无月 发表于 2024-6-17 12:44
果然火狐和百分着色效果完全不一样。。
火狐渐变出现一个字多种色,好像是一片一片的上色。。
百分浏览器 ...
对,是两种不同的渲染模式 南无月 发表于 2024-6-17 12:49
#tBox { font-size: 20px; }
不过这个不合适灌水用:一个页面反复加载JS不科学 马黑黑 发表于 2024-6-17 12:50
对,是两种不同的渲染模式
火狐的片状渐变居然也好看。。 南无月 发表于 2024-6-17 12:53
火狐的片状渐变居然也好看。。
都可以的 马黑黑 发表于 2024-6-17 12:52
不过这个不合适灌水用:一个页面反复加载JS不科学
啊。。这一页面三个人用了。。好象也没冲突{:4_170:} 南无月 发表于 2024-6-17 12:54
啊。。这一页面三个人用了。。好象也没冲突
其实是以影响的。但主要还是加载JS的问题,多次加载同一个文件不科学。看样纸要提升CSS级层,或等待文档加载完毕再渲染效果,无需多次加载js,只需 class="c7" 的标记就行。 马黑黑 发表于 2024-6-17 12:58
其实是以影响的。但主要还是加载JS的问题,多次加载同一个文件不科学。看样纸要提升CSS级层,或等待文档 ...
那要在论坛灌水用的话,你就去提提呗{:4_170:} 马黑黑 发表于 2024-6-17 12:53
都可以的
不同浏览器都可以渲染的如此漂亮。。
这个代码功能好强大。。
老师厉害{:4_191:}上酒