如何用HTML5技術(shù)畫一條二維曲線

最近項(xiàng)目中的設(shè)計(jì)圖上有一條曲線設(shè)計(jì)風(fēng)格,就想著能不用切圖的方法實(shí)現(xiàn)嗎?(畢竟切圖好討厭的(≧▽≦)/)泪电。就研究了一下實(shí)現(xiàn)方式般妙。在此纪铺,給大家做一下參考。

設(shè)計(jì)參考圖.png

Border的實(shí)現(xiàn)方式

大家都知道碟渺,CSS3中border已經(jīng)可以實(shí)現(xiàn)一定的弧度鲜锚。因此,就想著可以利用border的特性畫一條曲線苫拍。

1.首先我們先建一個(gè)div元素

  <div class="container">
      <div class="curve"></div>
  </div>

2.給它一些基本樣式

.container {
  width: 500px;
  height: 200px;
  border: 1px solid black;
  text-align: center;
  box-shadow: 5px 5px 3px rgba(125, 125, 126, 0.7);
  position: relative;
}

.curve {
      position: absolute;
      width: 250px;
      height: 30px;
      border-bottom: 1px solid red;
      border-right: 1px solid red;
      border-bottom-right-radius: 100%;
      bottom: 0;
}

.curve:after {
      content: "";
      position: absolute;
      width: 250px;
      height: 30px;
      border-top: 1px solid red;
      border-left: 1px solid red;
      border-top-left-radius: 100%;
      left: 250px;
      bottom: 30px;
}

最終效果:

border-curve.png

從效果上看芜繁,這個(gè)方法實(shí)現(xiàn)的曲線過(guò)渡處不夠平滑,仍存在較大缺陷绒极。下面就介紹兩個(gè)更加常用的方法骏令。

SVG方式

在搜索實(shí)現(xiàn)方案的過(guò)程中,發(fā)現(xiàn)一個(gè)好用的工具,可以用它來(lái)調(diào)試出復(fù)雜的曲線垄提。根據(jù)設(shè)計(jì)稿的線條榔袋,很快就調(diào)試出來(lái)一個(gè)svg的路徑參數(shù)。

<path d="M20,283 C208,288 282,195 472,201" />

接著铡俐,修飾一下該曲線凰兑,就能得到我們所需要的效果了。

  <svg width="500" height="300" xmlns="http://www.w3.org/2000/svg" version="1.1">
    <g>
      <path d="M20,283 C208,288 282,195 472,201"  fill="none" stroke="black" stroke-width="3" stroke-linecap="round"/>
    </g>
  </svg>

最終效果如圖:

svg-curve-demo.png

在線嘗試codepen

Canvas的實(shí)現(xiàn)方式

發(fā)現(xiàn)Canvas真的是個(gè)好東西审丘,可以用前端實(shí)現(xiàn)很多特效吏够。當(dāng)然畫個(gè)曲線對(duì)于它來(lái)說(shuō),簡(jiǎn)直小菜一碟。
這里會(huì)用到貝塞爾曲線(bezierCurve)的一些知識(shí)锅知。該曲線會(huì)利用到四個(gè)點(diǎn)作為定位點(diǎn)播急,分別為頭和尾點(diǎn)還有兩個(gè)控制點(diǎn)用來(lái)控制整個(gè)曲線的形狀和曲率。具體可以參考維基百科上的相關(guān)介紹售睹。

1.創(chuàng)建一個(gè)canvas元素

  <canvas id="myCanvas"></canvas>

2.利用bezierCurveTo這個(gè)方法來(lái)畫該曲線旅择。由于這個(gè)方法相關(guān)參數(shù)難以確定,我同樣選擇了一個(gè)工具來(lái)獲取所需要的具體參數(shù)數(shù)值侣姆。

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
canvas.width = '500';
canvas.height = '400';
context.beginPath();
context.fillStyle = '#00000';
context.moveTo(64,288);
context.bezierCurveTo(208,286,257,201,420,200);
context.stroke();
//以下兩行是畫邊框
context.fillStyle = "#ff0000";
context.strokeRect(0, 0, canvas.width, canvas.height);

至此生真,我們就得到了我們想要的曲線了。

canvas-curve-demo.png

參考資料

How to Draw Quadratic Curves on an HTML5 Canvas
在線SVG編輯器
MDN SVG Tutorial

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捺宗,一起剝皮案震驚了整個(gè)濱河市柱蟀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚜厉,老刑警劉巖长已,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昼牛,居然都是意外死亡术瓮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門贰健,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胞四,“玉大人,你說(shuō)我怎么就攤上這事伶椿」嘉埃” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脊另,是天一觀的道長(zhǎng)导狡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)偎痛,這世上最難降的妖魔是什么旱捧? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮踩麦,結(jié)果婚禮上枚赡,老公的妹妹穿的比我還像新娘。我一直安慰自己靖榕,他們只是感情好标锄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茁计,像睡著了一般料皇。 火紅的嫁衣襯著肌膚如雪谓松。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天践剂,我揣著相機(jī)與錄音鬼譬,去河邊找鬼。 笑死逊脯,一個(gè)胖子當(dāng)著我的面吹牛优质,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播军洼,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼巩螃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匕争?” 一聲冷哼從身側(cè)響起避乏,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甘桑,沒想到半個(gè)月后拍皮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跑杭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年铆帽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片德谅。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爹橱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出女阀,到底是詐尸還是另有隱情宅荤,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布浸策,位于F島的核電站,受9級(jí)特大地震影響惹盼,放射性物質(zhì)發(fā)生泄漏庸汗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一手报、第九天 我趴在偏房一處隱蔽的房頂上張望蚯舱。 院中可真熱鬧,春花似錦掩蛤、人聲如沸枉昏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兄裂。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晰奖,已是汗流浹背谈撒。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匾南,地道東北人啃匿。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛆楞,于是被迫代替她去往敵國(guó)和親溯乒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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