canvas 適配瀏覽器可視窗口出現(xiàn)滾動條問題

一般來說桐玻,對于前端數(shù)據(jù)可視化工程師來說删窒,canvas 是個極好的工具闹蒜。

既能用 canvas 2d 調(diào)用 CanvasRenderingContext2D 的 api 來繪制各種圖表艺玲、圖形彤钟,這個主要依賴 cpu 來計算羞秤。也能用 canvas 3d webgl 來繪制各種圖形缸托、圖表,它主要依賴 gpu 來繪制各種圖形瘾蛋。

最近突然遇到一個問題是俐镐,我有一個 canvas 元素,我想每次出來都讓他自適應(yīng)屏幕可視區(qū)域的大小哺哼。

我第一反應(yīng)就是佩抹,直接設(shè)置 css 屬性 width: 100%; height: 100% ,但是馬上就被我自己給否決了取董。

因為出于以往的經(jīng)驗來說棍苹,在 canvas 元素上用設(shè)置 100% 這種參數(shù),應(yīng)該是達不到這種效果的茵汰。

為了驗證我的猜想枢里,于是我開始寫代碼驗證了:

<!DOCTYPE html>
<html lang="en">
  <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>Document</title>
    <style>
      * {
        padding: 0px;
        margin: 0px;
        border: 0;
      }
      html,
      body {
        height: 100%;
      }
    </style>
  </head>
  <body>
    <script>
      const canvas = document.createElement('canvas');
      document.body.appendChild(canvas);
      canvas.style.width = 100 + '%';
      canvas.style.height = 100 + '%';
      canvas.style.background = '#aaa';
    </script>
  </body>
</html>

然后在瀏覽器中運行頁面:<br />
image.png
image.png

果然不出所料,可以是可以蹂午,但是會出現(xiàn)側(cè)邊滾動條栏豺,這是為什么呢?為什么 div 就沒有這種全屏滾動條呢豆胸?

帶著這種懷疑奥洼,我打開控制臺,看了一下晚胡,原來 canvas 元素的 style 屬性中的 display 為 inline灵奖,是不是因為這個原因?qū)е碌哪兀?/p>

image.png
image.png

于是我改了改其 display 屬性值嚼沿,將其改為 block,發(fā)現(xiàn)果然如我所料桑寨,滾動條消失了:<br />
image.png
image.png

看來碰到問題的時候伏尼,不能急于全盤否定,需要先測試一下尉尾,深究一番到底是什么原因?qū)е陆Y(jié)果與預想的不符爆阶。

知道原因了以后,那么我們就明白了沙咏,可以用哪些方式達到我們想要的效果了辨图。

但是需要注意的一點是,對于 canvas 來說肢藐,style 的 width 和 height 不等同于畫布的大小故河,畫布的大小是 HTMLCanvasElement.prototype.width 和 HTMLCanvasElement.prototype.height 這兩個屬性控制的,可以參考一下 html 標準中的這一段話:

The [canvas](https://html.spec.whatwg.org/multipage/canvas.html#the-canvas-element) element has two attributes to control the size of the element's bitmap: width and height. These attributes, when specified, must have values that are valid non-negative integers. The rules for parsing non-negative integers must be used to obtain their numeric values. If an attribute is missing, or if parsing its value returns an error, then the default value must be used instead. The [width](https://html.spec.whatwg.org/multipage/canvas.html#attr-canvas-width) attribute defaults to 300, and the [height](https://html.spec.whatwg.org/multipage/canvas.html#attr-canvas-height) attribute defaults to 150.

也就是說吆豹,canvas.width 和 canvas.height 才是真正控制畫布大小的鱼的。

一般正常情況下,會將 canvas.width 和 canvas.height 大小調(diào)整到與 canvas.style.width 和 canvas.style.height 等大痘煤。

不然會導致如下圖所示的效果:

image.png
image.png

兩個圖的 canvas.width 和 canvas.height 屬性均為 100凑阶,但是由于 canvas.style.width 和 canvas.style.height 屬性不同,導致一張圖呈現(xiàn)被拉伸的模糊的效果衷快,一般情況下宙橱,我們不希望會出現(xiàn)這樣的效果。

所以接下來蘸拔,我會總結(jié)一下师郑,如果想要將 canvas 畫布設(shè)置為適配瀏覽器窗口大小,需要幾個步驟:

  1. 選擇一種將 canvas 元素適配窗口的方案调窍,無論是百分比宝冕、 vw 等 css 方法,還是采用 js 獲取窗口尺寸再調(diào)整的方法邓萨,請注意一定要調(diào)整下 canvas 元素的 display 屬性或者將父元素的 overflow 設(shè)置為 hidden地梨,否則會出現(xiàn)滾動條。
  2. 將 canvas.width 和 canvas.height 設(shè)置為與其樣式尺寸等大先誉。
  3. 開始編程吧湿刽。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末的烁,一起剝皮案震驚了整個濱河市褐耳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渴庆,老刑警劉巖铃芦,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雅镊,死亡現(xiàn)場離奇詭異,居然都是意外死亡刃滓,警方通過查閱死者的電腦和手機仁烹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咧虎,“玉大人卓缰,你說我怎么就攤上這事∨樗校” “怎么了征唬?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長茁彭。 經(jīng)常有香客問我总寒,道長,這世上最難降的妖魔是什么理肺? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任摄闸,我火速辦了婚禮,結(jié)果婚禮上妹萨,老公的妹妹穿的比我還像新娘年枕。我一直安慰自己,他們只是感情好眠副,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布画切。 她就那樣靜靜地躺著,像睡著了一般囱怕。 火紅的嫁衣襯著肌膚如雪霍弹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天娃弓,我揣著相機與錄音典格,去河邊找鬼。 笑死台丛,一個胖子當著我的面吹牛耍缴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挽霉,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼防嗡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侠坎?” 一聲冷哼從身側(cè)響起蚁趁,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎实胸,沒想到半個月后他嫡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體番官,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年钢属,在試婚紗的時候發(fā)現(xiàn)自己被綠了徘熔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡淆党,死狀恐怖酷师,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情染乌,我是刑警寧澤窒升,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站慕匠,受9級特大地震影響饱须,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜台谊,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一蓉媳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锅铅,春花似錦酪呻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贼邓,卻和暖如春阶冈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塑径。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工女坑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人统舀。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓匆骗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親誉简。 傳聞我的和親對象是個殘疾皇子碉就,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容