canvas基础学习笔记(四)

文字渲染

文字是页面制作必不可少的一部分,漂亮的文字会使网页赏心悦目,关于文字,我们可以设置它的字型、大小、填充、渐变色等等。示例代码如下:

<script type="text/javascript">
    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("欢迎大家多提意见!",40,100);

      context.lineWidth=1;
      context.strokeStyle="#058";
      context.strokeText("欢迎大家多提意见!",40,200);

       //可选参用于控制字符的长度
      context.fillText("欢迎大家多提意见!",40,300,100);
      context.strokeText("欢迎大家多提意见!",40,400,100);

        //渐变字体
       var linearGrad=context.createLinearGradient(0,0,800,0);//水平渐变方向
       linearGrad.addColorStop(0.0,'red');
       linearGrad.addColorStop(0.25,'yellow');
       linearGrad.addColorStop(0.5,'green');
       linearGrad.addColorStop(0.75,'blue');
       linearGrad.addColorStop(1.0,'black');
       context.fillStyle=linearGrad;
       context.fillText("欢迎大家多提意见!",40,500);

       //利用图片填充字体
       var backgroundImage=new Image();
       backgroundImage.src="img/1.jpg";
       backgroundImage.onload=function(){
        var pattern=context.createPattern(backgroundImage,"repeat");
        context.fillStyle=pattern;
        context.font="bold 80px Arial";
        context.fillText("Canvas!",40,650);
        context.strokeText("Canvas!",40,650);//描边
     }
}
</script>

一、font:字型、字号和字体

context.font="bold 80px Arial";//设置字体的样式、大小、字型
context.fillText(String,x,y);//设置所填充的文字以及位置
context.strokeText(String,x,y);//绘制一行文字,这行文字只有外边框

context.fillText(String,x,y,[maxlen]);
context.strokeText(String,x,y,[maxlen]);
[maxlen]为可选参,描述所写文字的最长宽度为多少。

font-style的属性值:normal(默认值)、italic(斜体字)、oblique(倾斜字体);
font-variant的属性值:normal(默认值)、small-caps(小写字母变为小的大写字母);
font-weight的属性值:lighter(大多数浏览器不支持)、normal(默认值)、bold、bolder(大多数浏览器不支持);
font-size的属性值:20px(默认值)、2em、150%、xx-small、x-small、medium、large、x-large、xx-large;
font-family:设置多种字体备选(各个字体之间用逗号隔开);支持@font-face。

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=2000;
    
       var context=canvas.getContext('2d');
       
      //font-style的属性值
      context.fillStyle="#058";

      context.font="bold 40px sans-serif";
      context.fillText("欢迎大家多提意见!",40,100);
      
      context.font="italic bold 40px sans-serif";
      context.fillText("欢迎大家多提意见!",40,200);

      context.font="oblique bold 40px sans-serif";
      context.fillText("欢迎大家多提意见!",40,300);
      
      //font-variant的属性值
      context.font="bold 40px sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,400);
      
      context.font="small-caps bold 40px sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,500);

      //font-weight的属性值
      context.font="lighter 40px impact";
      context.fillText("欢迎大家多提意见!",40,600);
      
      context.font="normal 40px impact";
      context.fillText("欢迎大家多提意见!",40,700);

      context.font="bold 40px impact";
      context.fillText("欢迎大家多提意见!",40,800);
   
      context.font="bolder 40px impact";
      context.fillText("欢迎大家多提意见!",40,900);

      //font-size的属性值
      context.font="lighter 2em impact";
      context.fillText("欢迎大家多提意见!",40,1000);

      context.font="xx-small  sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1100);

      context.font="x-small  sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1200);

      context.font="medium sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1300);

      context.font="large sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1400);

      context.font="x-large sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1500);

      context.font="xx-large  sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1600);
}
</script>

二、文本对齐

1.描述文本的横向对齐方式(基准是给定文本的初始坐标值)

context.textAlign="left";
context.textAlign="right";
context.textAlign="center";

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
       
      //文本水平对齐
      context.fillStyle="#058";
      context.font="bold 20px sans-serif";

      context.textAlign="left";
      context.fillText("textAlign=left",400,100);

      context.textAlign="center";
      context.fillText("textAlign=center",400,200);

      context.textAlign="right";
      context.fillText("textAlign=right",400,300);
      
     //辅助线
     context.strokeStyle="#888";
     context.moveTo(400,0);
     context.lineTo(400,400);
     context.stroke();     
}
</script>

2.描述文本的垂直对齐方式

context.textBaseline="top";
context.textBaseline="middle";
context.textBaseline="bottom";
context.textBaseline="alphabetic";//(默认值)基于拉丁字符的语言
context.textBaseline="ideographic";//基于汉字及日本文字来设置的垂直方向的基准线
context.textBaseline="hanging";//基于印度文的字符串来设计的垂直方向的基准线

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
       
      //文本垂直对齐 
      context.fillStyle="#058";
      context.font="bold 20px sans-serif";

     context.textBaseline="top";
     context.fillText("欢迎大家提意见!",40,100);
     drawBaseline(context,100);

     context.textBaseline="middle";
     context.fillText("欢迎大家提意见!",40,200);
     drawBaseline(context,200);

     context.textBaseline="bottom";
     context.fillText("欢迎大家提意见!",40,300);
     drawBaseline(context,300);
     
     function drawBaseline(cxt,b){
       var width=cxt.canvas.width;

       cxt.save();
      
       cxt.strokeStyle="#888";
       cxt.lineWidth=2;
       cxt.moveTo(0,b);
       cxt.lineTo(width,b);
       cxt.stroke();

       cxt.restore();
     }    
}
</script>

3.文本对齐小实例

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
       

      //文本垂直对齐 
      context.fillStyle="#058";
      context.font="bold 120px Arial";

      context.textAlign="center";
      context.textBaseline="middle";
      context.fillText("CANVAS",canvas.width/2,canvas.height/2);
    
       context.strokeStyle="#888";
       context.moveTo(0,canvas.height/2);
       context.lineTo(canvas.width,canvas.height/2);
       context.moveTo(canvas.width/2,0);
       context.lineTo(canvas.width/2,canvas.height);
       context.stroke();  
     }
</script>

三、文本的度量

context.measureText(string).width
传入字符串将返回一个对象,这个对象拥有一个.width的属性,这个属性将返回传入字符串在canvas中渲染时渲染出的字符串的宽度。

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
      
      //文本垂直对齐 
      context.fillStyle="#058";
      context.font="bold 40px sans-serif";

      context.fillText("欢迎大家多提意见!",40,100);
      var textWidth=context.measureText("欢迎大家多提意见!").width;
      context.fillText("以上字符串的宽度为"+textWidth+"px",40,200);
     }
</script>

四、总结

在之前学习的基础上绘制一片星空并在合适的位置加上文字,效果图如下:

效果图.jpg

代码如下:

<body >
 <canvas id="canvas" style="border: 1px solid #aaa;display: block;margin: 50px auto">
 当前浏览器不支持canvas,请更换浏览器后再试
 </canvas>

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=1024;
       canvas.height=800;
    
       var context=canvas.getContext('2d');

       //绘制标准五角星
       var skyStyle=context.createRadialGradient(canvas.width/2,canvas.height,0,canvas.width/2,canvas.height,canvas.height);
       skyStyle.addColorStop(0.0,'#035');
       skyStyle.addColorStop(1.0,'black');
       context.fillStyle=skyStyle;
       context.fillRect(0,0,canvas.width,canvas.height);

        for(var i=0;i<200;i++){
        var R=Math.random()*5+5;//星星可以变小
        var x=Math.random()*canvas.width;
        var y=Math.random()*canvas.height*0.65;//js 中的Math.random()随机产生0-1之间的数  星星产生的竖直位置从0到画布高度的65%
        var a=Math.random()*360;
        drawStar(context,R,x,y,a);
        }
       fillMoon(context,2,900,200,50,30);
       drawLand(context);//绘制绿地,只需要传入上下文的绘图环境

       //************************************插入文字
      context.fillStyle="#eee";
      context.font="bold 30px sans-serif";

      context.fillText("开心糖果的夏天!",200,700);
      context.fillText("——zhao peirong!",600,750);
      }

      //******************************************绘制星星
      function drawStar(cxt,R,x,y,rot){
       cxt.save();

       cxt.translate(x,y);//位移
       cxt.rotate(rot/180*Math.PI);//旋转
       cxt.scale(R,R);
       starPath(cxt);//函数的作用是绘制标准的五角星的路径

       cxt.fillStyle="#fb3";
       cxt.fill();
       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.closePath();
      }

      //******************************************绘制月亮
       //d为控制点横坐标的值  x,y表示弯月的位置 R表示弯月的半径
      function fillMoon(cxt,d,x,y,R,rot,fillColor){
       cxt.save();

       cxt.translate(x,y);
       cxt.rotate(rot*Math.PI/180);
       cxt.scale(R,R);
       pathMoon(cxt,d);//绘制弯月的轮廓
       cxt.fillStyle=fillColor||"#fb3";//fillColor 不给赋值时,用默认的#fb5
       cxt.fill();

       cxt.restore();
      }
      
      function pathMoon(cxt,d){
       cxt.beginPath();
       cxt.arc(0,0,1,0.5*Math.PI,1.5*Math.PI,true);
       cxt.moveTo(0,-1);
       cxt.arcTo(d,0,0,1,dis(0,-1,d,0)/d);//内弧结束的位置为0,1
       cxt.closePath();
      }

      function dis(x1,y1,x2,y2){
        return Math.sqrt((x1-x2)*(x1-x2)+(y2-y1)*(y2-y1));     
      }

      //******************************************绘制绿地
      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 landStyle=cxt.createLinearGradient(0,800,0,0);
       landStyle.addColorStop(0.0,'#030');
       landStyle.addColorStop(1.0,'#580');
       cxt.fillStyle=landStyle;
       cxt.fill();

       cxt.restore();
      }
</script>
</body>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,676评论 2 32
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,747评论 1 92
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,940评论 3 40
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 重写Context:http://www.imooc.com/video/4324/0 https://www.w...
    Mandy_jin阅读 695评论 0 0