以下是 html5 canvas实现文字变换特效代码 的示例演示效果:
部分效果截图:
HTML代码(index.html):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="format-detection" content="telephone=no">
<link rel="stylesheet" type="text/css" href="css/css.css" />
<script type="text/javascript" src="js/js.js"></script>
<script type="text/javascript" src="js/config.js"></script>
<script type="text/javascript">
var isDesktop = navigator['userAgent'].match(/(ipad|iphone|ipod|android|windows phone)/i) ? false : true;
var fontunit = isDesktop ? 20 : ((window.innerWidth>window.innerHeight?window.innerHeight:window.innerWidth)/320)*10;
document.write('<style type="text/css">'+
'html,body {font-size:'+(fontunit<30?fontunit:'30')+'px;}'+
(isDesktop?'#welcome,#GameTimeLayer,#GameLayerBG,#GameScoreLayer.SHADE{position: absolute;}':
'#gamepage,#gameend,#GameLayerBG,#GameScoreLayer.SHADE{position:fixed;}@media screen and (orientation:landscape) {#landscape {display: box; display: -webkit-box; display: -moz-box; display: -ms-flexbox;}}')+
'</style>');
</script>
</head>
<body >
<div id="gamepage">
<canvas id="canvas1" style="left: 0;top: 0;"></canvas>
</div>
<div class="leftbtn actionbtn" onclick="changeNum(0)">历史</div>
<div class="leftbtn" onclick="changeNum(1)">经济</div>
<div class="leftbtn" onclick="changeNum(2)">文化</div>
<div class="leftbtn" onclick="changeNum(3)">作者</div>
<div class="img_box" id="img_box">
<img id="img_1" src="image/0_0.jpg" onclick="bigimg(this,0)"/>
<img id="img_2" src="image/0_1.jpg" onclick="bigimg(this,1)"/>
</div>
</body>
</html>
JS代码(js.js):
window.onload = function(){
body = document.body;
body.style.height = bodyheight+'px';
body.style.width = bodywidth+'px';
var btnarr=document.getElementsByClassName("leftbtn");
var topF=(bodyheight-0.55*bodywidth)/2;
for(var i=0;
i<btnarr.length;
i++){
btnarr[i].style.height=bodywidth*0.1+"px";
btnarr[i].style.top=topF+0.15*bodywidth*i+"px";
btnarr[i].style.fontSize=font_size+"px";
btnarr[i].style.lineHeight=bodywidth*0.1+"px";
}
document.getElementById('gamepage').style.width=bodywidth+'px';
document.getElementById('gamepage').style.height=bodyheight+'px';
document.getElementById('canvas1').width=bodywidth;
document.getElementById('canvas1').height=bodyheight;
document.getElementById('canvas1').style.width=bodywidth+'px';
document.getElementById('canvas1').style.height=bodyheight+'px';
var that = this;
info();
document.getElementById("canvas1").addEventListener("dblclick",function(e){
e.stopPropagation();
e.preventDefault();
ondblclick=true;
}
,false);
document.getElementById("canvas1").addEventListener(START_EVENT,function(e){
try{
if(e.touches.length > 1){
// 仅处理一根手指e.stopPropagation();
e.preventDefault();
return;
}
}
catch(e){
}
e.stopPropagation();
e.preventDefault();
if(window.timer!=null){
return;
}
if(!isread){
startRun()}
else{
//var num=(nownum+1)%3;
//changeNum(num);
}
}
,false);
document.getElementById("canvas1").addEventListener(END_EVENT,function(e){
try{
if(e.touches.length > 1){
// 仅处理一根手指e.stopPropagation();
e.preventDefault();
return;
}
}
catch(e){
}
e.stopPropagation();
e.preventDefault();
}
,false);
document.addEventListener(MOVE_EVENT,function(e){
if(!istouchstart){
return;
}
try{
if(e.touches.length > 1){
// 仅处理一根手指e.stopPropagation();
e.preventDefault();
return;
}
}
catch(e){
}
e.stopPropagation();
e.preventDefault();
}
,false);
}
//画图function drawcanvas(){
var theCanvas = document.getElementById("canvas1");
var context = theCanvas.getContext("2d");
context.clearRect(0,0,bodywidth,bodyheight);
//更新数据update();
//画图render();
function update(){
runtimes++;
if(runtimes==16){
clearInterval(timer);
timer=null;
runtimes=0;
temparr=text1endarr;
document.getElementById("img_1").src="image/"+nownum+"_0.jpg";
document.getElementById("img_2").src="image/"+nownum+"_1.jpg";
}
else{
for(var i=0;
i<temparr.length;
i++){
temparr[i].x=temparr[i].x+temparr[i].speedx;
temparr[i].y=temparr[i].y+temparr[i].speedy;
}
}
}
function render(){
//var gradient=context.createLinearGradient(0,0,bodywidth,bodyheight);
/* gradient.addColorStop("0","#9BF80D");
gradient.addColorStop("0.6","#3E00FF");
gradient.addColorStop("1.0","#fff");
*/
// 用渐变填色context.save();
context.textAlign = "start";
context.textBaseline = "alphabetic";
context.font="normal lighter "+font_size+"px cursive";
context.fillStyle="#E5FFFD";
var linelenght=Math.floor((bodywidth-24)/font_size);
//draw_long_text("",context,12,90,linelenght);
draw_text_px(context,main_text,temparr);
context.restore();
}
}
function info(){
var num=0;
isread=false;
main_arr=eval("text"+num+"arr");
//设置main_arrmain_text=eval("text"+num);
var theCanvas = document.getElementById("canvas1");
var context = theCanvas.getContext("2d");
context.clearRect(0,0,bodywidth,bodyheight);
/* var gradient=context.createLinearGradient(0,0,bodywidth,bodyheight);
gradient.addColorStop("0","#9BF80D");
gradient.addColorStop("0.6","#3E00FF");
gradient.addColorStop("1.0","#fff");
*/
context.save();
context.textAlign = "start";
context.textBaseline = "alphabetic";
context.font="normal lighter "+font_size+"px cursive";
context.fillStyle="#E5FFFD";
var linelenght=Math.floor((bodywidth-24)/font_size);
draw_text(context,main_text,main_arr);
context.restore();
}
function changeNum(num){
//isread=false;
if(num==nownum){
return false;
}
if(window.timer!=null){
clearInterval(timer);
timer=null;
runtimes=0;
}
var btnarr=document.getElementsByClassName("leftbtn");
for(var i=0;
i<btnarr.length;
i++){
removeClass(btnarr[i],"actionbtn");
}
addClass(btnarr[num],"actionbtn");
main_arr=eval("text"+num+"arr");
//设置main_arrmain_text=eval("text"+num);
changeRun(nownum);
nownum=num;
}
function draw_long_text(longtext,cxt,begin_width,begin_height,linelenght){
var text = "";
var count = 0;
var begin_width = begin_width;
var begin_height = begin_height;
var stringLenght = longtext.length;
var newtext = longtext.split("");
var context = cxt;
context.clearRect(0,0,600,300);
context.textAlign = 'left';
for(i = 0;
i <= stringLenght;
i++){
if(count == linelenght){
context.fillText(text,begin_width,begin_height);
begin_height = begin_height + 25;
text = "";
count = 0;
}
if(i == stringLenght){
context.fillText(text,begin_width,begin_height);
}
var text = text + newtext[0];
count ++;
newtext.shift();
}
}
function draw_text(context,text,textarr){
for(i = 0;
i < text.length;
i++){
var j=i%(textarr.length);
context.fillText(text[i],textarr[j].x*bodywidth,textarr[j].y*bodyheight);
}
}
function draw_text_px(context,text,textarr){
for(i = 0;
i < textarr.length;
i++){
context.fillText(text[i],textarr[i].x,textarr[i].y);
}
}
function startRun(){
text1endarr=[];
for(var i=0;
i<main_text.length;
i++){
var x=i%width_num;
var y=Math.floor(i/width_num);
var temp={
"x":startx+x*font_size,"y":stary+line_leight*y}
;
text1endarr.push(temp);
}
window.temparr=text1endarr;
isread=true;
for(var i=0;
i<text1endarr.length;
i++){
var j=i%(main_arr.length);
temparr[i].speedx=Number(((text1endarr[i].x-main_arr[j].x*bodywidth)/15).toFixed(3));
temparr[i].speedy=Number(((text1endarr[i].y-main_arr[j].y*bodyheight)/15).toFixed(3));
temparr[i].x=main_arr[j].x*bodywidth;
temparr[i].y=main_arr[j].y*bodyheight;
}
var dom=document.getElementById("img_box");
addClass(dom,"img_up");
window.timer=setInterval(function(){
drawcanvas();
}
,50);
}
function changeRun(num){
text1endarr=[];
for(var i=0;
i<main_text.length;
i++){
var x=i%width_num;
var y=Math.floor(i/width_num);
var temp={
"x":startx+x*font_size,"y":stary+line_leight*y}
;
text1endarr.push(temp);
}
window.temparr=text1endarr;
var obj1=document.getElementById("img_1");
var obj2=document.getElementById("img_2");
removeClass(obj1,"img_big0");
removeClass(obj2,"img_big1");
if(isread){
isread=false;
for(var i=0;
i<text1endarr.length;
i++){
var j=i%(main_arr.length);
temparr[i].speedx=(main_arr[j].x*bodywidth-text1endarr[i].x)/15;
temparr[i].speedy=(main_arr[j].y*bodyheight-text1endarr[i].y)/15;
temparr[i].x=text1endarr[i].x;
temparr[i].y=text1endarr[i].y;
}
}
else{
var temp_arr=eval("text"+num+"arr");
//设置main_arrfor(var i=0;
i<text1endarr.length;
i++){
var j=i%(main_arr.length);
var m=i%(temp_arr.length);
temparr[i].speedx=(main_arr[j].x*bodywidth-temp_arr[m].x*bodywidth)/15;
temparr[i].speedy=(main_arr[j].y*bodyheight-temp_arr[m].y*bodyheight)/15;
temparr[i].x=temp_arr[m].x*bodywidth;
temparr[i].y=temp_arr[m].y*bodyheight;
}
}
var dom=document.getElementById("img_box");
removeClass(dom,"img_up");
window.timer=setInterval(function(){
drawcanvas();
}
,50);
}
function bigimg(ele,num){
toggleClass(ele,"img_big"+num);
}
//classfunction hasClass(obj,cls){
return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}
function addClass(obj,cls){
if (!this.hasClass(obj,cls)) obj.className += " " + cls;
}
function removeClass(obj,cls){
if (hasClass(obj,cls)){
var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
obj.className = obj.className.replace(reg,' ');
}
}
function toggleClass(obj,cls){
if(hasClass(obj,cls)){
removeClass(obj,cls);
}
else{
addClass(obj,cls);
}
}
CSS代码(css.css):
*{padding:0;margin:0;border:0px;overflow:hidden;position:absolute;}
body{font-family:"Helvetica Neue",Helvetica,STHeiTi,sans-serif;margin:0;padding:0;left top repeat-y;background-size:100%;}
#gamepage{position:fixed;background:url(../image/bg.jpg);padding:0px;margin:0px;background-size:100% 100%;}
.title{position:fixed;top:10px;width:100%;height:50px;background-color:rgba(255,255,255,0.45);color:#00720E;font-size:23px;text-align:center;line-height:50px;font-weight:bold;}
.img_box{position:fixed;bottom:-20%;width:100%;height:20%;background-color:rgba(0,0,0,0.4);-webkit-transition-property:transform;-webkit-transition-duration:1s;transition-timing-function:ease-in-out;overflow:initial;}
.img_box img{margin-left:6%;width:41%;float:left;position:initial;height:90%;padding-top:2%;-webkit-transition-property:transform;-webkit-transition-duration:1s;transition-timing-function:ease-in-out}
.img_up{-webkit-transform:translate(0,-100%);}
.img_big0{-webkit-transform:scale(2)translate(28%,-30%);}
.img_big1{-webkit-transform:scale(2)translate(-28%,-30%);}
.leftbtn{display:block;width:12%;position:absolute;left:0;background-color:rgba(255,255,255,0.45);border-top-right-radius:40%;border-bottom-right-radius:40%;color:#02B546;padding-left:2px;font-weight:bold;text-align:left;}
.actionbtn{background-color:#00B43B;color:#FAAEF0;}