马黑黑 发表于 2024-6-17 11:51

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">&lt;<span class="tDarkRed">script</span>&gt;</cl-cd>
<cl-cd data-idx="2">&nbsp; &nbsp; <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">&lt;<span class="tDarkRed">/script</span>&gt;</cl-cd>
<cl-cd data-idx="5">&nbsp;</cl-cd>
<cl-cd data-idx="6">&lt;<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>&gt;&lt;<span class="tDarkRed">/script</span>&gt;</cl-cd>
        </div>
        <p>上法,如果使用默认颜色,代码仅需第6行。若使用自己定义的颜色,设置颜色的代码块应放在引用资源文档之前,颜色数量不限(下法同)。</p>
        <p class="c7">方式二:适用于dz论坛</p>
        <div class='mum'>
<cl-cd data-idx="1">&lt;<span class="tDarkRed">script</span>&gt;</cl-cd>
<cl-cd data-idx="2">&nbsp; &nbsp; <span class="tBlue">var</span> sf = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="3">&nbsp; &nbsp; sf.charset = <span class="tMagenta">'utf-8'</span>;</cl-cd>
<cl-cd data-idx="4">&nbsp; &nbsp; sf.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js2024/colortext.js'</span>;</cl-cd>
<cl-cd data-idx="5">&nbsp; &nbsp; <span class="tRed">document</span>.body.appendChild(sf);</cl-cd>
<cl-cd data-idx="6">&nbsp; &nbsp; <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">&lt;<span class="tDarkRed">/script</span>&gt;</cl-cd>
        </div>
        <p>此法,自定义颜色数组放前放后都生效。</p>
        <p>正确引用资源文档后,页面所有的 class="c7" 的元素,文本都将是出彩的,例如如下的div和h2:</p>
        <div class='mum'>
<cl-cd data-idx="1">&lt;<span class="tDarkRed">div</span> class=<span class="tMagenta">"c7"</span>&gt;DIV盒子输出彩色字&lt;<span class="tDarkRed">/div</span>&gt;</cl-cd>
<cl-cd data-idx="2">&lt;<span class="tDarkRed">h</span>2 class=<span class="tMagenta">"middle c7"</span>&gt;莫道君行早&lt;<span class="tDarkRed">/h</span>2&gt;</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">&lt;<span class="tDarkRed">style</span>&gt;</cl-cd>
<cl-cd data-idx="2">    #tBox { <span class="tBlue">font-size:</span> 20px; }</cl-cd>
<cl-cd data-idx="3">&lt;<span class="tDarkRed">/style</span>&gt;</cl-cd>
<cl-cd data-idx="4"> </cl-cd>
<cl-cd data-idx="5">&lt;<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"tBox"</span> class=<span class="tMagenta">"c7"</span>&gt;</cl-cd>
<cl-cd data-idx="6">    花潮论坛&lt;<span class="tDarkRed">br</span>&gt;</cl-cd>
<cl-cd data-idx="7">    条条道路通水吧</cl-cd>
<cl-cd data-idx="8">&lt;<span class="tDarkRed">/div</span>&gt;</cl-cd>
<cl-cd data-idx="9"> </cl-cd>
<cl-cd data-idx="10">&lt;<span class="tDarkRed">script</span>&gt;</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">&lt;<span class="tDarkRed">/script</span>&gt;</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>

马黑黑 发表于 2024-6-17 11:53

【附】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 11:59

本帖最后由 马黑黑 于 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>

红影 发表于 2024-6-17 12:27

发现这个用默认的也好看,毕竟设置的颜色也是随机出现的{:4_204:}

红影 发表于 2024-6-17 12:28

这个能让文字五颜六色的,真有趣{:4_187:}

樵歌 发表于 2024-6-17 12:39

嵌网名比较好。

马黑黑 发表于 2024-6-17 12:41

樵歌 发表于 2024-6-17 12:39
嵌网名比较好。

什么都行的,你试试看

马黑黑 发表于 2024-6-17 12:42

红影 发表于 2024-6-17 12:28
这个能让文字五颜六色的,真有趣
彩色字很多年前,大约20年前吧,就在论坛流星开来了,那时网上有很多在线生成彩色字的程序,都是用 span 一个字一个字地上色的

马黑黑 发表于 2024-6-17 12:44

红影 发表于 2024-6-17 12:27
发现这个用默认的也好看,毕竟设置的颜色也是随机出现的

默认颜色数组其实是 mdn 举例用的颜色:

https://developer.mozilla.org/zh-CN/docs/Web/CSS/::highlight

南无月 发表于 2024-6-17 12:44

果然火狐和百分着色效果完全不一样。。
火狐渐变出现一个字多种色,好像是一片一片的上色。。
百分浏览器是一个字一个字上色,字字不同。

马黑黑 发表于 2024-6-17 12:48

东篱闲人 发表于 2024-6-17 11:59
本帖最后由 马黑黑 于 2024-6-17 12:47 编辑
    庆历四年春,滕子京谪守巴陵郡。越明年,政通人和,百 ...

{:4_190:}

南无月 发表于 2024-6-17 12:49

本帖最后由 南无月 于 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:50

南无月 发表于 2024-6-17 12:44
果然火狐和百分着色效果完全不一样。。
火狐渐变出现一个字多种色,好像是一片一片的上色。。
百分浏览器 ...

对,是两种不同的渲染模式

马黑黑 发表于 2024-6-17 12:52

南无月 发表于 2024-6-17 12:49
#tBox { font-size: 20px; }




不过这个不合适灌水用:一个页面反复加载JS不科学

南无月 发表于 2024-6-17 12:53

马黑黑 发表于 2024-6-17 12:50
对,是两种不同的渲染模式

火狐的片状渐变居然也好看。。

马黑黑 发表于 2024-6-17 12:53

南无月 发表于 2024-6-17 12:53
火狐的片状渐变居然也好看。。

都可以的

南无月 发表于 2024-6-17 12:54

马黑黑 发表于 2024-6-17 12:52
不过这个不合适灌水用:一个页面反复加载JS不科学

啊。。这一页面三个人用了。。好象也没冲突{:4_170:}

马黑黑 发表于 2024-6-17 12:58

南无月 发表于 2024-6-17 12:54
啊。。这一页面三个人用了。。好象也没冲突

其实是以影响的。但主要还是加载JS的问题,多次加载同一个文件不科学。看样纸要提升CSS级层,或等待文档加载完毕再渲染效果,无需多次加载js,只需 class="c7" 的标记就行。

南无月 发表于 2024-6-17 18:10

马黑黑 发表于 2024-6-17 12:58
其实是以影响的。但主要还是加载JS的问题,多次加载同一个文件不科学。看样纸要提升CSS级层,或等待文档 ...

那要在论坛灌水用的话,你就去提提呗{:4_170:}

南无月 发表于 2024-6-17 18:11

马黑黑 发表于 2024-6-17 12:53
都可以的

不同浏览器都可以渲染的如此漂亮。。
这个代码功能好强大。。
老师厉害{:4_191:}上酒
页: [1] 2 3 4
查看完整版本: colortext.js文档