HTML5Canvas遇到的幾個問題
最近在一個專案中嘗試通過Hybrid的方式開發客戶端程式,來儘量降低由於程式業務邏輯或者顯示介面的改變而來的升級困擾。Hybrid的方式就是原生程式碼和HTML5應用相結合的方式,其中原生程式碼負責和底層的硬體打交道,通過WebView提供的介面將硬體資料傳遞給執行其中HTML頁面。這種方式很適合既要和硬體打交道,客戶端業務邏輯頁面也不是太複雜的應用。當然這篇文章不是講Hybrid,而是在實現HTML頁面時遇到Canvas的問題。
1. height、width和style.height、style.width
在之前開發的頁面中,一般都是通過CSS來控制頁面上元素的尺寸。剛開始使用Canvas時,也採用了同樣的方式,可是結果卻出人意料。程式碼如下:
<div id="wrapper"> <canvas height="50" id="canvas1" style="width:100%"></canvas>
<canvas height="50" id="canvas2" style="width:100%"></canvas>
<div>
根據響應式網頁設計原則,用百分比控制元素的尺寸可以使其自適應瀏覽器視窗不同的解析度的變化。可是,對Canvas卻不是這樣。當上面的程式碼執行後,每次都會出現的不同的效果,有時canvas1的寬度只有不到wrapper的一半,而有時高度有莫名其妙的達到了近400px。裡面繪製的線條更是找不到影子。
直到在Stackoverflow上發現了:http://stackoverflow.com/questions/4938346/canvas-width-and-height-in-html5,才明白就裡。原來Canvas的實際尺寸是通過height和width來控制的;CSS中得height和width使其顯示的大小,所以設定了它們就相當於縮放了顯示區域,所以才會變形。找到了原因,自然就容易解決問題了:
<div id="wrapper"> <canvas id="canvas1" height="50" width="300"></canvas> <canvas id="canvas2" height="50" width="300"></canvas> </div>
下面是用來設定尺寸的JavaScript:
function resizeCanvas(){ var width = document.getElementById(`wrapper`).offsetWidth; $(`#canvas1`).attr(`width`, width); $(`#canvas2`).attr(`width`, widht); }
2. clearRect無法清除指定區域
在應用中會定時重繪Canvas,每次都繪製之前都會用clearRect,將整個Canvas內容清除。剛開始執行時,還沒有問題,大概執行了1個小時後就會出現內容無法清除的情況,暫時沒有找到原因。在上面的那個回答中提到了重設Canvas的大小會清除原來繪製的內容,所以就採用了下面的方式:
var context = document.getElement(`canvas1`).getContext(`2d`); var width = $(`#canvas`).attr(`width`); $(`#canvas1`).attr(`width`,0); $(`#canvas1`).attr(`width`,width); context.clearRect(0, 0, width, $(`#canvas1`).attr(`height`));
測試了一段時間,還沒有發現問題。
相關文章
- 最近遇到的幾個LINUX問題Linux
- npm module 釋出 遇到的幾個問題NPM
- 開發以太坊遇到的幾個問題
- 今晚實施goldengate遇到的幾個問題Go
- 配置tnsnames.ora遇到的幾個問題總結
- 這幾天遇到的 jQuery 問題jQuery
- 微信小程式開發中遇到的幾個小問題微信小程式
- 如何避免學習linux必然會遇到的幾個問題Linux
- 【DataBase】:使用Oracle遇到的幾個問題及解決辦法DatabaseOracle
- Python學習者可能存在的幾個問題,你遇到過嗎?Python
- 前端自動指令碼中常見的幾個問題,你遇到了嗎?前端指令碼
- 從ACCESS轉到學習SQL SERVER所遇到的幾個問題 (轉)SQLServer
- 請教個問題執行 httprunner 遇到的問題HTTP
- iOS APNs的幾個問題iOS
- 關於VMware Workstation CentOS虛擬機器聯網遇到的幾個問題CentOS虛擬機
- 2015年4月8日工作遇到的幾個問題
- 最近幾天做oracle stream遇到很多問題Oracle
- Java面試常問的幾個問題Java面試
- jmeter 遇到的一個場景問題JMeter
- vs2015cordova環境安裝【個人遇到的幾個問題】
- Typora 使用中的幾個問題
- 面試官常問的Nginx的幾個問題面試Nginx
- 分散式系統遇到的十個問題分散式
- 遇到一個git branch很奇怪的問題Git
- 工作遇到的問題
- mysql 遇到的問題MySql
- 6 個 K8s 日誌系統建設中的典型問題,你遇到過幾個?K8S
- azkaban 安裝中的幾個問題
- 入行 AI 的幾個常見問題AI
- Redis學習的幾個小問題Redis
- 圖靈社群的幾個小問題圖靈
- 搭建dataguard碰到的幾個小問題
- 面試官常問的Nginx的那幾個問題?面試Nginx
- DB2 SSL配置遇到的一個問題DB2
- 適配Android N遇到的兩個問題Android
- lvs 負載均衡遇到的一個問題. (問題解決)負載
- 曾經遇到的一個另類的排序問題.排序
- 有幾點是安裝oracle10g時遇到的問題Oracle