• 关于 html-canvas 的搜索结果

回答

<script> var text="www.html5party.com" function change(){ text=document.getElementById("text").value; init(); } function init(){ watermark('canvas','http://www.html5party.com/wp-content/uploads/2013/04/google-glasses-1.jpg',text); } function watermark(id,imgsrc,txt) { canvas = document.getElementById(id); if (canvas.getContext){ ctx = canvas.getContext('2d'); var img1 = new Image(); img1.src=imgsrc; img1.onload = function(){ var imgWidth=img1.width; var imgHeight=img1.height; canvas.width= imgWidth; canvas.height=imgHeight; ctx.drawImage(img1,0,0); ctx.fillStyle = 'rgba(0, 0, 0, 0.25)'; ctx.font = '30px sans-serif'; ctx.fillText(txt, canvas.width-(txt.length*15),canvas.height-30); ctx.fillStyle = 'rgba(255, 255, 255, 0.25)'; ctx.fillText(txt, canvas.width-(txt.length*15)-2,canvas.height-32) } } } </script>

蛮大人123 2019-12-02 02:02:14 0 浏览量 回答数 0

问题

AttributeError:“_tkinter。对象没有属性TclError

kun坤 2019-12-25 09:43:34 4 浏览量 回答数 1

问题

web.py返回的html,chrome不解析

wildgirl 2019-12-01 19:31:53 1287 浏览量 回答数 4

新用户福利专场,云服务器ECS低至102元/年

新用户专场,1核2G 102元/年起,2核4G 699.8元/年起

问题

关于下面这个网站的动画特效,有点看不懂 他使用html的data来制作的 请问这个是纯CSS和javascript可以制作的吗?

杨冬芳 2019-12-01 19:54:18 960 浏览量 回答数 1

回答

js代码 $("#btn_upload4").click(function(){varfilename=1+"_fansImages.pdf";//将id为Modal5的div渲染成canvashtml2canvas(document.getElementById("Modal5"),{//渲染完成时调用,获得canvasonrendered:function(canvas){//从canvas提取图片数据varimgData=canvas.toDataURL('image/jpeg');varcanWidth=canvas.width;varcanHeight=canvas.height;vararrDPI=js_getDPI();//获取显示器DPIvardpiX=96;vardpiY=96;if(arrDPI.length>0){dpiX=arrDPI[0];dpiY=arrDPI[1];}//vardoc=newjsPDF("p","mm","a4");vardoc=newjsPDF('','in',[(canWidth+10)/dpiX,(canHeight+10)/dpiY]);//设置PDF宽高为要显示的元素的宽高,将像素转化为英寸//doc.addImage(imgData,'JPEG',0,0,210,297);doc.addImage(imgData,'JPEG',0,0,0,0);doc.save(filename);},background:"#f7f7f7"//设置PDF背景色(默认透明,实际显示为黑色)});}) html代码 <divclass="modalfade"id="Modal5"tabindex="-1"role="dialog"aria-labelledby="myModalLabel"aria-hidden="true"style="z-index:1050;"><divclass="modal-dialogmodal-lg"><divclass="modal-content"style="width:1000px;margin-left:-5%"><divclass="modal-header"style="height:60px"><buttontype="button"class="close"data-dismiss="modal"aria-hidden="true">×</button><h4class="modal-title"id="myModalLabel"style="float:left;">正太分析图</h4><buttontype="button"class="btnbtn-default"style="background-color:#337ab7;color:#fff;margin-top:3px;float:right"id="btn_upload4">打印正太图</button></div><!--startprint--><divclass="modal-body"><divclass="ibox"><divstyle="width:21%;height:40%;float:left;border:1pxsolid;margin-top:30px"><pstyle="text-align:center;">ProcessData</p></br><divclass="col-md-6">LSL:</div><divclass="col-md-6"><spanid="lsl"></span></div><divclass="col-md-6">Target:</div><divclass="col-md-6"><spanid="Target"></span></div><divclass="col-md-6">USL:</div><divclass="col-md-6"><spanid="USL"></span></div><divclass="col-md-6">SampleM:</div><divclass="col-md-6"><spanid="SM"></span></div><divclass="col-md-6">SampleN:</div><divclass="col-md-6"><spanid="SampleN"></span></div><divclass="col-md-6">Within:</div><divclass="col-md-6"><spanid="Within"></span></div><divclass="col-md-6">Overall:</div><divclass="col-md-6"><spanid="Overall"></span></div></div><!--echart图--><divid="main"style="width:500px;height:300px;background-color:#ffffff;margin:0auto"></div><divstyle="width:22%;height:20%;float:right;margin-top:-31%;"><divstyle="border:1pxsolid;width:150px;height:50px"><p>————Within</p><p>————Overall</p></div><divstyle="border:1pxsolid;width:200px;height:150px;margin-top:5px"><pstyle="text-align:center;">Potential(Within)Capabilitys</p><divclass="col-md-6">Cp:</div><divclass="col-md-6"><spanid="Cp"></span></div><divclass="col-md-6">CPL:</div><divclass="col-md-6"><spanid="CPL"></span></div><divclass="col-md-6">CPU:</div><divclass="col-md-6"><spanid="CPU"></span></div><divclass="col-md-6">CPK:</div><divclass="col-md-6"><spanid="CPK"></span></div><divclass="col-md-6">CCPK:</div><divclass="col-md-6"><spanid="CCPK"></span></div></div><divstyle="border:1pxsolid;width:200px;height:150px;"><pstyle="text-align:center;">OverallCapability</p><divclass="col-md-6">Pp:</div><divclass="col-md-6"><spanid="Pp"></span></div><divclass="col-md-6">PPL:</div><divclass="col-md-6"><spanid="PPL"></span></div><divclass="col-md-6">PPU:</div><divclass="col-md-6"><spanid="PPU"></span></div><divclass="col-md-6">PPK:</div><divclass="col-md-6"><spanid="PPK"></span></div><divclass="col-md-6">CPM:</div><divclass="col-md-6"><spanid="CPM"></span></div></div></div><divclass="content"style="width:100%;height:20%;margin-top:8%;"><divid="right"style="border:1pxsolid;width:225px;height:130px;margin-top:5px"><pstyle="text-align:center;">ObservedPerformnance</p><divclass="col-md-6">PPM&ltLSL:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmlsl"></span></div><divclass="col-md-6">PPM&gtUSL:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmtotal"></span></div><divclass="col-md-6">PPMTotal:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmusl"></span></div></div><divid="mid"style="border:1pxsolid;width:225px;height:130px;margin-top:5px;"><pstyle="text-align:center;">Exp.WithinPerformance</p><divclass="col-md-6">PPM&ltLSL:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmlsls"></span></div><divclass="col-md-6">PPM&gtUSL:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmtotals"></span></div><divclass="col-md-6">PPMTotal:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmusls"></span></div></div><divid="left"style="border:1pxsolid;width:225px;height:130px;margin-top:5px"><pstyle="text-align:center;">Exp.OverallPerformance</p><divclass="col-md-6">PPM&ltLSL:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmlsl1"></span></div><divclass="col-md-6">PPM&gtUSL:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmtotal1"></span></div><divclass="col-md-6">PPMTotal:</div><divclass="col-md-6"style="text-align:center"><spanid="ppmusl1"></span></div></div><divid="passTital"style="border:1pxsolid;width:165px;height:130px;margin-left:5px;margin-top:5px;float:left"><pstyle="text-align:center;">PercentOfPass</p><divclass="col-md-6">PASS:</div><divclass="col-md-6"style="text-align:center"><spanid="pass"></span></div></div></div></div></div></div><!--endprint--><divclass="modal-footer"><buttontype="button"class="btnbtn-default"data-dismiss="modal">关闭</button></div></div><!--/.modal-content--></div><!--/.modal--></div> 你把代码贴一下,前端和后台的 你是要把DIV保存为图片对吗? 重新下一份源码,估计是源码有问题 好像如果ie的话jspdf会抛错的 最新的html2canvas已经弃用了onrendered,改成以下代码: html2canvas(document.body,{width:200,height:100}).then(function(canvas){varimgUri=canvas.toDataURL();$("body").append('<adownload="下载的图片">保存图片</a>');});

爱吃鱼的程序员 2020-06-24 13:36:51 0 浏览量 回答数 0

回答

{ box-sizing: border-box; } html,body { width: 100%; height: 100%; margin: 0; }.container { width: 100%; height: 100%; background-color: #3e6690; background-image: -webkit-radial-gradient(#3e6690 0%, #111e34 100%); background-image: -webkit-radial-gradient( #3e6690 0%, #111e34 100%); background-image: radial-gradient( #3e6690 0%, #111e34 100%); }.canvas { position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); }.box { width: 200px; margin: 0 auto; position: relative; }.box .back { width: 160px; height: 160px; }.box .back:before,.box .back:after { content: ""; display: block; float: left; }.box .back:before { width: 80px; height: 110px; background: #4594cf; -webkit-transform: skewY(-25deg); transform: skewY(-25deg); }.box .back:after { width: 80px; height: 110px; background: #50a3e0; -webkit-transform: skewY(25deg); transform: skewY(25deg); }.box .front { width: 160px; height: 110px; position: absolute; top: 38px; left: 0; z-index: 3; }.box .front:before,.box .front:after { content: ""; display: block; float: left; box-shadow: 0 10px 5px -5px rgba(0, 0, 0, 0.5); }.box .front:before { width: 80px; height: 110px; background: #50a3e0; -webkit-transform: skewY(25deg); transform: skewY(25deg); }.box .front:after { width: 80px; height: 110px; background: #4595d0; -webkit-transform: skewY(-25deg); transform: skewY(-25deg); }.box .shines { width: 160px; height: 110px; position: absolute; top: 0; left: 0; z-index: 2; }.box .shines .core { width: 10px; height: 10px; margin: 60px auto 0 auto; background: #fff; border-radius: 100%; box-shadow: 0 0 30px 40px rgba(255, 255, 255, 0.8); }.box .shines .raising { position: absolute; width: 0; height: 600px; bottom: 30px; left: 50%; z-index: 2; box-shadow: 0 0 50px 30px rgba(255, 255, 255, 0.3); }

hiekay 2019-12-02 01:41:58 0 浏览量 回答数 0

回答

varc=document.getElementById("myCanvas");if(c.getContext===undefined){c=window.G_vmlCanvasManager.initElement(c);}varctx=c.getContext("2d"); 可到https://lgtiamo.com/2016/05/29/use-the-html5-canvas-in-ie8/讨论一下。

爱吃鱼的程序员 2020-06-22 13:47:12 0 浏览量 回答数 0

问题

为什么在node的vue中不能使用 import()语法??报错

爱吃鱼的程序员 2020-06-08 10:12:34 0 浏览量 回答数 1

回答

方式一:Coding JavaScript <!--[if lt IE 9]> <script> (function() { if (! /*@cc_on!@*/ 0) return; var e = "abbr, article, aside, audio, canvas, datalist, details, dialog, eventsource, figure, footer, header, hgroup, mark, menu, meter, nav, output, progress, section, time, video".split(', '); var i= e.length; while (i--){ document.createElement(e[i]) } })() </script> <![endif]--> 如果是IE9以下的IE浏览器将创建HTML5标签, 这样非IE浏览器就会忽视这段代码,也就不会有无谓的http请求了。 第二种方法:使用Google的html5shiv包(推荐) <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> 但是不管使用以上哪种方法,都要初始化新标签的CSS.因为HTML5在默认情况下表现为内联元素,对这些元素进行布局我们需要利用CSS手工把它们转为块状元素方便布局 /*html5*/ article,aside,dialog,footer,header,section,footer,nav,figure,menu{display:block} 但是如果ie6/7/8 禁用脚本的用户,那么就变成了无样式的"白板"网页,我们该怎么解决呢? 我们可以参照facebook的做法,即引导用户进入带有noscript标识的 “/?_fb_noscript=1”页面,用 html4 标签替换 html5 标签,这要比为了保持兼容性而写大量 hack 的做法更轻便一些。 <!--[if lte IE 8]> <noscript> <style>.html5-wrappers{display:none!important;}</style> <div class="ie-noscript-warning">您的浏览器禁用了脚本,请<a href="">查看这里</a>来启用脚本!或者<a href="/?noscript=1">继续访问</a>. </div> </noscript> <![endif]--> 这样可以引导用户开启脚本,或者直接跳转到HTML4标签设计的界面。

a123456678 2019-12-02 02:21:18 0 浏览量 回答数 0

问题

一个activiti集成的问题,求助各位大神?报错

爱吃鱼的程序员 2020-06-06 10:55:10 0 浏览量 回答数 1

问题

使用JFinal 读取 MySql BLOB 字段数据时 出现异常:报错

kun坤 2020-06-06 16:15:55 0 浏览量 回答数 1

问题

html2canvas在360浏览器兼容模式下报错问题 ?报错

爱吃鱼的程序员 2020-06-23 14:11:31 0 浏览量 回答数 1

回答

<!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="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Document</title> </head> <body> <video id="video" autoplay=""style='width:640px;height:480px'></video> <button id="picture">photo</button> <canvas id="canvas" width="640" height="480"></canvas> </body> <script type="text/javascript"> var video = document.getElementById("video"); var context = canvas.getContext("2d") var errocb = function () { console.log('sth wrong!'); } if (navigator.getUserMedia) { // 标准的API navigator.getUserMedia({ "video": true }, function (stream) { video.src = stream; video.play(); }, errocb); } else if (navigator.webkitGetUserMedia) { // WebKit 核心的API navigator.webkitGetUserMedia({ "video": true }, function (stream) { video.src = window.webkitURL.createObjectURL(stream); video.play(); }, errocb); } document.getElementById("picture").addEventListener("click", function () { context.drawImage(video, 0, 0, 640, 480); }); </script> </html>

云栖技术 2019-12-02 02:37:08 0 浏览量 回答数 0

问题

activiti 流程设计器传入modelID显示空白,提示namespace找不到?报错

爱吃鱼的程序员 2020-06-06 15:26:54 0 浏览量 回答数 1

问题

从zpl-image包使用ImageToZPL时,未捕获(承诺)TypeError:o(...)不是

几许相思几点泪 2019-12-23 17:53:33 0 浏览量 回答数 0

回答

<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <canvas id="mycanvas" width="400" height="400" style="border: 1px solid #0E2D5F"></canvas> <script> var canvasDom=document.getElementById("mycanvas"); var ctx=canvasDom.getContext("2d"); var rectWidth=100; var rectHeight=100; function drawRect(centerX,centerY,scaleX,scaleY){ ctx.clearRect(0,0,canvasDom.width,canvasDom.height); ctx.save(); ctx.translate(centerX,centerY); ctx.scale(scaleX*2,scaleY*2); ctx.fillStyle="#0E2D5F"; ctx.fillRect(-rectWidth/2,-rectWidth/2,rectWidth,rectHeight); ctx.restore(); ctx.save(); ctx.translate(centerX,centerY); ctx.scale(scaleX,scaleY); ctx.fillStyle="#ffffff"; ctx.fillRect(-rectWidth/2,-rectWidth/2,rectWidth,rectHeight); ctx.restore(); } drawRect(canvasDom.width/2,canvasDom.height/2,1,1); </script> </body> </html>

杨冬芳 2019-12-02 02:44:32 0 浏览量 回答数 0

问题

canvas中的clearRect函数在ie下不能正常使用 400 请求报错 

kun坤 2020-05-28 19:46:57 10 浏览量 回答数 1

问题

使用Yeoman和Polymer创建Web应用:报错

kun坤 2020-06-08 11:03:09 3 浏览量 回答数 1

回答

从效果图上我们还看到有几点重要信息: 点赞动画图片大小不一,运动轨迹也是随机的点赞动画图片都是先放大再匀速运动。快到顶部的时候,是渐渐消失。收到大量的点赞请求的时候,点赞动画不扎堆,井然有序持续出现。 那么如何实现这些要求呢?下面介绍两种实现方式来实现(底部附完整 demo): CSS3 实现 用 CSS3 实现动画,显然,我们想到的是用 animation 。 首先看下 animation 合并写法,具体含义就不解释了,如果需要可以自行了解。 animation: name duration timing-function delay iteration-count direction fill-mode play-state; 我们开始来一步一步实现。 Step 1: 固定区域,设置基本样式 首先,我们先准备 1 张点赞动画图片: 看一下 HTML 结构。外层一个结构固定整个显示动画区域的位置。这里在一个宽 100px ,高 200px 的 div 区域。 Step 5: 设置偏移 我们先定义帧动画:bubble_1 来执行偏移。图片开始放大阶段,这里没有设置偏移,保持中间原点不变。 在运行到 25% * 4 = 1s,即 1s之后,是向左偏移 -8px, 2s 的时候,向右偏移 8px,3s 的时候,向做偏移 15px ,最终向右偏移 15px。 大家可以想到了,这是定义的一个经典的左右摆动轨迹,“向左向右向左向右” 曲线摆动效果。 @keyframes bubble_1 { 0% { } 25% { margin-left:-8px; } 50% { margin-left:8px } 75% { margin-left:-15px } 100% { margin-left:15px } } 效果如下: Step 6: 补齐动画样式 这里预设了一种运行曲线轨迹,左右摆动的样式,我们在再预设更多种曲线,达到随机轨迹的目的。 比如 bubble_1 的左右偏移动画轨迹,我们可以修改偏移值,来达到不同的曲线轨迹。 Step 7: JS 操作随机增加节点样式 提供增加点赞的方法,随机将点赞的样式组合,然后渲染到节点上。 let praiseBubble = document.getElementById("praise_bubble"); let last = 0; function addPraise() { const b =Math.floor(Math.random() * 6) + 1; const bl =Math.floor(Math.random() * 11) + 1; // bl1~bl11 let d = document.createElement("div"); d.className = bubble b${b} bl${bl}; d.dataset.t = String(Date.now()); praiseBubble.appendChild(d); } setInterval(() => { addPraise(); },300) 在使用 CSS 来实现点赞的时候,通常还需要注意设置 bubble 的随机延时,比如: .bl2{ animation:bubble_2 $bubble_time linear .4s 1 forwards,bubble_big_2 $bubble_scale linear .4s 1 forwards,bubble_y $bubble_time linear .4s 1 forwards; } 这里如果是随机到 bl2,那么延时 0.4s 再运行,bl3 延时 0.6s …… 如果是批量更新到节点上,不设置延时的话,那就会扎堆出现。随机“ bl ”样式,就随机了延时,然后批量出现,都会自动错峰显示。当然,我们还需要增加当前用户手动点赞的动画,这个不需要延时。 另外,有可能同时别人下发了点赞 40 个,业务需求通常是希望这 40 个点赞气泡都能依次出现,制造持续的点赞氛围,否则下发量大又会扎堆显示了。 那么我们还需要分批打散点赞数量,比如一次点赞的时间($bubble_time)是 4s, 那么 4s 内,希望同时出现多少个点赞呢?比如是 10个,那么 40 个点赞,需要分批 4 次渲染。 window.requestAnimationFrame(() => { // 继续循环处理批次 render(); }); 另外还需要手动清除节点。以防节点过多带来的性能问题。如下是完整的效果图。 class ThumbsUpAni{ constructor(){ const canvas = document.getElementById('thumsCanvas'); this.context = canvas.getContext('2d')!; this.width = canvas.width; this.height = canvas.height; } } Step 2:创建渲染对象 实时渲染图片,使其变成一个连贯的动画,很重要的是:生成曲线轨迹。这个曲线轨迹需要是平滑的均匀曲线。 假如生成的曲线轨迹不平滑的话,那看到的效果就会太突兀,比如上一个是 10 px,下一个就是 -10px,那显然,动画就是忽左忽右左右闪烁了。 理想的轨迹是上一个位置是 10px,接下来是 9px,然后一直平滑到 -10px,这样的坐标点就是连贯的,看起来动画就是平滑运行。 随机平滑 X 轴偏移 如果要做到平滑曲线,其实可以使用我们再熟悉不过的正弦( Math.sin )函数来实现均匀曲线。 看下图的正弦曲线: 这是 Math.sin(0) 到 Math.sin(9) 的曲线图走势图,它是一个平滑的从正数到负数,然后再从负数到正数的曲线图,完全符合我们的需求,于是我们再需要生成一个随机比率值,让摆动幅度随机起来。 const angle = getRandom(2, 10); let ratio = getRandom(10,30)*((getRandom(0, 1) ? 1 : -1)); const getTranslateX = (diffTime) => { if (diffTime < this.scaleTime) {// 放大期间,不进行摇摆偏移 return basicX; } else { return basicX + ratio*Math.sin(angle*(diffTime - this.scaleTime)); } }; 复制代码scaleTime 是从开始放大到最终大小,用多长时间,这里我们设置 0.1,即总共运行时间前面的 10% 的时间,点赞图片逐步放大。 diffTime,是只从开始动画运行到当前时间过了多长时间了,为百分比。实际值是从 0 --》 1 逐步增大。 diffTime - scaleTime = 0 ~ 0.9, diffTime 为 0.4 的时候,说明是已经运行了 40% 的时间。 因为 Math.sin(0) 到 Math.sin(0.9) 曲线几乎是一个直线,所以不太符合摆动效果,从 Math.sin(0) 到 Math.sin(1.8) 开始有细微的变化,所以我们这里设置的 angle 最小值为 2。 这里设置角度系数 angle 最大为 10 ,从底部到顶部运行两个波峰。 当然如果运行距离再长一些,我们可以增大 angle 值,比如变成 3 个波峰(如果时间短,出现三个波峰,就会运行过快,有闪烁现象)。如下图: Y 轴偏移 这个容易理解,开始 diffTime 为 0 ,所以运行偏移从 this.height --> image.height / 2。即从最底部,运行到顶部留下,实际上我们在顶部会淡化隐藏。 const getTranslateY = (diffTime) => { return image.height / 2 + (this.height - image.height / 2) * (1-diffTime); }; 复制代码放大缩小 当运行时间 diffTime 小于设置的 scaleTime 的时候,按比例随着时间增大,scale 变大。超过设置的时间阈值,则返回最终大小。 const basicScale = [0.6, 0.9, 1.2][getRandom(0, 2)]; const getScale = (diffTime) => { if (diffTime < this.scaleTime) { return +((diffTime/ this.scaleTime).toFixed(2)) * basicScale; } else { return basicScale; } }; 复制代码淡出 同放大逻辑一致,只不过淡出是在运行快到最后的位置开始生效。 **const fadeOutStage = getRandom(14, 18) / 100; const getAlpha = (diffTime) => { let left = 1 - +diffTime; if (left > fadeOutStage) { return 1; } else { return 1 - +((fadeOutStage - left) / fadeOutStage).toFixed(2); } }; ** 实时绘制 创建完绘制对象之后,就可以实时绘制了,根据上述获取到的“偏移值”,“放大”和“淡出”值,然后实时绘制点赞图片的位置即可。 每个执行周期,都需要重新绘制 canvas 上的所有的动画图片位置,最终形成所有的点赞图片都在运动的效果。 createRender(){ return (diffTime) => { // 差值满了,即结束了 0 ---》 1 if(diffTime>=1) return true; context.save(); const scale = getScale(diffTime); const translateX = getTranslateX(diffTime); const translateY = getTranslateY(diffTime); context.translate(translateX, translateY); context.scale(scale, scale); context.globalAlpha = getAlpha(diffTime); // const rotate = getRotate(); // context.rotate(rotate * Math.PI / 180); context.drawImage( image, -image.width / 2, -image.height / 2, image.width, image.height ); context.restore(); }; } 这里绘制的图片是原图的 width 和 height。前面我们设置了 basiceScale,如果图片更大,我们可以把 scale 再变小即可。 const basicScale = [0.6, 0.9, 1.2][getRandom(0, 2)]; 实时绘制扫描器 开启实时绘制扫描器,将创建的渲染对象放入 renderList 数组,数组不为空,说明 canvas 上还有动画,就需要不停的去执行 scan,直到 canvas 上没有动画结束为止。 scan() { this.context.clearRect(0, 0, this.width, this.height); this.context.fillStyle = "#f4f4f4"; this.context.fillRect(0,0,200,400); let index = 0; let length = this.renderList.length; if (length > 0) { requestAnimationFrame(this.scan.bind(this)); } while (index < length) { const render = this.renderList[index]; if (!render || !render.render || render.render.call(null, (Date.now() - render.timestamp) / render.duration)) { // 结束了,删除该动画 this.renderList.splice(index, 1); length--; } else { // 当前动画未执行完成,continue index++; } } } 这里就是根据执行的时间来对比,判断动画执行到的位置了: diffTime = (Date.now() - render.timestamp) / render.duration 复制代码如果开始的时间戳是 10000,当前是100100,则说明已经运行了 100 毫秒了,如果动画本来需要执行 1000 毫秒,那么 diffTime = 0.1,代表动画已经运行了 10%。 增加动画 每点赞一次或者每接收到别人点赞一次,则调用一次 start 方法来生成渲染实例,放进渲染实例数组。如果当前扫描器未开启,则需要启动扫描器,这里使用了 scanning 变量,防止开启多个扫描器。 start() { const render = this.createRender(); const duration = getRandom(1500, 3000); this.renderList.push({ render, duration, timestamp: Date.now(), }); if (!this.scanning) { this.scanning = true; requestFrame(this.scan.bind(this)); } return this; } 这里开启定时器,记录定时器里面处理的 thumbsStart 的值,如果有新增点赞,且定时器还在运行,直接更新最后的 praiseLast 值,定时器会依次将点赞请求全部处理完。 定时器的延时时间 time 根据开启定时器的时候,需要渲染多少点赞动画来决定的,比如需要渲染 100 个点赞动画,我们将 100 个点赞动画分布在 5s 内渲染完。 对于热门直播,会同时渲染的动画很多,不会扎堆显示,且动画完全能衔接上,不停的冒泡点赞动画。对于冷门直播,有多余一个的点赞请求,我们能打散到 5s 内显示,也不会扎堆显示。 End 两种方式渲染点赞动画都已经完成,完整源码,源码戳这里 。 源码运行效果图: 再比较 这两种实现方式,都可以满足要求,那么到底哪种更优呢? 我们来看下两者的数据对比。以下为未开启硬件加速的对比,采用不间断疯狂渲染点赞动画的数据对比: 整体来说,差异如下: CSS3 实现简单Canvas 更灵活,操作更细腻CSS3 内存消耗比 Canvas 大,如果开启硬件加速,内存消耗更大一些。

剑曼红尘 2020-04-15 19:17:18 0 浏览量 回答数 0

回答

《Html5+javascript动画基础》《HTML5 Canvas》这两本书 推荐基础的网址:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial再推荐一个Github:https://github.com/hongru

杨冬芳 2019-12-02 02:56:42 0 浏览量 回答数 0

回答

canvas 可以根据图片路径来进行操作。 这里我简单列举两种方法,还有其他方法,大致思路就是图片路径转成base64 或blob, 加载到canvas对象中去操作,裁剪压缩都可以。 当然也可以用牛人封装好的第三方类库去操作。 方法1:直接加载图片路径可以参考使用这个第三方工具 javascript-load-image实际使用过,还是比较好用 //图片压缩并且展示 function imageresizeAndPreview(path, orientation) { loadImage( path, function(img) { //img为得到的html Image对象 if (img.type === "error") { console.log("Error loading image " + imageUrl); } else { //对img进行一些操作 var li = document.createElement("li"); li.appendChild(img); } }, { maxWidth: 60, maxHeight: 60, crop: true, orientation: orientation } ); } 方法2把图片转成base64再加载,然后再进行操作 var canvas = document.getElementById("c"); var ctx = canvas.getContext("2d"); var image = new Image(); image.onload = function() { ctx.drawImage(image, 0, 0); }; image.src = "data:image/ png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC";

小旋风柴进 2019-12-02 02:26:53 0 浏览量 回答数 0

问题

html <canvas>标签的使用

小旋风柴进 2019-12-01 20:20:12 841 浏览量 回答数 1

问题

将canvas的画append给body充当背景图,但出现奇怪效果

小旋风柴进 2019-12-01 19:37:31 1127 浏览量 回答数 2

回答

svn checkout  http://explorercanvas.googlecode.com/svn/trunk/ explorercanvas-read-only  先尝试更新下你的 excanvas版本。 然后看源码,看clearRect是否实现完全。利用firebug等调试工具在里面打断点调试。######我看了下方法里面是这么写的: contextPrototype.clearRect = function() {     this.element_.innerHTML = "";     this.currentPath_ = [];   }; 这个是不是不是最新的啊?如果是这个问题哪里有新的版本的下载呢?######canvas不是html5的东西么,IE8支持?

kun坤 2020-05-29 11:07:43 0 浏览量 回答数 0

回答

在2.0版本更新的时候,echarts的各种图表操作方法,都依赖于option的设置,没有setOption,clear或者resize等方法都会报错直接导致异常, 2.0.1已经修复了。至于数据更新的问题,没必要使用clear的,我之前也是这么做,跟林峰沟通后,他提示我看了setOption方法的第二个参数设置为true,就可以了。回复 @fengzhiguan:我遇到跟您一样的问题,需要缩放才行,不知道您解决么?回复 @democracy:为什么我在setOption后面加了true还是不行。。。IE8上面回复 @fengzhiguan:我饼图在IE8缩小了,在火狐正常,你的解决了吗?我现在用的就是2.01,你的意思是不用2.01版本么?回复 @黄小明186211:没有解决,没有更新2.0.1,只采用了2.0版本说了老半天。。。还是没解决IE8兼容问题啊,我看2.0.1版本上面针对IE8也是有问题的(具体问题为:显示空白,但是IE8浏览器用放大缩小功能后能正常显示)解决了么这个问题,请教一下,我也遇到你的这个情况,不知道怎么解决您解决了么这个问题?我相信大多数人都发现2.0.1对IE8不兼容,这里我推荐大家使用echarts1.4.1可以完美兼容,而且功能都很齐全,操作也一样 setOption方法的第二个参数设置为true 怎么弄??????? @NeoCD你那边的IE8兼容问题,解决了吗?我测试了一下,官网的demo在IE8下都出不来,如果用IE8以上的浏览器,使用兼容模式,只要文档模式不是IE9,同样也出不来,将setOption的第二个参数设置为true,还是如此。mychart.setoption(option,true) 通过把 animation设置为false和把 setOption方法的第二个参数设置为true还不能解决此问题的,可以通过ajax去请求url,然后通过 setTimeout来处理,具体可以参考下这个例子 http://www.daimahome.com/echarts-zai-ie8-xia-bu-xian-shi-tu-biao.html 博主,这个图在ie8显示不了 这个应该是用了Canvas了吧。基本上canvas是不对IE8及以下兼容了的。回复 @梦幻女侠:没有,不知道这种动态地图是不是不兼容ie8,一般的地图能在ie8显示(交个朋友么QQ:844146928)您好,我也遇到这样的问题,您解决了么问题解决了么?我也遇到这个问题了我是动态获取数据会出现在IE8界面空白,界面缩放之后显示,后来尝试静态数据可以,于是去掉数据获得的时候同步,IE8出现效果了,可能是数据同步或者异步的问题,不清楚这对你有没帮助。蛮试试。我也在学。 IE毒瘤   setTimeout(function( xxxxxxxxxxxxxxxxx ),100) 这样可以解决 IE8就不要调试le,IE8真的的是各种坑,现在你看IE8调试完,IE9,IE10,IE11都不一样可以用

爱吃鱼的程序员 2020-06-15 19:42:46 0 浏览量 回答数 0

问题

【小更新】可以比较方便的可视化数据的网页版小工具

thatbean 2019-12-01 21:45:47 8288 浏览量 回答数 4

问题

html2canvas截图如何解决跨域的问题??报错

爱吃鱼的程序员 2020-06-10 10:59:38 1 浏览量 回答数 1

问题

JS中如何让循环当中的一次完全执行之后再执行下一个?

小旋风柴进 2019-12-01 19:29:22 1764 浏览量 回答数 1

回答

"这个只能通过最新的HTML5的标准还有各浏览器的支持情况 网上有一个HTML5标准是否支持某一个元素或功能的网站 找找 我之前看过###### 用Javascript可以检测,思路是这样的: 在页面创建某个标记(语法正确时总能创建,即使不能被解释),然后检测这个标记的HTML5特有属性特征(不能与HTML4重叠的,否则无法判断了),如果检测到就算有。 比如说创建一个canvas,再检测这个canvas标签是否具有getContext()方法(或属性),因为这个方法不是你手动添加的,而是当浏览器核心具有这种解释能力的时候内部执行构造函数时就具有的,所以就能检测到了。 这里只是一个思路,掌握越多的特征,做的越细致越能检测精确。   当然,还有一个更简单的方法,直接检测浏览器的userAgent,针对已知的浏览器解释能力列表也可以快速检测……人品爆发的时候,比如说遇到IE6了,基本就不用检测了   这里附上一段 http://www.one-lab.net/index.htm的检测canvas的示范代码 function try_canvas() { var canvas = document.createElement("canvas"); var div = document.getElementById("canvas_div"); if (canvas) { if (canvas.getContext) { var context = canvas.getContext("2d"); if (context) { context.globalCompositeOperation = "copy"; canvas.setAttribute("title", "ONE Browser Demo UI"); canvas.setAttribute("id", "canvas_body"); canvas.setAttribute("width", 700); canvas.setAttribute("height", 500); canvas.oncontextmenu = new Function("event.returnValue = false;"); div.appendChild(canvas); setInterval("canvas_animate()", imgAnimationDelay); document.getElementById("canvas_div_inner").style.display = "none"; } } else { document.getElementById("canvas_div_inner").style.display = "block"; } } } ######参考这里吧: http://www.w3cschool.cn/html5_reference.html

kun坤 2020-05-26 11:12:23 0 浏览量 回答数 0

问题

有什么办法能用自执行里的变量

a123456678 2019-12-01 20:16:31 781 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 SQL审核 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 人工智能 阿里云云栖号 云栖号案例 云栖号直播