js canvas實(shí)現(xiàn)寫字動(dòng)畫效果
更新時(shí)間:2021年04月29日 14:36:22 作者:lucky芬
這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)寫字動(dòng)畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了js canvas實(shí)現(xiàn)寫字動(dòng)畫效果展示的具體代碼,供大家參考,具體內(nèi)容如下
頁面html:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>學(xué)寫一個(gè)字</title>
<script src="jquery-2.1.3.min.js" type="text/javascript"></script>
<link href="handwriting.css" rel="stylesheet" type="text/css"/>
<meta name="viewport"
content=" height = device-height,
width = device-width,
initial-scale = 1.0,
minimum-scale = 1.0,
maximum-scale = 1.0,
user-scalable = no"/> //兼容移動(dòng)端
</head>
<body>
<canvas id="canvas">
您的瀏覽器不支持canvas
</canvas>//寫字區(qū)域
<div id="controller">
<div id="black_btn" class="color_btn color_btn_selected"></div>
<div id="blue_btn" class="color_btn"></div>
<div id="green_btn" class="color_btn"></div>
<div id="red_btn" class="color_btn"></div>
<div id="orange_btn" class="color_btn"></div>
<div id="yellow_btn" class="color_btn"></div>
<div id="clear_btn" class="op_btn">清 除</div>
<div class="clearfix"></div>
</div>
<script src = "handwriting.js"></script>
</body>
</html>
頁面css:
#canvas{
display:block;
margin:0 auto;
}
#controller{
margin:0 auto;
}
.op_btn{
float: right;
margin:10px 0 0 10px;
border:2px solid #aaa;
width:80px;
height:40px;
line-height:40px;
font-size:20px;
text-align:center;
border-radius: 5px 5px;
cursor:pointer;
background-color: white;
font-weight:bold;
font-family: Microsoft Yahei, Arial;
}
.op_btn:hover{
background-color:#def;
}
.clearfix{
clear:both;
}
.color_btn{
float: left;
margin: 10px 10px 0 0;
border:5px solid white;
width:40px;
height:40px;
border-radius: 5px 5px;
cursor:pointer;
}
.color_btn:hover{
border: 5px solid violet;
}
.color_btn_selected{
border: 5px solid blueviolet;
}
#black_btn{
background-color: black;
}
#blue_btn{
background-color: blue;
}
#green_btn{
background-color: green;
}
#red_btn{
background-color: red;
}
#orange_btn{
background-color: orange;
}
#yellow_btn{
background-color: yellow;
}
頁面js:
var canvasWidth = Math.min( 800 , $(window).width() - 20 );//如果屏幕小于800px,則取值為屏幕大小寬度,便于移動(dòng)端的展示,-20是為了使得米字格不緊貼于邊緣
var canvasHeight = canvasWidth;
var strokeColor = "black";
var isMouseDown = false; //鼠標(biāo)按下時(shí)候的狀態(tài)
var lastLoc = {x:0,y:0}; //鼠標(biāo)上一次結(jié)束時(shí)的位置
var lastTimestamp = 0; //上一次時(shí)間,與筆刷粗細(xì)有關(guān)
var lastLineWidth = -1; //筆刷粗細(xì)
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
canvas.width = canvasWidth;
canvas.height = canvasHeight;
$("#controller").css("width",canvasWidth+"px");
drawGrid();//畫米字格
$("#clear_btn").click(
function(e){
context.clearRect( 0 , 0 , canvasWidth, canvasHeight );
drawGrid();
}
)
$(".color_btn").click(
function(e){
$(".color_btn").removeClass("color_btn_selected");
$(this).addClass("color_btn_selected");
strokeColor = $(this).css("background-color");
}
)
//適用于移動(dòng)端觸控
function beginStroke(point){
isMouseDown = true
//console.log("mouse down!");
lastLoc = windowToCanvas(point.x, point.y); //上一次坐標(biāo)位置
lastTimestamp = new Date().getTime();
}
function endStroke(){
isMouseDown = false;
}
function moveStroke(point){
var curLoc = windowToCanvas( point.x , point.y );
var curTimestamp = new Date().getTime();
var s = calcDistance( curLoc , lastLoc );
var t = curTimestamp - lastTimestamp;
var lineWidth = calcLineWidth( t , s );
//draw
context.beginPath();
context.moveTo( lastLoc.x , lastLoc.y );
context.lineTo( curLoc.x , curLoc.y );
context.strokeStyle = strokeColor;
context.lineWidth = lineWidth;
context.lineCap = "round";
context.lineJoin = "round";
context.stroke();
lastLoc = curLoc;
lastTimestamp = curTimestamp;
lastLineWidth = lineWidth;
}
canvas.onmousedown = function(e){
e.preventDefault();
beginStroke( {x: e.clientX , y: e.clientY} );
};
canvas.onmouseup = function(e){
e.preventDefault();
endStroke();
};
canvas.onmouseout = function(e){
e.preventDefault();
endStroke();
};
canvas.onmousemove = function(e){
e.preventDefault();
if( isMouseDown ){
moveStroke({x: e.clientX , y: e.clientY})
}
};
canvas.addEventListener('touchstart',function(e){
e.preventDefault();
touch = e.touches[0];
beginStroke( {x: touch.pageX , y: touch.pageY} )
});
canvas.addEventListener('touchmove',function(e){
e.preventDefault();
if( isMouseDown ){
touch = e.touches[0];
moveStroke({x: touch.pageX , y: touch.pageY});
}
});
canvas.addEventListener('touchend',function(e){
e.preventDefault();
endStroke();
});
var maxLineWidth = 30;
var minLineWidth = 1;
var maxStrokeV = 10;
var minStrokeV = 0.1;
function calcLineWidth( t , s ){
var v = s / t;
var resultLineWidth;
if( v <= minStrokeV )
resultLineWidth = maxLineWidth;
else if ( v >= maxStrokeV )
resultLineWidth = minLineWidth;
else{
resultLineWidth = maxLineWidth - (v-minStrokeV)/(maxStrokeV-minStrokeV)*(maxLineWidth-minLineWidth);
}
if( lastLineWidth == -1 )
return resultLineWidth;
return resultLineWidth*1/3 + lastLineWidth*2/3;
}
function calcDistance( loc1 , loc2 ){
return Math.sqrt( (loc1.x - loc2.x)*(loc1.x - loc2.x) + (loc1.y - loc2.y)*(loc1.y - loc2.y) );
}
function windowToCanvas( x , y ){
var bbox = canvas.getBoundingClientRect();
return {x:Math.round(x-bbox.left) , y:Math.round(y-bbox.top)}
}
function drawGrid(){
context.save();
context.strokeStyle = "rgb(230,11,9)";
context.beginPath();
context.moveTo( 3 , 3 );
context.lineTo( canvasWidth - 3 , 3 );
context.lineTo( canvasWidth - 3 , canvasHeight - 3 );
context.lineTo( 3 , canvasHeight - 3 );
context.closePath();
context.lineWidth = 6;
context.stroke();
context.beginPath();
context.moveTo(0,0);
context.lineTo(canvasWidth,canvasHeight);
context.moveTo(canvasWidth,0);
context.lineTo(0,canvasHeight);
context.moveTo(canvasWidth/2,0);
context.lineTo(canvasWidth/2,canvasHeight);
context.moveTo(0,canvasHeight/2);
context.lineTo(canvasWidth,canvasHeight/2);
context.lineWidth = 1;
context.stroke();
context.restore();
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- JS+canvas繪制的動(dòng)態(tài)機(jī)械表動(dòng)畫效果
- JS基于HTML5的canvas標(biāo)簽實(shí)現(xiàn)炫目的色相球動(dòng)畫效果實(shí)例
- javascript+HTML5的Canvas實(shí)現(xiàn)Lab單車動(dòng)畫效果
- js+canvas實(shí)現(xiàn)畫板功能
- js+canvas實(shí)現(xiàn)刮刮獎(jiǎng)功能
- js實(shí)現(xiàn)貪吃蛇游戲 canvas繪制地圖
- 使用js和canvas實(shí)現(xiàn)時(shí)鐘效果
- javascript使用canvas實(shí)現(xiàn)餅狀圖效果
- javascript canvas實(shí)現(xiàn)簡易時(shí)鐘例子
- JS Canvas接口和動(dòng)畫效果大全
相關(guān)文章
JavaScript支持的最大遞歸調(diào)用次數(shù)分析
這篇文章主要介紹了JavaScript支持的最大遞歸調(diào)用次數(shù)分析,也稱JavaScript支持的最大堆棧數(shù)量,需要的朋友可以參考下2014-06-06
微信小程序?qū)崿F(xiàn)答題倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)答題倒計(jì)時(shí),自定義計(jì)時(shí)器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
如何使用big.js解決JavaScript浮點(diǎn)數(shù)精度丟失問題
最近在項(xiàng)目中涉及到金額從元轉(zhuǎn)為分(乘100即可),發(fā)現(xiàn)乘法居然也會(huì)有精度丟失的問題,關(guān)于浮點(diǎn)數(shù)計(jì)算精度丟失是很多語言都存在的問題,本文給大家分享使用big.js解決JavaScript浮點(diǎn)數(shù)精度丟失問題,感興趣的朋友一起看看吧2023-12-12
微信小程序左滑刪除實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了微信小程序左滑刪除實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09

