canvas繪製文本內容自動換行

原型要求:

要求製做一個邀請卡頁面,其中標題字數是動態的,最多可顯示2行,若是超出2行則第2行內容結尾添加省略號。根據產品妹子的性格,四行這個設置到時很大機會改,因此這裏必定不能寫死,結果前幾天真的要求改爲了最多可顯示4行 ,其餘照舊。產品妹子too young :)!chrome

廢話不說,下面貼代碼,獻醜了!上代碼以前先看一下須要傳的參數!!瀏覽器


圖文並茂的參數說明,原諒我捉急的PS技術和設計

圖片描述

  1. ctx: 畫布的上下文環境
  2. content: 須要繪製的文本內容
  3. drawX: 繪製文本的x座標
  4. drawY: 繪製文本的y座標
  5. lineHeight:文本之間的行高
  6. lineMaxWidth:每行文本的最大寬度
  7. lineNum:最多繪製的行數
// 文字自動換行
function textPrewrap(ctx, content, drawX, drawY, lineHeight, lineMaxWidth, lineNum) {
    var drawTxt = ''; // 當前繪製的內容
    var drawLine = 1; // 第幾行開始繪製
    var drawIndex = 0; // 當前繪製內容的索引

    // 判斷內容是否能夠一行繪製完畢
    if(ctx.measureText(content).width <= lineMaxWidth) {
        ctx.fillText(content.substring(drawIndex, i), drawX, drawY);
    } else {
        for (var i = 0; i < content.length; i++) {
                drawTxt += content[i];
                if (ctx.measureText(drawTxt).width >= lineMaxWidth) {
                    if (drawLine >= lineNum) {
                        ctx.fillText(content.substring(drawIndex, i) + '..', drawX, drawY);
                        break;
                    } else {
                        ctx.fillText(content.substring(drawIndex, i + 1), drawX, drawY);
                        drawIndex = i + 1;
                        drawLine += 1;
                        drawY += lineHeight;
                        drawTxt = '';
                    }
                } else {
                    // 內容繪製完畢,可是剩下的內容寬度不到lineMaxWidth
                    if (i === content.length - 1) {
                        ctx.fillText(content.substring(drawIndex), drawX, drawY);
                    }
                }
            }
    }
}

意外發現

在繪製文字的過程當中發現,繪製文字的y座標是不是以文字上方作標準,一圖勝多言,上圖!字體

瀏覽器環境: chrome 71.0.3578.98(正式版本)(64 位)spa

字體大小爲40px設計

繪製的y座標爲0時,能夠看到文本再左上角只漏了一點點出來

圖片描述

繪製的y座標爲40時,能夠看到文本能夠徹底顯示

圖片描述


後記

這是一個比較冷門的代碼效果,可是也但願能夠幫到有須要的朋友
若有幫助的請輕輕點下一個贊表示鼓勵!謝謝 :)
若是看到這裏首先很感謝花費您一些寶貴的時間看到這裏,若有錯誤的地方但願各位大佬指出錯誤,謝謝:)code

關閉手機鬧鐘,睡了!明天起來看 雷馬大戰 !哦吼blog

2019 coding and basketball!

相關文章
相關標籤/搜索