8个前端知识点:HTML5(canvas应用)

  • (1) 应用 canvas笑脸
  • (2) 应用 canvas画图
  • (3) 应用 canvas变换
  • (4) 应用 canvas内长方形拖拽
  • (5) 应用 canvas内圆形拖拽
  • (6) 应用 下载canvas绘图
  • (7) 应用 canvas运动回调
  • (8) canvas框架 jCanvaScript.js

(1) 应用 canvas笑脸

<canvas
 
width
=
"800"
 
height
=
"1200"
></canvas>
<script>
    
var
 oC 
=
 document
.
querySelector
(
'canvas'
);
    
var
 ctx 
=
 oC
.
getContext
(
'2d'
);
    
// face
    ctx
.
fillStyle 
=
 
'yellow'
;
    ctx
.
arc
(
400
,
 
250
,
 
180
,
 
0
,
 
2
 
*
 
Math
.
PI
,
 
false
);
    ctx
.
fill
();
    ctx
.
stroke
();
    
// mouth
    ctx
.
beginPath
();
    ctx
.
lineCap 
=
 
'round'
;
    ctx
.
lineWidth 
=
 
20
;
    ctx
.
fillStyle 
=
 
'red'
;
    ctx
.
arc
(
400
,
 
280
,
 
80
,
 
0
,
 
Math
.
PI
,
 
false
);
    
// ctx.fill();  // 红色实心半圆张嘴笑脸
    ctx
.
stroke
();
  
// 黑色半圆弧微笑脸
    
// eyes
    ctx
.
beginPath
();
    ctx
.
fillStyle 
=
 
'black'
;
    ctx
.
moveTo
(
350
,
 
200
);
    ctx
.
arc
(
350
,
 
200
,
 
20
,
 
0
,
 
2
 
*
 
Math
.
PI
,
 
false
);
    ctx
.
moveTo
(
450
,
 
200
);
    ctx
.
arc
(
450
,
 
200
,
 
20
,
 
0
,
 
2
 
*
 
Math
.
PI
,
 
false
);
    ctx
.
closePath
();
    ctx
.
fill
();
</script>

(2) 应用 canvas画图

<canvas
 
width
=
"800"
 
height
=
"600"
></canvas>
<script>
    
var
 oC 
=
 document
.
querySelector
(
'canvas'
);
    
var
 ctx 
=
 oC
.
getContext
(
'2d'
);
    oC
.
onmousedown 
=
 
function
(
ev
)
 
{
        
var
 
{
            clientX
,
            clientY
        
}
 
=
 ev
;
        ctx
.
moveTo
(
clientX
,
 clientY
)
        oC
.
onmousemove 
=
 
function
(
ev
)
 
{
            ctx
.
clearRect
(
0
,
 
0
,
 oC
.
width
,
 oC
.
height
);
            
var
 
{
                clientX
,
                clientY
            
}
 
=
 ev
;
            ctx
.
lineWidth 
=
 
5
;
            ctx
.
lineTo
(
clientX
,
 clientY
);
            ctx
.
stroke
();
        
}
        oC
.
onmouseup 
=
 
function
()
 
{
            oC
.
onmousemove 
=
 
null
;
            oC
.
onmouseup 
=
 
null
;
        
}
    
}
</script>

(3) 应用 canvas变换

<canvas
 
width
=
"800"
 
height
=
"600"
></canvas>
    
<script>
        
var
 oC 
=
 document
.
querySelector
(
'canvas'
);
        
var
 ctx 
=
 oC
.
getContext
(
'2d'
);
        
var
 degree 
=
 
1
;
        
var
 x1 
=
 
300
;
        
var
 y1 
=
 
300
;
        
var
 w1 
=
 
100
;
        
var
 h1 
=
 
100
;
        
var
 x2 
=
 
100
;
        
var
 y2 
=
 
100
;
        
var
 w2 
=
 
50
;
        
var
 h2 
=
 
50
;
        
var
 rotate1 
=
 
0
;
        
var
 rotate2 
=
 
0
;
        setInterval
(
function
()
 
{
            ctx
.
clearRect
(-
oC
.
width
,
 
-
oC
.
height
,
 oC
.
width 
*
 
2
,
 
2
 
*
 oC
.
height
);
            ctx
.
save
();
            ctx
.
translate
(
x1
,
 y1
);
            ctx
.
rotate
(
rotate1
);
            ctx
.
fillRect
(-
w1 
/
 
2
,
 
-
h1 
/
 
2
,
 w1
,
 h1
);
            ctx
.
restore
();
            ctx
.
save
();
            ctx
.
translate
(
x2
,
 y2
);
            ctx
.
rotate
(
rotate2
);
            ctx
.
fillRect
(-
w2 
/
 
2
,
 
-
h2 
/
 
2
,
 w2
,
 h2
);
            ctx
.
restore
()
            rotate1
++;
            rotate2 
+=
 
0.2
;
        
},
 
100
)
        
function
 d2a
(
deg
)
 
{
            
return
 deg 
/
 
180
 
*
 
Math
.
PI
        
}
    
</script>

(4) 应用 canvas内长方形拖拽

<canvas
 
width
=
"800"
 
height
=
"600"
></canvas>
<script>
    
var
 oC 
=
 document
.
querySelector
(
'canvas'
);
    
var
 ctx 
=
 oC
.
getContext
(
'2d'
);
    
var
 rect 
=
 
{
        x
:
 
0
,
        y
:
 
0
,
        w
:
 
100
,
        h
:
 
100
    
}
    ctx
.
fillRect
(
        rect
.
x
,
        rect
.
y
,
        rect
.
w
,
        rect
.
h
    
);
    oC
.
onmousedown 
=
 
function
({
        clientX
,
        clientY
    
})
 
{
        
var
 
{
            x
,
            y
,
            w
,
            h
        
}
 
=
 rect
;
        
var
 disX 
=
 clientX 
-
 x
;
        
var
 disY 
=
 clientY 
-
 y
;
        
if
 
(
            clientX 
>
 x 
&&
            clientX 
<
 x 
+
 w 
&&
            clientY 
>
 y 
&&
            clientY 
<
 y 
+
 h
        
)
 
{
            oC
.
onmousemove 
=
 
function
({
                clientX
,
                clientY
            
})
 
{
                ctx
.
clearRect
(
0
,
 
0
,
 oC
.
width
,
 oC
.
height
)
  
// **先清空画布再画
                
var
 deltaX 
=
 clientX 
-
 disX
;
                
var
 deltaY 
=
 clientY 
-
 disY
;
                rect
.
x 
=
 deltaX
;
                rect
.
y 
=
 deltaY
;
                ctx
.
fillRect
(
                    rect
.
x
,
                    rect
.
y
,
                    rect
.
w
,
                    rect
.
h
                
);
            
}
            oC
.
onmouseup 
=
 
function
()
 
{
                oC
.
onmousemove 
=
 
null
;
                oC
.
onmouseup 
=
 
null
;
            
}
        
}
    
}
</script>

(5) 应用 canvas内圆形拖拽

(web前端学习交流群:328058344 禁止闲聊,非喜勿进!)

<canvas
 
width
=
"800"
 
height
=
"600"
></canvas>
<script>
    
var
 oC 
=
 document
.
querySelector
(
'canvas'
);
    
var
 ctx 
=
 oC
.
getContext
(
'2d'
);
    
var
 circle 
=
 
{
        x
:
 
50
,
        y
:
 
50
,
        r
:
 
50
    
}
    ctx
.
arc
(
circle
.
x
,
 circle
.
y
,
 circle
.
r
,
 
0
,
 
2
 
*
 
Math
.
PI
,
 
false
);
    ctx
.
fill
();
    oC
.
onmousedown 
=
 
function
({
        clientX
,
        clientY
    
})
 
{
        
var
 
{
            x
,
            y
,
            r
        
}
 
=
 circle
;
        
var
 disX 
=
 clientX 
-
 x
;
        
var
 disY 
=
 clientY 
-
 y
;
        
if
 
(
            ctx
.
isPointInPath
(
clientX
,
 clientY
)
  
// 利用isPointInPath函数
        
)
 
{
            oC
.
onmousemove 
=
 
function
({
                clientX
,
                clientY
            
})
 
{
                ctx
.
clearRect
(
0
,
 
0
,
 oC
.
width
,
 oC
.
height
);
                ctx
.
beginPath
();
                
var
 deltaX 
=
 clientX 
-
 disX
;
                
var
 deltaY 
=
 clientY 
-
 disY
;
                circle
.
x 
=
 deltaX
;
                circle
.
y 
=
 deltaY
;
                ctx
.
arc
(
circle
.
x
,
 circle
.
y
,
 circle
.
r
,
 
0
,
 
2
 
*
 
Math
.
PI
,
 
false
);
                ctx
.
fill
();
            
}
            oC
.
onmouseup 
=
 
function
()
 
{
                oC
.
onmousemove 
=
 
null
;
                oC
.
onmouseup 
=
 
null
;
            
}
        
}
    
}
</script>

(6) 应用 下载canvas绘图

<canvas
 
width
=
"600"
 
height
=
"400"
></canvas>
<br>
<button>
Download
</button>
<script>
    
var
 oC 
=
 document
.
querySelector
(
'canvas'
);
    
var
 ctx 
=
 oC
.
getContext
(
'2d'
);
    
var
 oBtn 
=
 document
.
querySelector
(
'button'
);
    
var
 data 
=
 
[
        rnd
(
100
,
 
1000
),
        rnd
(
100
,
 
1000
),
        rnd
(
100
,
 
1000
),
        rnd
(
100
,
 
1000
),
        rnd
(
100
,
 
1000
)
    
]
    
var
 start 
=
 
0
;
    
var
 sum 
=
 sumUp
(
data
);
    data
.
forEach
(
function
(
number
,
 index
)
 
{
        
var
 color 
=
 
`
rgb
(
$
{
rnd
(
0
,
255
)},
$
{
rnd
(
0
,
255
)},
$
{
rnd
(
0
,
255
)})`;
        
var
 delta 
=
 number 
/
 sum 
*
 
2
 
*
 
Math
.
PI
;
        ctx
.
fillStyle 
=
 color
;
        ctx
.
beginPath
();
        ctx
.
moveTo
(
300
,
 
200
)
        ctx
.
arc
(
300
,
 
200
,
 
100
,
 start
,
 start 
+
 delta
,
 
false
);
        ctx
.
lineTo
(
300
,
 
200
)
        ctx
.
fill
();
        start 
=
 start 
+
 delta
;
    
})
    
function
 sumUp
(
array
)
 
{
        
var
 sum 
=
 
0
;
        array
.
forEach
(
function
(
n
)
 
{
            sum 
+=
 n
        
})
        
return
 sum
;
    
}
    
function
 rnd
(
n
,
 m
)
 
{
        
return
 parseInt
(
Math
.
random
()
 
*
 
(
m 
-
 n
)
 
+
 n
);
    
}
    
// **下载canvas图片
    oBtn
.
onclick 
=
 
function
()
 
{
        
var
 oA 
=
 document
.
createElement
(
'a'
);
        oA
.
href 
=
 oC
.
toDataURL
();
        oA
.
download 
=
 
'默认命名'
;
        
// oA.download = fileName.value ? fileName.value : '默认命名' + '.png';
        oA
.
click
();
    
}
</script>

(7) 应用 canvas运动回调

<script>
    
function
 loadStatics
(
statics
,
 callback
)
 
{
        
var
 count 
=
 
0
;
        statics
.
forEach
(
function
(
path
,
 index
)
 
{
            
var
 oImage 
=
 
new
 
Image
();
            oImage
.
src 
=
 
`
img
/
$
{
path
}.
png
`
            resources
[
path
]
 
=
 oImage
;
            oImage
.
onload 
=
 
function
()
 
{
                count
++
                
if
 
(
count 
==
 statics
.
length
)
 
{
                    callback 
&&
 callback
();
                
}
            
}
        
})
    
}
    
function
 d2a
(
d
)
 
{
        
return
 d 
/
 
180
 
*
 
Math
.
PI
    
}
    
function
 a2d
(
a
)
 
{
        
return
 a 
/
 
Math
.
PI 
*
 
180
    
}
    
function
 rnd
(
n
,
 m
)
 
{
        
return
 parseInt
(
Math
.
random
()
 
*
 
(
m 
-
 n
)
 
+
 n
)
    
}
    
function
 rndSign
()
 
{
        
return
 
Math
.
random
()
 
<
 
0.5
 
?
 
-
1
 
:
 
1
    
}
</script>

(8) canvas框架 jCanvaScript.js
jCanvaScript.js
示例

<canvas
 
id
=
"c1"
 
width
=
"500"
 
height
=
"500"
></canvas>
<script
 
src
=
"libs/jCanvaScript.1.5.18.min.js"
></script>
<script>
    
var
 idCanvas 
=
 
"c1"
;
    onload_1
();
    
var
 interval_1 
=
 
0
;
    
function
 startShow
()
 
{
        
var
 r 
=
 
Math
.
floor
(
Math
.
random
()
 
*
 
(
254
)),
            g 
=
 
Math
.
floor
(
Math
.
random
()
 
*
 
(
254
)),
            b 
=
 
Math
.
floor
(
Math
.
random
()
 
*
 
(
254
)),
            x 
=
 
Math
.
floor
(
Math
.
random
()
 
*
 
(
439
)),
            y 
=
 
Math
.
floor
(
Math
.
random
()
 
*
 
(
554
)),
            color 
=
 
"rgba("
 
+
 r 
+
 
", "
 
+
 g 
+
 
", "
 
+
 b 
+
 
", 0.5)"
,
            filled 
=
 
true
,
            radius 
=
 
1
;
        jc
.
circle
(
x
,
 y
,
 radius
,
 color
,
 filled
)
            
.
animate
({
                radius
:
 
100
,
                opacity
:
 
0
            
},
 
1500
,
 
function
()
 
{
                
this
.
del
();
            
});
    
}
    
function
 onload_1
()
 
{
        jc
.
start
(
idCanvas
,
 
true
);
        interval_1 
=
 setInterval
(
startShow
,
 
200
);
    
}
    
function
 start_1
(
idCanvas
)
 
{
        
if
 
(
interval_1
)
 
return
;
        onload_1
();
    
}
    
function
 stop_1
(
idCanvas
)
 
{
        clearInterval
(
interval_1
);
        interval_1 
=
 
0
;
        jc
.
clear
(
idCanvas
);
    
}
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容