1. 程式人生 > >HTML5 canvas 繪製的文字如何換行?

HTML5 canvas 繪製的文字如何換行?

HTML5 裡的 canvas 元素是一個圖形容器,我們可以通過 JavaScript 來控制它繪製各種文字和影象。

在使用 canvas 繪製某字串的時候,我們可能想要讓該字串在某處按要求換行。

這該怎麼實現呢?

你是不是想到了 JavaScript 裡的轉義字元 “\n” (換行符)?
在字串里加入 “\n” 在繪製時會有換行效果嗎?讓我們試一試:

example.html

<!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <title
>
Example</title> </head> <body> <canvas id="canvas" height="400" width="400"></canvas> </body> <script src="main.js"></script> </html>

main.js

var c = document.getElementById("canvas");
var context = c.getContext("2d");

function draw(){  
    context.font
= "20px Arial"; context.fillStyle = "black"; context.textBaseline = "middle"; context.fillText("Hello, World!\nWhat a nice day.",0,10); } draw();

效果如圖

可以發現,文字並沒有換行
接下來,讓我們來對比一下,看看加不加“\n”對文字繪製有沒有影響

將draw()函式裡的程式碼改動一下:

function draw(){  
    context.font = "20px Arial";
    context.fillStyle
= "black"; context.textBaseline = "middle"; context.fillText("Hello, World!What a nice day.",0,10); context.fillText("Hello, World!\nWhat a nice day.",0,30); }

對比效果如圖

這裡寫圖片描述

上面的是沒加 “\n” 的效果,下面是加了 “\n” 的效果

看起來上下兩個的效果就差了一個空格而已。這個空格哪來的?
其實,這個不是空格,而是 canvas 無法顯示這個換行符,而顯示出的一個佔位符

為什麼輸入 “\n” 從沒法換行呢?
我個人覺得,是因為瀏覽器無法知道你的下一行字串的起始座標應該在哪

沒有現成的,沒關係,我們可以自己自己動手創造一個

/****繪製自動換行的字串****/

function drawText(t,x,y,w){

    var chr = t.split("");
    var temp = "";              
    var row = [];

    context.font = "20px Arial";
    context.fillStyle = "black";
    context.textBaseline = "middle";

    for(var a = 0; a < chr.length; a++){
        if( context.measureText(temp).width < w ){
            ;
        }
        else{
            row.push(temp);
            temp = "";
        }
        temp += chr[a];
    }

    row.push(temp);

    for(var b = 0; b < row.length; b++){
        context.fillText(row[b],x,y+(b+1)*20);
    }
}

把這個函式加進main.js裡,然後再往draw()函式加上一行:

drawText("Hello, World!What a nice day.",0,30,110);

效果看起來還不錯:
這裡寫圖片描述

這是怎麼做到的呢?

其實不難。簡單來說,就是將需要換行的字串用split方法分割成一個以單個字元為元素的陣列,然後將該陣列的每個元素(也就是每個字元)依次拼接成一個臨時字串,然後測量臨時字串的長度。如果臨時字串的長度大於等於規定長度,就把該臨時字串看做一行,然後將剩下的字元繼續拼接;否則就繼續拼接,直至字元全部拼接完畢。最後,將每行的字串以一定間隔按順序輸出,就實現了換行的效果。

上面的drawText()函式還有很多可以完善的地方,大家可以根據要求自行改良

相關推薦

canvas文字

當canvas的寬度不夠寬時,canvas不會自動換行,可以用下面的程式碼處理 <body> <canvas id="canvas" width="200" height="200" style="background:pink;"></canvas>

HTML5 canvas 繪製文字如何

HTML5 裡的 canvas 元素是一個圖形容器,我們可以通過 JavaScript 來控制它繪製各種文字和影象。 在使用 canvas 繪製某字串的時候,我們可能想要讓該字串在某處按要求換行。 這該怎麼實現呢? 你是不是想到了 JavaScript 裡

小程序---canvas畫圖,生成分享圖片,畫圖文字

return 指正 png ttext def fun context lte ctx 小程序目前只支持轉發,不支持分享朋友圈,為了能實現分享,很多線上小程序通過生成分享圖片,保存到相冊來給用戶增加分享的可能。 具體思路及簡要代碼如下: 一:canvas畫圖 draw

微信小程式canvas文字效果

我們在canvas上繪製多行文字的時候,不可能一行一行的繪製,這時就需要到了換行這個功能。 文字換行 引數:1、canvas物件,2、文字 3、距離左側的距離 4、距離頂部的距離 5、(不用管)6、文字的寬度 //文字換行 引數:1、canvas物件,2、文字 3、距離

Cocos2d-x 更改文字風格 ( cocos2dx change line )

pad 限制長度 != inline detail _id 興趣研究 end sans Cocos2dx change line在 cocos2dx change line 的實現中,我們能夠簡單的使用 dimensions屬性控制換行。使用它僅僅需將相應的參數值傳入構造

textarea placeholder文字

line 設置 div span text 技術分享 源代碼 tor unicode 要實現這樣的效果 第一反應是直接在placeholder屬性值裏輸入\n換行,如: <textarea rows="5" cols="50" placeholder="1

div寬度固定,將其中的文字,並動態獲取div的高

rip title oat clas 獲取 pre jquery logs -c <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title&

echarts x軸文字顯示

mat rownumber false 管控 ffffff style slab 社交 知識                   xAxis : [ {

CSS文字加省略號

文字換行的後需要對超出的內容加省略號,text-overflow: ellipsis 無法實現此需求 更多精彩 更多技術部落格,請移步 asing1elife’s blog 解決 overflow: hidden; // 只有webkit核心瀏

p標籤中的文字

參考文章 word-break:break-all和word-wrap:break-word的區別 CSS自動換行、強制不換行、強制斷行、超出顯示省略號 屬性介紹 white-space: 如何處理元素中的空白 normal: 預設, 被瀏覽器忽略空白 pre: 空白被瀏覽器保

Canvas繪製文字(七)

canvas的文字是以圖形形式繪製的,實際他不是文字,只是像文字而已;一旦繪製之後,無法編輯,除非擦除文字,重新繪製。沒有充分的理由,最好使用普通的HTML元素,否則一定不要在canvas中建立文字。   context.fillText(text,x,y); 引數x,y表示文字原

css DIV中文字顯示

區別 white-space:normal; word-break:break-all; word-wrap:break-word; 新增上上邊的三句就可以換行 這三句重點在於:word-break與word-wrap a:word-break 屬性規定自

RichTextBox文字

RichTextBox顯示多行文字就得把它的Multiline屬性設定為true。 直接加一個換行符"\n": RichTextBox1.Text = "First Line\nSecond Line\nThird Line"; 顯示的結果(沒有換行)為"First LineSecond L

UITextView 文字

I need to indicated a 'new line' in a string in an XML file I'm loading. If I hard code the string: myTextView.text =[NSString stringWith

mysql servlet呼叫插入帶有格式的大文字符無效的問題

做一個圖書管理系統,需要將圖書目錄存在伺服器的資料庫中,然後再安卓客戶端中呼叫資料並顯示,一開始直接將大文字存成Varchar格式,發現這個格式存的文字似乎都沒有格式,換行符都沒有作用。後來查資料發現應該存成text格式。但是存成text格式以後換行符依然無效,組後通過sq

《CSS3實戰》筆記--溢位文字省略:text-overflow和文字顯示:word-wrop

通過閱讀和學習書籍《CSS3實戰》總結 《CSS3實戰》/成林著.—北京機械工業出版社2011.5 語法: text-overflow:clip | ellipsis | ellipsis-word 取值簡單說明: clip屬

Objective-C文字方式(解決英文在行末時的問題)

我們在做文字資訊展示的時候會遇到這種情況:中文+英文(數字),當英文或者數字在行末並且過長的時候,這種情況下系統會預設把整個英文換到下一行展示。這樣就會造成上一行顯示不滿的情況。 如果是UILabel的話直接設定lineBreakMode屬性即可: la

WPF 文字TextWrapping 顯示不全用省略號TextTrimming 顯示不全彈提示內容ToolTip

aml aaa esp tails ipc tool except idt else 原文:WPF 文字換行TextWrapping 顯示不全用省略號TextTrimming 顯示不全彈提示內容ToolTip

css 多文字

每次做專案 都能碰到文字換行 尤其是標題和名稱 ,都得百度一下,今天特意記下來 今天主題是超長英文文字自動換行word-wrap的使用,在介紹這個屬性的同時,我還把word-break和white-space兩個屬性一起放進來介紹,因為這幾個屬性常給我平時的製

通過html5 canvas繪製時鐘

最近一直在學習html5,學到了html5的canvas標籤,這個畫布真的是很強大,它有對應的javascript的api的支援,你可以在這個標籤裡面繪製任意的圖形,你也可以把圖片放在裡面,能夠做出很炫的效果。 言歸正傳,廢話不多說,首先,html,只一句