马黑黑 发表于 2022-8-17 19:15

canvas画布: 多行文本逐句逐字输出

<style>
        #papa { margin: auto; width: 720px; height: 460px; display:grid; place-items: center; position: relative; }
        #canv { position: absolute; border: 1px solid; }
</style>

<div id="papa">
        <canvas id="canv" width="320" height="260"></canvas>
</div>

<script>
let ctx = canv.getContext('2d');
let w = canv.width, h = canv.height;
let txtAr = ['荆溪白石出,', '天寒红叶稀。', '山路元无雨,', '空翠湿人衣。'];
let lineNow = 0, lineHeight = 60, charIdx = 0; //行、行高(建议略大于字号)、字符索引

let linear = ctx.createLinearGradient(0, 0, w, h);
linear.addColorStop(0, 'red');
linear.addColorStop(0.3, 'olive');
linear.addColorStop(0.7, 'darkgreen');
linear.addColorStop(1, 'orange');

(function drawText() {
        ctx.clearRect(0, 0, w, h);
        ctx.strokeStyle = linear;
        ctx.font = 'bold 50px snas-serif';
        for(let k = 0; k < lineNow; k ++) {
                ctx.strokeText(txtAr, 20, lineHeight * k + lineHeight);
        }
        let txtstr = txtAr.substring(0, charIdx);
        ctx.strokeText(txtstr, 20, lineHeight * lineNow + lineHeight);
        charIdx ++;
        if(charIdx > txtAr.length) {
                lineNow += 1;
                charIdx = 0;
        }
        if(lineNow > txtAr.length - 1) lineNow = 0;
        setTimeout(drawText, 500);
})();
</script>

马黑黑 发表于 2022-8-17 19:16

代码(使用时应根据需要修改相应的东东):
<style>
        #papa { margin: auto; width: 720px; height: 460px; display:grid; place-items: center; position: relative; }
        #canv { position: absolute; border: 1px solid; }
</style>

<div id="papa">
        <canvas id="canv" width="320" height="260"></canvas>
</div>

<script>
let ctx = canv.getContext('2d');
let w = canv.width, h = canv.height;
let txtAr = ['荆溪白石出,', '天寒红叶稀。', '山路元无雨,', '空翠湿人衣。'];
let lineNow = 0, lineHeight = 60, charIdx = 0; //行、行高(建议略大于字号)、字符索引

let linear = ctx.createLinearGradient(0, 0, w, h);
linear.addColorStop(0, 'red');
linear.addColorStop(0.3, 'olive');
linear.addColorStop(0.7, 'darkgreen');
linear.addColorStop(1, 'orange');

(function drawText() {
        ctx.clearRect(0, 0, w, h);
        ctx.strokeStyle = linear;
        ctx.font = 'bold 50px snas-serif';
        for(let k = 0; k < lineNow; k ++) {
                ctx.strokeText(txtAr, 20, lineHeight * k + lineHeight);
        }
        let txtstr = txtAr.substring(0, charIdx);
        ctx.strokeText(txtstr, 20, lineHeight * lineNow + lineHeight);
        charIdx ++;
        if(charIdx > txtAr.length) {
                lineNow += 1;
                charIdx = 0;
        }
        if(lineNow > txtAr.length - 1) lineNow = 0;
        setTimeout(drawText, 500);
})();
</script>


马黑黑 发表于 2022-8-17 19:18

这句,

let txtAr = ['荆溪白石出,', '天寒红叶稀。', '山路元无雨,', '空翠湿人衣。'];

是欲要输出的多行文本,每行一个数组元素,请严格按格式建造自己的数组。

另外:#papa 选择器的尺寸、canvas的尺寸,以及其他设置,都可以根据需要在CSS和HTML中修改。

马黑黑 发表于 2022-8-17 19:20

如果不需要渐变文本,下面五行删掉:

let linear = ctx.createLinearGradient(0, 0, w, h);
linear.addColorStop(0, 'red');
linear.addColorStop(0.3, 'olive');
linear.addColorStop(0.7, 'darkgreen');
linear.addColorStop(1, 'orange');

然后,将下句,

ctx.strokeStyle = linear;

改为(颜色自己定):

ctx.strokeStyle = 'red';

红影 发表于 2022-8-17 19:50

刚才前面一个帖子里询问是否有多行文本输入,这里就看到了,太好了{:4_187:}

红影 发表于 2022-8-17 19:51

黑黑厉害,什么都弄得出来{:4_199:}太厉害了!

马黑黑 发表于 2022-8-17 20:09

红影 发表于 2022-8-17 19:51
黑黑厉害,什么都弄得出来太厉害了!

这个貌似简单的

马黑黑 发表于 2022-8-17 20:09

红影 发表于 2022-8-17 19:50
刚才前面一个帖子里询问是否有多行文本输入,这里就看到了,太好了

弄了单行的就顺带弄多行的

小辣椒 发表于 2022-8-17 21:35

逐句逐字输出这个可以做标题字吧

小辣椒 发表于 2022-8-17 21:37

马黑黑 发表于 2022-8-17 20:09
这个貌似简单的

会的就说简单,不会的感觉一座大山在前面

马黑黑 发表于 2022-8-17 21:51

小辣椒 发表于 2022-8-17 21:37
会的就说简单,不会的感觉一座大山在前面

也是

马黑黑 发表于 2022-8-17 21:51

小辣椒 发表于 2022-8-17 21:35
逐句逐字输出这个可以做标题字吧

想做什么都行吧

红影 发表于 2022-8-17 21:57

马黑黑 发表于 2022-8-17 20:09
这个貌似简单的

你那里什么都简单,对别人可不一定{:4_173:}

红影 发表于 2022-8-17 21:58

马黑黑 发表于 2022-8-17 20:09
弄了单行的就顺带弄多行的

太好了,正想要多行的呢{:4_187:}

马黑黑 发表于 2022-8-17 22:39

红影 发表于 2022-8-17 21:58
太好了,正想要多行的呢

其实,不用画布处理这个更省心

马黑黑 发表于 2022-8-17 22:40

红影 发表于 2022-8-17 21:57
你那里什么都简单,对别人可不一定

可是它的确不复杂的

红影 发表于 2022-8-17 23:14

马黑黑 发表于 2022-8-17 22:39
其实,不用画布处理这个更省心

嗯,黑黑弄个过JS的{:4_187:}

红影 发表于 2022-8-17 23:14

马黑黑 发表于 2022-8-17 22:40
可是它的确不复杂的

画布的不熟,觉得都复杂呢{:4_173:}

马黑黑 发表于 2022-8-17 23:14

红影 发表于 2022-8-17 23:14
嗯,黑黑弄个过JS的

基本要依靠JS,纯纯的CSS弄起来很麻烦

马黑黑 发表于 2022-8-17 23:15

红影 发表于 2022-8-17 23:14
画布的不熟,觉得都复杂呢

基础的几个命令,弄熟了就可以的
页: [1] 2 3 4
查看完整版本: canvas画布: 多行文本逐句逐字输出