Canvas基礎(chǔ)知識(shí)

總結(jié)一些基礎(chǔ)知識(shí)

1. 畫一條直線

  • moveTo設(shè)置起點(diǎn),lineTo設(shè)置下一坐標(biāo)
<canvas id="canvas"></canvas>
<script>
    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");
        // 設(shè)置狀態(tài)
        context.beginPath();
        context.moveTo(100, 100);// 起點(diǎn)
        context.lineTo(700, 700);// 下一點(diǎn)坐標(biāo)
        context.closePath();
        context.lineWidth = 10;// 線寬
        context.strokeStyle = "#0f0";// 顏色
        
        // 繪制
        context.stroke();
    }
</script>
  • lineCap屬性 - 設(shè)置線段起始位置的樣式击费,取值如下
    butt:(default)默認(rèn)值
    round:圓頭
    square:方頭
<canvas id="canvas"></canvas>
<script>
    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");

        context.lineWidth = 30;
        context.strokeStyle = "tomato";

        context.beginPath();
        context.moveTo(100, 100);
        context.lineTo(400, 100);
        context.lineCap = "butt";
        context.stroke();

        context.beginPath();
        context.moveTo(100, 200);
        context.lineTo(400, 200);
        context.lineCap = "round";
        context.stroke();

        context.beginPath();
        context.moveTo(100, 300);
        context.lineTo(400, 300);
        context.lineCap = "square";
        context.stroke();
        // 輔助線
        context.lineWidth = 1;
        context.beginPath();
        context.moveTo(100, 50);
        context.lineTo(100, 350);
        context.stroke();

        context.beginPath();
        context.moveTo(400, 50);
        context.lineTo(400, 350);
        context.stroke();
    }
</script>

結(jié)果如下:


lineCap
  • lineJoin屬性- 兩條直線相交處的樣式拢蛋,可取值如下:
    miter:(default),尖角蔫巩,miterLimit 默認(rèn)值10,控制尖角的長(zhǎng)度谆棱,只有設(shè)置miter時(shí)生效。
    bevel:斜接
    round: 圓角
<canvas id="canvas"></canvas>
<script>
    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");

        context.lineWidth = 50;
        context.strokeStyle = "tomato";

        context.beginPath();
        context.moveTo(300, 300);
        context.lineTo(400, 100);
        context.lineTo(500, 300);
        context.lineJoin = "miter";
        context.miterLimit = 10;
        context.stroke();

        context.beginPath();
        context.moveTo(300, 500);
        context.lineTo(400, 300);
        context.lineTo(500, 500);
        context.lineJoin = "bevel";
        context.miterLimit = 10;
        context.stroke();

        context.beginPath();
        context.moveTo(300, 700);
        context.lineTo(400, 500);
        context.lineTo(500, 700);
        context.lineJoin = "round";
        context.miterLimit = 10;
        context.stroke();
    }
</script>

示意圖如下:


lineJoin

2. 畫一個(gè)矩形

(1).直接使用連線的方式畫出矩形圆仔。

<canvas id="canvas"></canvas>
<script>

    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");
        context.beginPath();
        context.moveTo(100, 100);
        context.lineTo(600, 100);
        context.lineTo(600, 600);
        context.lineTo(100, 600);
        context.lineTo(100, 100);//可以省略垃瞧,closePath()會(huì)自動(dòng)封閉圖形
        context.closePath();

        context.lineWidth = 10;
        context.strokeStyle = "#0f0";

        context.stroke();
    }
</script>

(2).使用context.rect(x, y, width, height)規(guī)劃路徑,這里只規(guī)劃路徑坪郭,不會(huì)繪制个从。
context.fillRect(x, y, width, height), context.strokeRect(x, y, width, height)不但規(guī)劃路徑,還將矩形直接繪制出來(lái)歪沃。

<canvas id="canvas"></canvas>
<script>

    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");

        drawRect(context, 100, 100, 300, 200, 5, "blue", "red");
        drawRect2(context, 250, 200, 300, 200, 5, "blue", "rgba(0, 255, 0, 0.5)");


    }

    function drawRect(cxt, x, y, width, height, borderWidth, borderColor, fillColor){
        cxt.beginPath();
        cxt.rect(x,y, width, height); // 規(guī)劃路徑
        cxt.closePath();

        cxt.lineWidth = borderWidth;
        cxt.fillStyle = fillColor;
        cxt.strokeStyle = borderColor;

        cxt.fill();
        cxt.stroke();
    }
    function drawRect2(cxt, x, y, width, height, borderWidth, borderColor, fillColor){
        cxt.lineWidth = borderWidth;
        cxt.fillStyle = fillColor;
        cxt.strokeStyle = borderColor;

        cxt.fillRect(x, y, width, height); // 填充
        cxt.strokeRect(x, y, width, height);
    }
</script>

fillStyle, strokeStyle 可取顏色值如下:
#ffffff 嗦锐、#fff、
rgb(255, 255, 100)沪曙、rgba(100, 100, 100, 0.8)奕污、
hsl(20, 62%, 28%)、 hsla(30, 82%, 45%, 0.6)珊蟀、
red

3. 圖形變換

  • 位移:translate(x, y)
  • 旋轉(zhuǎn):rotate(deg)
  • 縮放:scale(sx, sy) , sx - x方向縮放倍數(shù)菊值,sy - y方向縮放倍數(shù)。
  • 變換矩陣
    a c e ???????? a - 水平縮放(1) ;?? b - 水平傾斜(0)
    b d f ???????? c - 垂直傾斜(0) ;?? d - 垂直縮放(1)
    0 0 1 ???????? e - 水平位移(0);?? f - 垂直位移(0)
  • 設(shè)置變換矩陣:
    transform(a, b, c, d, e, f)
    setTransform(a, b, c, d, e, f) 設(shè)置變換后的默認(rèn)值
  • canvas狀態(tài)的保存與恢復(fù)
    context.save();
    context.restore();
<canvas id="canvas" style="border: 1px solid #000;"></canvas>
<script>

   window.onload = function () {
       var canvas = document.getElementById("canvas");

       canvas.width = 800;
       canvas.height = 800;

       var context = canvas.getContext("2d");

       context.save();
       context.fillStyle = "red";
       context.translate(100, 100);
       context.fillRect(0, 0, 400, 400);
       context.restore();

       context.save();
       context.fillStyle = "green";
       context.translate(300, 300);
       context.fillRect(0, 0, 400, 400);
       context.restore();
   };
<canvas id="canvas"></canvas>
<script>

    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");

        context.fillStyle = "#000";
        context.fillRect(0, 0, canvas.width, canvas.height);

        for(var i = 0; i < 200; i++){
            var r = Math.random()*10+10;
            var x = Math.random()*canvas.width;
            var y = Math.random()*canvas.height;
            var a = Math.random()*360;
            drawStar(context, x, y, r, a)
        }
    };

    function drawStar(cxt, x, y, R, rot){
        var rot = rot || 0;

        cxt.fillStyle = "#fb3";
        cxt.strokeStyle = "#fd5";
        cxt.lineWidth = 3;

        cxt.save();
        cxt.transform(R, 0, 0, R, x, y);
        // cxt.translate(x, y);
        cxt.rotate(rot/180*Math.PI);
        // cxt.scale(R, R);

        starPath(cxt);

        cxt.fill();
        cxt.stroke();

        cxt.restore();

    }
    function starPath(cxt){
        cxt.beginPath();

        for(var i = 0; i < 5; i ++){
            cxt.lineTo(Math.cos((18 + i*72 ) / 180 * Math.PI),
                -Math.sin((18 + i*72) / 180 * Math.PI) );
            cxt.lineTo(Math.cos((54 + i*72) / 180 * Math.PI) * 0.5,
                -Math.sin((54 + i*72 ) / 180 * Math.PI) * 0.5);
        }
        cxt.setTransform(1, 0, 0, 1, 0, 0);//清除上一次的影響
        cxt.closePath();
    }
</script>

4. fillStyle - 線性漸變&徑向漸變

  • 線性漸變
    //step1
    var grd = context.createLinearGradient(xstart, ystart, xend, yend);
    //step2
    grd.addColorStop(stop, color);
<canvas id="canvas"></canvas>
<script>
    window.onload = function () {
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 800;
        var context = canvas.getContext("2d");

        var linearGrad = context.createLinearGradient(0, 0, 800, 800);
        linearGrad.addColorStop(0.0, 'white');
        linearGrad.addColorStop(0.25, 'yellow');
        linearGrad.addColorStop(0.5, 'green');
        linearGrad.addColorStop(0.75, 'blue');
        linearGrad.addColorStop(1.0, 'black');

        context.fillStyle = linearGrad;
        context.fillRect(0, 0, 800, 800);
    }
</script>
  • 徑向漸變
    //step1
    var grd = context.createRadialGradient(x0, y0, r0, x1, y1, r1);
    //step2
    grd.addColorStop(stop, color);
<canvas id="canvas"></canvas>
<script>
    window.onload = function () {
        var canvas = document.getElementById("canvas");
        canvas.width = 800;
        canvas.height = 800;
        var context = canvas.getContext("2d");

        var linearGrad = context.createRadialGradient(400, 400, 100, 400, 400, 400);
        linearGrad.addColorStop(0.0, 'white');
        linearGrad.addColorStop(0.25, 'yellow');
        linearGrad.addColorStop(0.5, 'green');
        linearGrad.addColorStop(0.75, 'blue');
        linearGrad.addColorStop(1.0, 'black');

        context.fillStyle = linearGrad;
        context.fillRect(0, 0, 800, 800);
    }
</script>

5. createPattern

  • createPattern(img, repeat-style)
    repeat-style:no-repeat; repeat-x; repeat-y; repeat
  • createPattern(canvas, repeat-style)
  • createPattern(video, repeat-style)

6.曲線繪制

  • 圓或圓弧

context.arc(context, center, radius, startingAngle, endingAngle, anticlockwiae)
anticlockwiae = false 順時(shí)針

<canvas id="canvas"></canvas>
<script>
    window.onload = function(){
        var canvas = document.getElementById("canvas");

        canvas.width = 1024;
        canvas.height = 768;

        var context = canvas.getContext("2d");

        context.lineWidth = 2;
        context.strokeStyle = "#058";

        for(var i = 0; i < 10; i ++){
            context.beginPath();
            context.arc(50 + i*100, 60, 40, 0,2*Math.PI*(i+1)/10);
            context.closePath();//會(huì)自動(dòng)閉合

            context.stroke()
        }

        for(var i = 0; i < 10; i ++){
            context.beginPath();
            context.arc(50 + i*100, 180, 40, 0,2*Math.PI*(i+1)/10);

            context.stroke()
        }

        for(var i = 0; i < 10; i ++){
            context.beginPath();
            context.arc(50 + i*100, 300, 40, 0,2*Math.PI*(i+1)/10, true);
            context.closePath();//會(huì)自動(dòng)閉合

            context.stroke()
        }

        for(var i = 0; i < 10; i ++){
            context.beginPath();
            context.arc(50 + i*100, 420, 40, 0,2*Math.PI*(i+1)/10, true);

            context.stroke()
        }

        context.fillStyle = "#0f0";

        for(var i = 0; i < 10; i ++){
            context.beginPath();
            context.arc(50 + i*100, 540, 40, 0,2*Math.PI*(i+1)/10, true);
            context.closePath();//會(huì)自動(dòng)閉合

            context.fill()
        }

        for(var i = 0; i < 10; i ++){
            context.beginPath();
            context.arc(50 + i*100, 660, 40, 0,2*Math.PI*(i+1)/10, true);

            context.fill()
        }
    }
</script>
  • arcTo

context.arcTo(x1, y1, x2, y2, radius)

<canvas id="canvas"></canvas>
<script>
    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 1800;
        canvas.height = 1800;

        var context = canvas.getContext("2d");
        context.moveTo(400,100)
        context.arcTo(1200,400,400,700,400);
        context.strokeStyle= "red"
        context.stroke()
    }
</script>
  • 貝賽爾曲線 Bezier

(1)QuadraticCurveTo(二次)
context.moveTo(x0, y0); //初始點(diǎn)
contextquadraticCurveTo(x1, y1, x2, y2)//控制點(diǎn)育灸、結(jié)束點(diǎn)
(2)BezierCurveTo(三次)
context.moveTo(x0, y0);
context.bezierCurveTo(x1, y1, x2, y2, x3, y3);

    function drawLand(cxt){
        cxt.save();

        cxt.beginPath();
        cxt.moveTo(0, 600);
        cxt.bezierCurveTo(540, 400, 660, 800, 1200, 600);
        cxt.lineTo(1200, 800);
        cxt.lineTo(0, 800);
        cxt.closePath();

        var lanStyle = cxt.createLinearGradient(0, 800, 0, 0);
        lanStyle.addColorStop(0.0, "#030");
        lanStyle.addColorStop(1.0, "#580");
        cxt.fillStyle = lanStyle;

        cxt.fill();

        cxt.restore();
    }

7.文字渲染基礎(chǔ)

context.font = "bold 40px Arial";
context.fillText(String, x, y, [maxlen]);
context.StrokeText(String, x, y, [maclen])

<canvas id="canvas"></canvas>
<script>

    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");

        context.font = "bold 40px Arial";
        context.fillStyle = "#058";
        context.fillText("歡迎學(xué)習(xí)Canvas腻窒!歡迎學(xué)習(xí)Canvas!", 40, 100);
        context.lineWidth = 1;

        context.strokeStyle = "#058";
        context.strokeText("歡迎學(xué)習(xí)Canvas磅崭!歡迎學(xué)習(xí)Canvas儿子!", 40, 200);

        context.fillText("歡迎學(xué)習(xí)Canvas!歡迎學(xué)習(xí)Canvas砸喻!", 40, 300, 400);
        context.strokeText("歡迎學(xué)習(xí)Canvas柔逼!歡迎學(xué)習(xí)Canvas蒋譬!", 40, 400, 400);
    }
</script>
  • font

默認(rèn)值"20px sans-serif"
(1)font-style:
normal(default);
italic(斜體字);
oblique(傾斜字體)
(2)font-variant:
normal;
small-caps(以小型形式顯示大寫字母)
(3)font-weight:
lighter;
normal;
bold;
bolder;
100,200,300,400(normal),500,600,700(bold),800,900
(4)font-size:
20px;
2em;
150%;
(5)font-family:
設(shè)置多種字體備選;
支持@font-face
web安全字體

<canvas id="canvas"></canvas>
<script>

    window.onload = function () {
        var canvas = document.getElementById("canvas");

        canvas.width = 800;
        canvas.height = 800;

        var context = canvas.getContext("2d");

        context.font = "bold 40px Arial";

        var linearGrad = context.createLinearGradient(0, 0, 700, 0);
        linearGrad.addColorStop(0.0, 'tomato');
        linearGrad.addColorStop(0.25, 'yellow');
        linearGrad.addColorStop(0.5, 'green');
        linearGrad.addColorStop(0.75, 'pink');
        linearGrad.addColorStop(1.0, 'red');

        context.fillStyle = linearGrad;
        // context.fillStyle = "#058";
        context.fillText("歡迎學(xué)習(xí)Canvas愉适!歡迎學(xué)習(xí)Canvas犯助!", 40, 100);
        context.lineWidth = 1;

        context.strokeStyle = "#058";
        context.strokeText("歡迎學(xué)習(xí)Canvas!歡迎學(xué)習(xí)Canvas维咸!", 40, 200);

        context.fillText("歡迎學(xué)習(xí)Canvas剂买!歡迎學(xué)習(xí)Canvas!", 40, 300, 400);
        context.strokeText("歡迎學(xué)習(xí)Canvas癌蓖!歡迎學(xué)習(xí)Canvas瞬哼!", 40, 400, 400);
    }
</script>
  • 文本對(duì)齊

context.textAlign = left/center/right
cotext.textBaseline = top/middle/bottom (alphabetic拉丁/ideographic漢,日/hanging印)

  • 文本度量

context.measureText(String).width

8. 陰影

context.shadowColor;
context.shadowOffsetX;//x位移值
context.shadowOffsetY;//y位移值
xontext.shadowBlur; //模糊值

9. global

  • globalAlpha = 1(default) //使全局具有透明度
  • glibalCompositeOperation//繪制的圖像在重疊時(shí)產(chǎn)生的效果
    "sourece-over" - 后繪制的圖像在先繪制的圖形上面
    "destination-over" - 先繪制的圖形在后悔值的上面
    ···········································································································································································
    source-over
    source-atop
    source-in
    source-out
    ···········································································································································································
    destination-over
    destination-atop
    destination-in
    destination-out
    ···········································································································································································
    lighter
    copy
    xor

10. 剪輯區(qū)域

context.clip();

11. 剪紙效果

非零環(huán)繞原則

其他

  • clearRect
    context.clearRect(x, y, width, height)
  • isPointInPath
    context.isPointInPath(x, y)
    var x = event.clientX - canvas.getBoundingClientRect().left
    var y = event.clientY - canvas.getBoundingClientRect().Right

兼容性

explorecanvas https://code.google.con/p/explorecanvas/
canvas 圖形庫(kù):canvasplus/ArtisanJS/Rgraph

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末租副,一起剝皮案震驚了整個(gè)濱河市坐慰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌用僧,老刑警劉巖结胀,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異永毅,居然都是意外死亡把跨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門沼死,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)着逐,“玉大人,你說(shuō)我怎么就攤上這事意蛀∷时穑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵县钥,是天一觀的道長(zhǎng)秀姐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)若贮,這世上最難降的妖魔是什么省有? 我笑而不...
    開(kāi)封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谴麦,結(jié)果婚禮上蠢沿,老公的妹妹穿的比我還像新娘。我一直安慰自己匾效,他們只是感情好舷蟀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般野宜。 火紅的嫁衣襯著肌膚如雪扫步。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天匈子,我揣著相機(jī)與錄音河胎,去河邊找鬼。 笑死旬牲,一個(gè)胖子當(dāng)著我的面吹牛仿粹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播原茅,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼堕仔!你這毒婦竟也來(lái)了擂橘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤摩骨,失蹤者是張志新(化名)和其女友劉穎通贞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恼五,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昌罩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灾馒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茎用。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睬罗,靈堂內(nèi)的尸體忽然破棺而出轨功,到底是詐尸還是另有隱情,我是刑警寧澤容达,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布古涧,位于F島的核電站,受9級(jí)特大地震影響花盐,放射性物質(zhì)發(fā)生泄漏羡滑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一算芯、第九天 我趴在偏房一處隱蔽的房頂上張望柒昏。 院中可真熱鬧,春花似錦也祠、人聲如沸昙楚。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)堪旧。三九已至削葱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淳梦,已是汗流浹背析砸。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爆袍,地道東北人首繁。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像陨囊,于是被迫代替她去往敵國(guó)和親弦疮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子代虾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 一厦坛、基礎(chǔ)介紹和畫直線 大多數(shù)現(xiàn)代瀏覽器都是支持Canvas的,比如 Firefox, safari, chrome...
    空谷悠閱讀 841評(píng)論 0 1
  • 1 Canvas接口元素定義 1.1 getContext()方法 為了在canvas上繪制巫糙,你必須先得到一個(gè)畫布...
    Kevin_Junbaozi閱讀 1,308評(píng)論 1 2
  • 一:canvas簡(jiǎn)介 1.1什么是canvas市袖? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,683評(píng)論 2 32
  • title: Canvas基礎(chǔ)date: 2016-11-09tags: HTML5 0x00 Canvas 使用...
    曼路x_x閱讀 304評(píng)論 0 2
  • 最近筆者在學(xué)習(xí)HTML5的新元素 抬吟,會(huì)分享一些基礎(chǔ)知識(shí)以及小例子格仲,最終使用 實(shí)現(xiàn)一個(gè)繪制簡(jiǎn)單圖表(條形圖柒室、線圖或者...
    Sue1024閱讀 1,495評(píng)論 0 1