開發 H5 遇到過幾回豎排文字的需求,把實現思路梳理一下。javascript
<input>
標籤沒有豎排的屬性,最早嘗試修改 <input>
的樣式來實現效果,可是效果不理想。最後使用 HTML 的 contenteditable
屬性。css
想經過限定 輸入框的寬度 與 文字的大小 ,讓文字自動換行。html
input{
width: 30px;
height: 250px;
font-size: 30px;
}
複製代碼
contenteditable
屬性代替 <input>
(推薦)HTML 的 contenteditable
屬性規定元素內容是否可編輯。java
<div contenteditable="true" style="writing-mode: vertical-lr; writing-mode: tb-lr; "></div>
複製代碼
contenteditable
屬性使 div 可編輯writing-mode
屬性讓文字垂直排列Canvas 一樣沒有豎排文字的屬性,我經過遍歷文字的方式進行繪製。web
let name; // 文本內容
let x = 657,y=170; // 文字開始的座標
let letterSpacing = 10; // 設置字間距
for(let i = 0; i < this.name.length; i++){
const str = this.name.slice(i,i+1).toString();
if(str.match(/[A-Za-z0-9]/)&&(y<576)){ // 非漢字 旋轉
ctx.save();
ctx.translate(x,y);
ctx.rotate(Math.PI/180*90);
ctx.textBaseline = 'bottom';
ctx.fillText(str,0,0);
ctx.restore();
y+=ctx.measureText(str).width+letterSpacing; // 計算文字寬度
}else if(str.match(/[\u4E00-\u9FA5]/)&&(y<576)){
ctx.save();
ctx.textBaseline = 'top';
ctx.fillText(str,x,y);
ctx.restore();
y+=ctx.measureText(str).width+letterSpacing; // 計算文字寬度
}
}
複製代碼
measureText()
計算字符寬度,使中英文字間距更和諧