辰迅云帮助中心

帮助中心

canvas与svg的区别 有哪些

2021/5/20 14:33:03

小编给大家分享一下canvas与svg的区别 有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!canvas(画布)是html5新增的标签元素,用来定义图形,比如图表和其他图像。<canvas>标签只是图形容器,必须使用脚本(通常为javascript)来绘制图形。canvas与svg的区别  canvas是HTML5提供的新元素<canvas>,而svg存在的历史要比canvas久远,已经有十几年了。svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或属性)描述二维图形的语言。 首先,从它们的功能上来讲,canvas可以看做是一个画布。其绘制出来的图形为标量图,因此,可以在canvas中引入jpg或png这类格式的图片,在实际开发中,大型的网络游戏都是用canvas画布做出来的,并且canvas的技术现在已经相当的成熟。 另外,我们喜欢用canvas来做一些统计用的图表,如柱状图曲线图或饼状图等。而svg,所绘制的图形为矢量图,所以其用法上受到了限制。因为只能绘制矢量图,所以svg中不能引入普通的图片,因为矢量图的不会失真的效果,在项目中我们会用来做一些动态的小图标。 但是由于其本质为矢量图,可以被无限放大而不会失真,这很适合被用来做地图,而百度地图就是用svg技术做出来的。 另外从技术发面来讲canvas里面绘制的图形不能被引擎抓取,如我们要让canvas里面的一个图片跟随鼠标事件:canvas.onmouseover=function(){}。而svg里面的图形可以被引擎抓取,支持事件的绑定。 另外canvas中我们绘制图形通常是通过JavaScript来实现,svg更多的是通过标签来来实现,如在svg中绘制正矩形形就要用<rect>,这里我们不能用属性style="width:XXX;height:XXX;"来定义。 我再来介绍一个svg的js库:TWO.JS。其中包含two.js和three.js前者用于绘制二维图形,后者用于绘制三维图形。TWO.JS可以支持三种格式,svg(默认)、canvas、和WEBGL。当然也可以在普通div中引入。 要从同一图形的一个<canvas>标记中移除元素,需要擦掉重新绘制;而svg很容易编辑,只要从其描述中移除元素即可。 以上是之前在别人博客中看到的,所以先引用过来,待之后熟练掌握canvas,svg再写自己的心得体会。 具体请参考1、基本语法<canvas id="canvasMain" width="800" height="600" >您的浏览器不支持canvas</canvas>当没有设置宽度和高度的时候,canvas会初始化宽度为300px和高度为150px;当浏览器不支持canvas标签的时候,会显示其中的文字。在canvas坐标体系中,以左上角为坐标原点,向右为x轴正方向,向下为y轴正方向,如下图:进行绘制需要获取canvas的上下文环境context,之后调用API进行图像绘制var canvas = document.getElementById("canvasMain"),     ctx = canvas.getContext("2d");替换内容是在不支持<canvas>标签的浏览器中展示的。也可以通过检测getContext()方法的存在来判断是否支持(有些浏览器会为html规范之外的元素创建默认的html元素对象)var canvas = document.getElementById("canvasMain");if(canvas.getContext("2d")) {     var ctx = canvas.getContext("2d");     // drawing code here} else {     // canvas-unsupported code here}导出在<canvas>元素上绘制的图像,接收一个参数,即图像的MIME类型格式。若绘制到画布上的图像来自不同域,该方法会报错var canvas = document.getElementById("canvasMain");if(canvas.getContext) {//取得图像的数据URIvar imgURI = canvas.toDataURL('image/png');//显示图像var image =  document.createElement('img');     image.src = imgURI;     document.body.appendChild(image);         }2、2D上下文填充和描边  填充:用指定的样式(颜色、渐变、图像)填充图形;描边:在图形的边缘画线   两个属性分别是fillStyle  strokeStyle,属性的值可以是字符串、渐变对象或模式对象绘制矩形          绘制矩形方法:fillRect()  strokeRect()   clearRect()  参数依次为:矩形x坐标、y坐标、宽度、高度var drawing = document.getElementById('drawing');if(drawing.getContext) {var context = drawing.getContext('2d');     context.strokeStyle = 'rgba(0, 0, 255, 0.5)';//描边属性context.fillStyle = 'pink';//填充属性context.lineWidth = 3; //描边线条宽度context.lineCap = 'square';//线条末端形状(butt平头、round圆头、square方头)context.lineJoin = 'round';//线条相交的方式(round圆交、bevel斜交、miter斜接)context.fillRect(10, 10, 50, 50);//填充矩形context.fillStyle = 'green';     context.fillRect(30, 30, 50, 50);     context.strokeRect(100, 10, 50, 50);//描边矩形context.clearRect(40, 40, 15, 15);//清除画布上的矩形区域             }绘制路径     closePath()绘制一条连接到路径起点的线条   fill()填充路径    stroke()描边路径   clip()在路径上创建一个剪切区域  isPointInPath(x,y)判断画布上的某一点是否位于路径上var drawing = document.getElementById('drawing');if(drawing.getContext) {/*绘制路径*/var context = drawing.getContext('2d');            context.strokeStyle = 'pink';            context.beginPath();//开始绘制新路径//绘制外圆context.arc(100, 100, 99, 0, 2*Math.PI, false);//参数依次为圆心坐标x、y、半径、起始角度(用弧度表示)、结束角度、起始角度是否按逆时针方向计算(flase为顺时针)context.moveTo(194, 100);//将绘图游标移动到(x,y),不画线//绘制内圆context.arc(100, 100, 94, 0, 2*Math.PI, false);//绘制分针context.moveTo(100, 100);            context.lineTo(100, 25);//从上一点开始绘制一条直线,到(x,y)为止//绘制时针context.moveTo(100, 100);            context.lineTo(35, 100);//绘制文本context.font = 'bold 14px Arial';//表示文本样式、大小、字体context.textAlign = 'center';//文本对齐方式(start、end、left、right、center),建议用start、end代替left、rightcontext.textBaseline = 'middle';//文本的基线(top、hanging、middle、alphabetical、ideopgraphic、bottom)context.fillText('12', 100, 20);//描边路径            context.stroke();//额外练习context.moveTo(230, 10);//arcTo(x1,y1,x2,y2,radius):从上一点开始绘制一条弧线,到(x2,y2)为止,并以给定的半径穿过(x1,y1)context.arcTo(280, 60, 330, 10, 50);//bezierCurveTo(c1x,c1y,c2x,c2y,x,y):从上一点开始绘制一条曲线,到(x,y)为止,并以(c1x,c1y)(c2x,c2y)为控制点context.bezierCurveTo(210, 70, 290, 90, 300, 100);            context.moveTo(320, 10);//quadraticCurveTo(cx,cy,x,y):从上一点开始绘制一条二次曲线,到(x,y)为止,并以(cx,cy)为控制点context.quadraticCurveTo(420, 100, 400, 10);//rect(x,y,width,height):从点(x,y)开始绘制矩形,此方法绘制的是矩形路径而不是独立的形状context.rect(450, 10, 50, 50);            context.stroke();}绘制文本  fillText()绘制文本    strokeText()为文本描边    参数:文本字符串、x坐标、y坐标、可选的最大像素宽度变换  var drawing = document.getElementById('drawing');if(drawing.getContext) {            //变换var context = drawing.getContext('2d');            context.strokeStyle = 'rgba(0, 0, 255, 0.5)';            context.beginPath();            context.arc(100, 100, 99, 0, 2*Math.PI, false);            context.moveTo(194, 100);            context.arc(100, 100, 94, 0, 2*Math.PI, false);//变换原点context.translate(100, 100);//将坐标原点移动到该点//旋转表针context.rotate(1);//围绕原点旋转图像angle弧度//绘制分针context.moveTo(0, 0);            context.lineTo(0, -80);//绘制时针context.moveTo(0, 0);            context.lineTo(-65, 0);            context.stroke();            context.rotate(-1);            context.fillStyle = 'rgba(0, 0, 255, 0.5)';            context.save();//保存上下文状态,只保存绘图上下文的设置和变换,不会保存绘图上下文的内容context.fillStyle = 'pink';            context.translate(-100, -100);            context.save();            context.fillStyle = 'green';            context.fillRect(220, 10, 50, 50);            context.restore();//返回之前保存的设置context.fillRect(280, 10, 50, 50);            context.restore();            context.fillRect(340, 10, 50, 50);}绘制图像    drawImage()还可传入<canvas>元素作为第一个参数,表示把另一个画布内容绘制到当前画布上。  可能遇到的问题:drawImage()图片不显示在画布上,原因可能是你取图片的时候,此时图片还没有加载出来window.onload = function(){var drawing = document.getElementById('drawing');if(drawing.getContext) {//图像var context = drawing.getContext('2d');var image = document.images[0];//参数依次表示为:图像元素、源图像x坐标、y坐标、目标的宽度、高度context.drawImage(image, 0, 0, 150, 250);//参数依次表示为:图像元素、源图像x坐标、y坐标、源图像宽度、高度、目标图像x坐标、y坐标、目标图像宽度、高度context.drawImage(image, 100, 300, 500, 600, 0, 0, 70, 80);        }};阴影、渐变、模式    模式与渐变一样,都是从画布原点(0,0)开始的,将填充样式设置为模式对象,只表示在某个特定区域内显示重复的图像,而不是从某个位置开始绘制重复的图像。   createPattern()第一个参数也可以是<video>元素,或者是另一个<canvas>元素window.onload = function(){var drawing = document.getElementById('drawing');if(drawing.getContext) {//阴影var context = drawing.getContext('2d');            context.shadowColor = 'rgba(0, 0, 0, 0.5)';//阴影颜色,默认黑色context.shadowOffsetX = 5;//x轴方向的阴影偏移量,默认0context.shadowOffsetY = 5;//y轴方向的阴影偏移量,默认0context.shadowBlur = 4;//模糊的像素数,默认0context.fillStyle = 'rgba(0, 0, 255, 0.5)';            context.fillRect(10, 10, 50, 50);            context.fillStyle = 'pink';            context.fillRect(30, 30, 50, 50);//渐变var gradient = context.createLinearGradient(100, 10, 130, 130);//创建线性渐变,返回CanvasGradient对象的实例。参数:起点x坐标、y坐标、终点x坐标、y坐标gradient.addColorStop(0, 'white');//指定色标,参数:色标位置(0到1之间的数字,0表示开始的颜色,1为结束的颜色)、css颜色值gradient.addColorStop(1, 'black');            context.fillStyle = gradient;            context.fillRect(100, 10, 50, 50);var createLinearGradient = function(context, x, y, width, height) {return context.createLinearGradient(x, y, x+width, y+height);            };var gradientNew = createLinearGradient(context, 180, 10, 50, 50);            gradientNew.addColorStop(0, 'red');            gradientNew.addColorStop(1, 'green');            context.fillStyle = gradientNew;            context.fillRect(180, 10, 50, 50);var gradientRound = context.createRadialGradient(275, 35, 10, 275, 35, 30);//径向渐变,参数:起点圆的圆心、半径,终点圆的圆心、半径gradientRound.addColorStop(0, 'pink');            gradientRound.addColorStop(1, 'blue');            context.fillStyle = gradientRound;            context.fillRect(250, 10, 50, 50);//模式,即重复的图像,可以用来填充或描边图形var image = document.images[0],                pattern = context.createPattern(image, 'repeat-x');//创建新模式,参数:图像元素、是否重复(repeat、repeat-x、repeat-y、no-repeat)context.fillStyle = pattern;            context.fillRect(350, 10, 350, 350);        }}使用图像数据  getImageData()可取得原始图像数据,参数:要取得数据的画面区域的x坐标、y坐标、宽度、高度。返回的对象是ImageData的实例,该对象有3个属性:width、height和data。其中data为数组,保存着图像中每一个像素的数据,每一个像素用4个元素来表示,分别表示红、绿、蓝和透明度值。因此,第一个像素的数据保存在数组的第0到第3个元素中。  注意:只有在画布“干净”的情况下(即图像并非来自其他域),才可以取得图像数据。合成  globalAlpha:介于0和1之间的值(包括0和1),用于指定透明度,默认为0。  globalComositionOperation:表示后绘制的图形怎样与先绘制的图形结合。     3、WebGL  WebGL是针对canvas的3D上下文,并不是由W3C制定的标准。canvas作为H5一个重要的新特性,大家需要花点精力去学习使用它。以上是“canvas与svg的区别 有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...

这篇文章主要介绍了HTMLcanvas矩形阵雨怎么实现,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。HTMLcanvas矩形阵雨在画布上执行获取制图环境全屏获取屏幕宽度和屏幕高度确定每个文字的宽度 以确定列循环输出定时器调用HTML 部分<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>HTMLcanvas矩形阵雨</title></head><body><canvas id="c">您的浏览器不支持 请升级</canvas></body></html>CSS 部分<style type="text/css">/* 基本的复位 */* {     margin:0;     padding:0;}/* 给body一个背景 使画布看起来更清晰 */body {     background-color:#000;}canvas {     display:block;}</style>Javascript 部分<script type="text/jscript"> var c = document.getElementById("c"); //获取id var ctx = c.getContext("2d"); //2d制图  c.width = window.innerWidth; //获取屏幕宽度 c.height = window.innerHeight; //获取屏幕高度   var chinese = "abcdefghijklmnopqrstuvwxyz"; //canvas 阵雨文字 chinese = chinese.split(""); //split 分离   var font_size = 10; //字体大小 10px var columns = c.width/font_size;   //获取列 屏幕宽度/字体大小 var drops = []; // drop 落下 新建数组 for(n=0; n < columns; n++) //控制列输出     drops[n] = 1; //draw function draw(){      ctx.fillStyle = "rgba(0,0,0,0.05)"; //绘制矩形     ctx.fillRect(0,0,c.width,c.height); //以(0,0)为坐标 画制矩形          ctx.fillStyle = "#0F0"; //绿色字体     ctx.font = font_size + "px arial"; //以像素为单位 宋体                for(var i=0; i< drops.length; i++)      {         var text = chinese[Math.floor(Math.random()*chinese.length)];         // Math.floor 对浮点数向下取整         ctx.fillText(text, i*font_size, drops[i]*font_size);         // 规定在画布上输出的文本 开始绘制文本的x坐标 y坐标         if(drops[i]*font_size > c.height && Math.random() > 0.975)         // 如果下落的文本大于屏幕高度 或者 随机数大于0.975             drops[i] = 0;         // 重置下落         drops[i]++;         // 继续执行     } }  setInterval(draw,33); //33 执行一次draw()</script>感谢你能够认真阅读完这篇文章,希望小编分享的“HTMLcanvas矩形阵雨怎么实现”这篇文章对大家有帮助,同时也希望大家多多支持辰讯云,关注辰讯云资讯频道,更多相关知识等着你来学习!...

这篇文章主要介绍了html5中canvas微信海报的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文介绍了canvas 微信海报分享,分享给大家,具体如下:随机产生一张图片拿到微信用户的头像和称呢(自己调后端的接口获取)把用户头像和称呢和随机产生一张图片合成一张海报可能上一页用户还有填入的心愿文本也要填入图片中实现效果图记录下在实现功能过程中遇到的问题canvas在微信浏览器中长按无效不能像img一样长按分享(那我就转成img呗)转成img后在微信开发者工具中能显示,真机无效(欲哭无泪),度娘说可能是图片跨域^-^用户头像合成还要圆角,我表示不会啊,直接看canvas api文档了对度娘无爱了canvas填入文字超过指定宽度也要换行,我表示只知道不超多指定宽度的各种文字对齐方式 ctx.textAlign = 'center' ;canvas在高清屏下模糊的问题(超简单的不知道度娘怎么会那么啰嗦)不就是canvas.witdt=innerWidth*devicePixelRatioHTML结构<p class="imgBox" v-cloak>    <img :src='imgSrc' v-if="imgSrc" /></p>CSS<style>    *{         margin:0;         padding:0;     }     body,     html {         width: 100%;         height: 100%;     }     .imgBox {         width: 100%;         height: 100%;     }     img {         width: 100%;         display: block;     }</style>script// js主要结构new Vue({     el:'imgBox',     data:{         urlParam: {},//获取url中的传值对象        randomNum: 1,//随机数用于确定那个祈福页        userName: '',//用户称呢        imgSrc: '',//合成最终图片        userImg: '',//用户头像图片        userMessage: '',//用户留言    },     methods: {         // 分享到盆友圈        wxShareFriends: function () {},         // 初始化请求头        wxHttp: function () {             $.ajaxSetup({                 headers: {                 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')                 }             });         },         // 获取随机数[1,10]        randomNumbers() {             this.randomNum = Math.ceil(Math.random() * 10)         },         // 获取微信用户头像和称呢和用户输入祝福语        getUserInfo() {             var vm = this;             $.post('API请求地址', function (data) {                 if (data.code == 1) {                     vm.userImg = data.data.headimg;                     vm.userName = data.data.nickname;                     if (vm.randomNum % 2 == 0) {                         vm.userMessage= '红尘相遇,年华已老。岁月花开多少不在,古往今来相遇是一件既微妙。而又神圣的事情,红尘的情网中'                    } else {                         vm.userMessage = '红尘相遇,年华已老'                    }                 }                 vm.$nextTick(function () {                     vm.drawCanvasBgImg();                 })             })         },         // 获取页面dpr和宽度        getWindowInfo() {             var windowInfo = {};             windowInfo.dpr = window.devicePixelRatio;             if (window.innerWidth) {                 windowInfo.width = window.innerWidth;             }             else {                 windowInfo.width = document.body.clientWidth;             }             return windowInfo;         },         // 画活动页分享背景大图        drawCanvasBgImg () {},         // 在背景图片的画布上截取一个圆然后填充入用户头像        drawCanvasUserImg(canvas, ctx, dpr) {},         // 填写用户称呢或者用户留言        canvasFillText (canvas, ctx, dpr, circleR) {},         // 合成base64位分享图        convertCanvasToImage (canvas) {             this.imgSrc = canvas.toDataURL("image/jpeg");//png有毒在安卓机下识别二维码无法跳转            this.$Spin.hide();         }     } })画图方法步骤drawCanvasBgImg ()drawCanvasUserImg (canvas, ctx, dpr)canvasFillText (canvas, ctx, dpr, circleR)convertCanvasToImage (canvas)画活动页分享背景大图 drawCanvasBgImg ()//拿到数据后开始画背景大图 想法很简单就是把图片画到canvas中然后在画布上再画头像文字让后转成img drawCanvasBgImg () {     var vm = this;     var canvas = document.createElement("canvas");     var ctx = canvas.getContext("2d");     var clientWidth = this.getWindowInfo().width;  //获取屏幕宽度用于canvas宽度自适应移动端屏幕    var dpr = this.getWindowInfo().dpr;     ctx.globalCompositeOperation = "source-atop";//** 坑锯齿感觉没什么用不知道是不是用错地方了 **    canvas.width = dpr * clientWidth;  //由于手机屏幕时retina屏,都会多倍渲染,用dpr来动态设置画布宽高,避免图片模糊    canvas.height = dpr * clientWidth * 609 / 375;//去掉微信头部的状态栏应该是603 没搞懂603还是不能让图片满屏直接多加到了609    var img = new Image();     img.crossOrigin = '';//死坑的图片跨域 (img.crossOrigin = "Anonymous"这种写法还是不能显示base64格式图片)    img.src = "http://xxx" + this.randomNum + ".jpg";     img.onload = function () {         ctx.drawImage(img, 0, 0, canvas.width, canvas.height);         vm.drawCanvasUserImg(canvas, ctx, dpr);     } },用户头像 drawCanvasUserImg (canvas, ctx, dpr)// 在背景图片的画布上截取一个圆然后填充入用户头像drawCanvasUserImg: function (canvas, ctx, dpr) {     var vm = this;     var circleR = 50 * dpr;//半径    var circleX = canvas.width / 2;//圆心X坐标    var circleY = 50 * dpr;//圆心Y坐标    var imgX = circleX - circleR;//图片X开始坐标    var imgY = circleY - circleR;//图片Y开始坐标    var imgWidth = 2 * circleR;//图片按圆形大小    var img = new Image();     img.crossOrigin = '';     img.src = this.userImg;     img.onload = function () {         ctx.save(); // 保存当前ctx的状态        ctx.arc(circleX, circleY, circleR, 0, 2 * Math.PI); //画出圆        ctx.clip(); //裁剪上面的圆形        ctx.drawImage(img, imgX, imgY, imgWidth, imgWidth); // 在刚刚裁剪的园上画图        ctx.restore(); // 还原状态        vm.canvasFillText(canvas, ctx, dpr, circleR);     } },在canvas中画文字// 填写用户称呢或者用户留言canvasFillText (canvas, ctx, dpr, circleR) {     var fontSizeThis = dpr * 20 + 'px' + ' Arial';     var userNameY = 0;//用户名Y轴坐标    var userMessageX = dpr * 40;//用户留言X轴坐标    var userMessageY = 0;//用户留言Y轴坐标    var lastSubStrIndex = 0;//字符串下标    var lineWidth = 0;//一行宽度    var allTextWidth = 0;//所有字符宽度    ctx.font = fontSizeThis;     // 需要用户名是写入用户名    if (this.userName) {         userNameY = circleR * 2.5;         ctx.fillStyle = "#0094ff";         ctx.textAlign = 'center';         ctx.fillText(this.userName, canvas.width / 2, userNameY);     }     if (this.userMessage) {         userMessageY = userNameY + dpr * 35;         ctx.fillStyle = "#000";         // 获取字符宽度        for (var i = 0; i < this.userMessage.length; i++) {             allTextWidth += ctx.measureText(this.userMessage[i]).width;         }         // 字符串长度大于画布区域要换行        if (allTextWidth > canvas.width - 2* userMessageX) {             for (var i = 0; i < this.userMessage.length; i++) {                 lineWidth += ctx.measureText(this.userMessage[i]).width;                 if (lineWidth > canvas.width - 2*userMessageX) {                     ctx.textAlign = 'left';                     ctx.fillText(this.userMessage.substring(lastSubStrIndex, i), userMessageX, userMessageY);                     userMessageY += dpr * 25;//设置行高                    lineWidth = 0;                     lastSubStrIndex = i;                 }                 if (i == this.userMessage.length - 1) {                     ctx.fillText(this.userMessage.substring(lastSubStrIndex, i + 1), userMessageX, userMessageY);                 }             }         } else {             // 小于者居中显示            ctx.textAlign = 'center';             ctx.fillText(this.userMessage, canvas.width / 2, userMessageY);         }     }     this.convertCanvasToImage(canvas); },感谢你能够认真阅读完这篇文章,希望小编分享的“html5中canvas微信海报的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持辰讯云,关注辰讯云资讯频道,更多相关知识等着你来学习!...

小编给大家分享一下Canvas中手绘风格图形库Rough.js的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Rough.jsRough.js是一个轻量的(大约8k),基于Canvas的可以绘制出粗略的手绘风格库。提供绘制线条、曲线、弧线、多边形、圆形和椭圆的基础能力,同时支持绘制SVG路径。Github:https://github.com/pshihn/rough安装下载链接:https://github.com/pshihn/rough/tree/master/distNPMnpm install --save roughjs使用方法const rc = rough.canvas(document.getElementById('canvas')); rc.rectangle(10, 10, 200, 200); // x, y, width, height线条和椭圆rc.circle(80, 120, 50); // centerX, centerY, diameterrc.ellipse(300, 100, 150, 80); // centerX, centerY, width, heightrc.line(80, 120, 300, 100); // x1, y1, x2, y2填充rc.circle(50, 50, 80, { fill: 'red' }); // fill with red hachurerc.rectangle(120, 15, 80, 80, { fill: 'red' });rc.circle(50, 150, 80, {   fill: "rgb(10,150,10)",   fillWeight: 3 // thicker lines for hachure});rc.rectangle(220, 15, 80, 80, {   fill: 'red',   hachureAngle: 60, // angle of hachure,  hachureGap: 8});rc.rectangle(120, 105, 80, 80, {   fill: 'rgba(255,0,200,0.2)',   fillStyle: 'solid' // solid fill});草绘风格rc.rectangle(15, 15, 80, 80, { roughness: 0.5, fill: 'red' });rc.rectangle(120, 15, 80, 80, { roughness: 2.8, fill: 'blue' });rc.rectangle(220, 15, 80, 80, { bowing: 6, stroke: 'green', strokeWidth: 3 });SVG 路径rc.path('M80 80 A 45 45, 0, 0, 0, 125 125 L 125 80 Z', { fill: 'green' });rc.path('M230 80 A 45 45, 0, 1, 0, 275 125 L 275 80 Z', { fill: 'purple' });rc.path('M80 230 A 45 45, 0, 0, 1, 125 275 L 125 230 Z', { fill: 'red' });rc.path('M230 230 A 45 45, 0, 1, 1, 275 275 L 275 230 Z', { fill: 'blue' });简单的SVG路径结合Web Workers如果在网页中有import Workly 这个Web Workers库,RoughJS会自动将所有的操作转移至web workers,来释放UI主线程。这个在使用RoughJS来创建复杂绘图(如地图)时非常有用。详细阅读相关内容 。<script src="https://cdn.jsdelivr.net/gh/pshihn/workly/dist/workly.min.js"></script><script src="../../dist/rough.min.js"></script>以上是“Canvas中手绘风格图形库Rough.js的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...

本篇文章为大家展示了怎么在SQL中使用Unpivot函数实现列转行,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。创建数据 CREATE TABLE dbo.CustomerPhones (  CustomerID INT PRIMARY KEY, -- FK Phone1 VARCHAR(32),  Phone2 VARCHAR(32),  Phone3 VARCHAR(32) );INSERT dbo.CustomerPhones  (CustomerID, Phone1, Phone2, Phone3)VALUES (1,'705-491-1111', '705-491-1110', NULL),  (2,'613-492-2222', NULL, NULL),  (3,'416-493-3333', '416-493-3330', '416-493-3339');  select * from dbo.CustomerPhones查看数据如下:DataDataUpivot 实现行转列 select * from dbo.CustomerPhones -----数据源 unpivot  (    Phone FOR Phones IN (Phone1, Phone2, Phone3)    ##Phone1、Phone2、Phone3这些列的结果转为行上的结果,成为一列,  ##并且有了新的列名为Phone) up结果如下:ResultResult上述内容就是怎么在SQL中使用Unpivot函数实现列转行,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云资讯频道。...

这篇文章给大家分享的是有关Dreamweaver如何快速插入段落文字的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、在DW中找到body内容部分,在两个body中间点击一下,将光标移动到此处 2、然后在上方的菜单中打开插入,里面有一个段落样式,这个就是专门针对段落文字的处理了3、当点击插入后,在刚才光标处就会出现一个p标签,中间是可以编辑的文字内容4、将中间的文字随意设置,更改为自己的文字内容5、如果想要在浏览器中看效果,在文件中打开实时预览即可6、在浏览器中就可以看到刚才的文字内容就变成了在浏览器中可以看到的文字信息7、段落文字如果输入多行的时候,可以插入多个p标签,中间更改内容,p标签是可以自动换行的8、然后我们设置多个p标签后,看到的预览效果就是这样的,如图所示感谢各位的阅读!关于“Dreamweaver如何快速插入段落文字”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...

静态ip和动态ip的优缺点对比?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。动态ip优点:1、共享性动态IP可以最大限度地节约IP地址资源,IP地址以租用的方式使用,使用完后释放,使得IP地址可以重新使用。2、安全动态IP可防止攻击事件的发生。动态ip缺点:需要DHCP服务器,主机获取的IP地址不固定,不适用于提供网络服务的主机。静态IP是一个IP地址,长时间内分配给计算机或网络设备使用。静态ip优点:1、稳定性更好,静态IP可以更稳定,可以作为自己的网址和服务器地址。2、管理方便,静态IP可以通过IP地址对对应电脑进行远程访问。静态ip缺点:静态IP分配给运营商的IP地址是固定的,只能分配给指定的用户,通常用于大公司的网络、公网服务器,价格较高。以上就是关于静态ip和动态ip的优缺点的相关介绍了,希望能够给大家带来帮助,其次,如果大家想测试使用下,可以尝试品易看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注辰讯云资讯频道,感谢您对辰讯云的支持。...

怎么在pandas中将NaN转换为None?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。原始数据:示例代码:import pandas as pd         df = pd.read_excel('data/test_data.xlsx')# 将非空数据保留,空数据用None替换df = df.where(df.notnull(), None) print(df)输出结果:id value0 1 1001 2 None2 3 None3 4 50补充:Pandas Nan & None 处理在处理数据的时候遇到这个问题。数据库里的值 是null然后读取数据库后得到的dataframe 里显示的事None.想把这些None 装换成0.0 但是试过很多方法都不奏效。使用过df['PLANDAY'].replace('None',0)未奏效这个判断句是生效的df.loc[0,'PLANDAY'] is None:后来发现这个数据类型是Nan 不是None因此使用解决了上诉问题。df['PLANDAY'] = df['PLANDAY'].fillna(0.0)关于怎么在pandas中将NaN转换为None问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注辰讯云资讯频道了解更多相关知识。...

如何在Linux中使用gettimeofday函数获取程序执行时间?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中。此函数接收两个结构体参数,分别为timeval、timezone.        两个结构体的声明如下:struct timeval {    time_t tv_sec; /* seconds */    long tv_usec;  /* microseconds */  }; struct timezone {    int tz_minuteswest;    int tz_dsttime;  };        一般通过gettimeofday函数获得当前时间时,第二个参数为nullptr。结构体timeval中的tv_sec表示秒,tv_usec表示微秒。        matlab中通过tic(start a stopwatch timer)和toc(read the stopwatch timer)两个函数来给出程序段所运行的时间,这里通过两个宏TIC和TOC来实现。测试代码如下:#include <sys/time.h> #include <unistd.h> #include <iostream> #define TIC                               \   struct timeval time1, time2;                    \    gettimeofday(&time1, nullptr); #define TOC                               \   gettimeofday(&time2, nullptr);                   \    double elapsed_time = (time2.tv_sec - time1.tv_sec) * 1000. +    \          (time2.tv_usec - time1.tv_usec) / 1000.;        \    fprintf(stdout, "Elapsed time: %lf(ms)\n", elapsed_time); int main() {    unsigned int tm{10};    TIC    for (int i = 0; i < 1000; ++i) {      usleep(tm);    }    TOC    return 0;  }        执行结果如下:        执行过程:将终端定位到Linux_Code_Test/Samples_cplusplus目录下,执行:./build.sh,然后进入到build目录下,执行生成的执行文件即可。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。看完上述内容,你们掌握如何在Linux中使用gettimeofday函数获取程序执行时间的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注辰讯云资讯频道,感谢各位的阅读!...

这篇文章主要介绍jQuery如何实现中奖播报功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独特的链式语法和短小清晰的多功能接口、高效灵活的css选择器,并且可对CSS选择器进行扩展、拥有便捷的插件扩展机制和丰富的插件,是继Prototype之后又一个优秀的JavaScript代码库,能够用于简化事件处理、HTML文档遍历、Ajax交互和动画,以便快速开发网站。1:html代码文件     相关使用说明也在页面相关位置标注啦<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /><title>文本滚动</title><link rel="stylesheet" type="text/css" href="css/style.css" rel="external nofollow" ><script src="jquery-1.9.1.min.js"></script><script src="jquery.scroll.js"></script> <script src="txtscroll.js"></script> <style>.new_trade .new_trade_body .yl{margin-top:4px} .fix_tradebottom{clear:both;background:#222; position:fixed;width:100%;left:0;z-index:12;bottom:0}  .trade_win{height:26px;line-height:26px;width:54%;text-align:center;color:#646464;font-size:12px;border-top: 1px solid #c8c8c8;border-bottom: 1px solid #c8c8c8;background:#f3f3f3;}  #trade_win{height:26px;line-height:26px;width:100%;overflow:hidden;}  .trade_win ul{height:26px;line-height:26px}  .trade_win li{width:100%;display:block;}  .trade_win li span{ no-repeat;background-position: 0px 3px;background-size:13px 10px; padding-left:18px;}</style></head><h3 >纵向滚动</h3><div class="trade_win" > <div id="trade_win"> <ul> <li><span>恭喜道1中奖 825.00元</span></li> <li><span>恭喜道2中奖 825.00元</span></li> <li><span>恭喜道3中奖 825.00元</span></li> <li><span>恭喜道4中奖 825.00元</span></li> <li><span>恭喜道5中奖 825.00元</span></li> <li><span>恭喜道6中奖 825.00元</span></li> <li><span>恭喜道7中奖 825.00元</span></li> </ul> </div> </div><script> $(document).ready(function(){  //speed:滚动的速度 数值越大速度越慢。 timer:数据停留时间 数值越大停留时间越久 $('#trade_win').Scroll({ line: 1, speed: 1000, timer: 1500 });  })</script><div class="demo"> <h3>横向滚动</h3> <div class="demolist"> <ul class="ul"> <li> <h5>示例1 - 无滚动效果</h5> <div class="demo-cont"> <div class="txt-scroll txt-scroll-default">  <div class="scrollbox">  <div class="txt">   微信小程序端有关于一篇文章生成一张海报图片,用于用户保存之后分享,实际开发的过程中遇到的一些问题如下   </div>  </div> </div> </div> <div class="jsset"><pre>$('.txt-scroll').txtscroll({ 'speed': 50 }); //说明:文本长度不够无滚动效果</pre> </div> </li> <li> <h5>示例2 - 默认参数配置</h5> <div class="demo-cont"> <div class="txt-scroll txt-scroll-default">  <div class="scrollbox">  <div class="txt">   微信小程序端有关于一篇文章生成一张海报图片,用于用户保存之后分享,实际开发的过程中遇到的一些问题如下.微信小程序端有关于一篇文章生成一张海报图片,用于用户保存之后分享,实际开发的过程中遇到的一些问题如下.微信小程序端有关于一篇文章生成一张海报图片,用于用户保存之后分享,实际开发的过程中遇到的一些问题如下   </div>  </div> </div> </div> <div class="jsset"><pre>$('.txt-scroll').txtscroll({ 'speed': 50 });</pre> </div> </li> <li> <h5>示例2 - 自定义参数配置</h5> <div class="demo-cont"> <div class="txt-scroll txt-scroll-curs">  <div class="scrollbox">  <div class="txt">   微信小程序端有关于一篇文章生成一张海报图片,用于用户保存之后分享,实际开发的过程中遇到的一些问题如下.微信小程序端有关于一篇文章生成一张海报图片,用于用户保存之后分享,实际开发的过程中遇到的一些问题如下   </div>  </div> </div> </div> <div class="jsset"><pre>$('.txt-scroll').txtscroll({ 'speed': 20 });</pre> </div> </li> </ul> </div> </div> <script> //默认案例 window.onload = function () {  $('.txt-scroll-default').txtscroll({  'speed': 50 });  };  //自定义参数案例 $('.txt-scroll-curs').txtscroll({  'speed': 10 });  </script></body></html>2:关键的JS 文件(function($){  $.fn.extend({  Scroll:function(opt,callback){   if(!opt) var opt={};   var _btnUp = $("#"+ opt.up);   var _btnDown = $("#"+ opt.down);   var timerID;   var _this=this.eq(0).find("ul:first");   var lineH=_this.find("li:first").height(), //获取行高   line=opt.line?parseInt(opt.line,10):parseInt(this.height()/lineH,10), //每次滚动的行数,默认为一屏,即父容器高度   auto=opt.auto!=null?opt.auto:true,//是否自动滚动,默认自动   cycle=opt.cycle!=null?opt.cycle:true,//是否循环滚动,默认循环   speed=opt.speed!=null?parseInt(opt.speed,10):500; //卷动速度,数值越大,速度越慢(毫秒)   timer=opt.timer!=null?opt.timer:3000; //滚动的时间间隔(毫秒)  if(line==0) line=1;   var upHeight=0-line*lineH;   var liCount=_this.find("li").length;//LI的总数  var showCount=parseInt(this.height()/lineH);//显示出来的LI数量  var currentCount=showCount;   var scrollUp=function(){    if(!cycle && currentCount>=liCount) return;    _btnUp.unbind("click",scrollUp);    _this.animate({     marginTop:upHeight    },speed,function(){     for(i=1;i<=line;i++){      if(!cycle && currentCount>=liCount) break;      currentCount++;      _this.find("li:first").appendTo(_this);     }     _this.css({marginTop:0});     _btnUp.bind("click",scrollUp);    });   }   var scrollDown=function(){    if(!cycle && currentCount<=showCount) return;    _btnDown.unbind("click",scrollDown);    for(i=1;i<=line;i++){     if(!cycle && currentCount<=showCount) break;     currentCount--;     _this.find("li:last").show().prependTo(_this);    }    _this.css({marginTop:upHeight});    _this.animate({     marginTop:0   },speed,function(){     _btnDown.bind("click",scrollDown);    });   }   var autoPlay = function(){   if(auto) {    if(timer>0) timerID = window.setInterval(scrollUp,timer);   }   };   var autoStop = function(){    if(timer)window.clearInterval(timerID);   };   _this.hover(autoStop,autoPlay).mouseout();   _btnUp.css("cursor","pointer").click( scrollUp ).hover(autoStop,autoPlay);   _btnDown.css("cursor","pointer").click( scrollDown ).hover(autoStop,autoPlay);  }  }) })(jQuery);以上是“jQuery如何实现中奖播报功能”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注辰讯云资讯频道!...