<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> <style type="text/css"> body { padding: 20px; background: #eee; } #canvas { border: 1px solid #ccc; } </style> </head> <body> <canvas id="canvas" width="600" height="400"></canvas> </body> <script type="text/javascript"> //尋找切換斷點 function findBreakPoint(text, width, context) { var min = 0; var max = text.length - 1; while (min <= max) { var middle = Math.floor((min + max) / 2); var middleWidth = context.measureText(text.substr(0, middle)).width; var oneCharWiderThanMiddleWidth = context.measureText(text.substr(0, middle + 1)).width; if (middleWidth <= width && oneCharWiderThanMiddleWidth > width) { return middle; } if (middleWidth < width) { min = middle + 1; } else { max = middle - 1; } } return -1; } function breakLinesForCanvas(text, width, font) { var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); var result = []; var breakPoint = 0; if (font) { context.font = font; } while ((breakPoint = findBreakPoint(text, width, context)) !== -1) { result.push(text.substr(0, breakPoint)); text = text.substr(breakPoint); } if (text) { result.push(text); } return result; } var result = breakLinesForCanvas( '使用很尋常的二分查找,如果某一個位置之前的文字寬度小於等於設定的寬度,並且它之后一個字之前的文字寬度大於設定的寬度,那么這個位置就是文本的換行點。上面只是找到一個換行點,對於輸入的一段文本,需要循環查找,直到不存在這樣的換行點為止, 完整的代碼如下', 300, '16px 微軟雅黑'); console.log(result); var lineHeight = 30; var context = document.getElementById('canvas').getContext('2d'); context.font = "16px 微軟雅黑"; result.forEach(function(line, index) { context.fillText(line, 100, lineHeight * index + 30); }); </script> </html>