Canvas實現(xiàn)連線題的方案設(shè)計

????????開發(fā)“連線題”并沒什么難點(diǎn),這里主要分享的是:實現(xiàn)過程中的一點(diǎn)點(diǎn)布局設(shè)計上的小心思翁潘。想要的效果大體長這樣(如下圖所示):

1

????????乍一看似乎需要獲取每個元素的位置信息、計算連線的端點(diǎn)坐標(biāo)客冈,似乎很繁瑣美莫,而且每次頁面尺寸變化時谊路,都得重新計算赊锚。其實成箫,事情可以比想象中簡單很多…

一格郁、方案設(shè)計

????????1.1 將連線題分為上中下三個區(qū)塊腹殿,其中:

????????1)上下區(qū)塊均使用flex(justify-content: space-around)

????????2)中間區(qū)塊為canvas,在style屬性中將width和height設(shè)置為100%

.row-1 { justify-content: space-around; }

.row-2 {

????????height: 0; flex-grow: 1;

????????canvas { width: 100%; height: 100%; }

}

.row-3 { justify-content: space-around; }

2

? ??????1.2 這樣設(shè)置以后例书,有幾點(diǎn)好處

????????1)計算直線端點(diǎn)(元素中點(diǎn))坐標(biāo)就會變得很輕松锣尉,只需要排序百分比與canvas的內(nèi)容寬度相乘即可。

let x1 = (上方元素下標(biāo) * 2 + 1) / (上方元素總數(shù) * 2) * canvas.width

let x2 = (下方元素下標(biāo) * 2 + 1) / (下方元素總數(shù) * 2) * canvas.width

// 連線上方端點(diǎn)坐標(biāo): (x1, 0)

// 連線下方端點(diǎn)坐標(biāo): (x2, canvas.height)

????????2)頁面resize時無需重新計算决采,頁面也不會亂自沧。當(dāng)然如果resize前后差異較大,可能連線粗細(xì)程度會不美觀树瞭。

????????經(jīng)測拇厢,一般不重新繪制也問題不大;如果要求高的話晒喷,可以在resize時重新繪制一下孝偎。(下圖是第一張圖在網(wǎng)頁resize后的效果,線條經(jīng)過拉伸變細(xì)了)

3

????????3)如果你連canvas的尺寸也懶得初始化凉敲,也是可以的衣盾,只不過效果會差些(線條有點(diǎn)模糊,粗細(xì)不美觀)爷抓,Chrome中canvas默認(rèn)內(nèi)容尺寸是300*100势决,效果如下圖所示(截圖可能視覺效果不明顯):

4

二、代碼實現(xiàn)

????????線條繪制的相關(guān)代碼如下:

????????Html

<canvas ref="canvas" :width="cvsWidth" :height="cvsHeight"></canvas>

????????Js

// 動態(tài)調(diào)整canvas的內(nèi)容尺寸(必要時蓝撇,可在每次resize時重復(fù)調(diào)用)

initCanvas() {

? if (!this.$refs.canvas) return

? let cvsInfo = this.$refs.canvas.getBoundingClientRect()

? this.cvsWidth = parseInt(cvsInfo.width)

? this.cvsHeight = parseInt(cvsInfo.height)

},

// 繪制連線

drawLine() {

? if (!this.$refs.canvas) return

? let count = this.dataList.length

? let ctx = this.$refs.canvas.getContext("2d");

? let cvsWidth = this.$refs.canvas.width

? let cvsHeight = this.$refs.canvas.height

? ctx.clearRect(0, 0, cvsWidth, cvsHeight);

? ctx.lineWidth = 4;

? ctx.lineCap = 'round';

? ctx.strokeStyle = '#FF9C0A'

? for (let k in this.answerDict) {

? ? let _i1 = parseInt(k)

? ? let _i2 = this.answerDict[k]

? ? let _i1_x = (_i1 * 2 + 1) / (count * 2) * cvsWidth

? ? let _i2_x = (_i2 * 2 + 1) / (count * 2) * cvsWidth

? ? ctx.beginPath()

? ? ctx.moveTo(_i1_x, 0);

? ? ctx.lineTo(_i2_x, cvsHeight);

? ? ctx.stroke()

? }

},

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末果复,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渤昌,更是在濱河造成了極大的恐慌据悔,老刑警劉巖传透,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異极颓,居然都是意外死亡朱盐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門菠隆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兵琳,“玉大人,你說我怎么就攤上這事骇径∏。” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵破衔,是天一觀的道長清女。 經(jīng)常有香客問我,道長晰筛,這世上最難降的妖魔是什么嫡丙? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮读第,結(jié)果婚禮上曙博,老公的妹妹穿的比我還像新娘。我一直安慰自己怜瞒,他們只是感情好父泳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吴汪,像睡著了一般惠窄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漾橙,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天睬捶,我揣著相機(jī)與錄音,去河邊找鬼近刘。 笑死擒贸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的觉渴。 我是一名探鬼主播介劫,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼案淋!你這毒婦竟也來了座韵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎誉碴,沒想到半個月后宦棺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黔帕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年代咸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成黄。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡呐芥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奋岁,到底是詐尸還是另有隱情思瘟,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布闻伶,位于F島的核電站滨攻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓝翰。R本人自食惡果不足惜光绕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霎箍。 院中可真熱鬧,春花似錦澡为、人聲如沸漂坏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顶别。三九已至,卻和暖如春拒啰,著一層夾襖步出監(jiān)牢的瞬間驯绎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工谋旦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剩失,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓册着,卻偏偏與公主長得像拴孤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甲捏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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