如何在不看到“闪烁”的情况下更新 SVG 图像
How to update a SVG-Image without seeing a "blinking"
我有一个SVG图像,现在,当有更新时,服务器会向我发送更新图像,我想在浏览器中重新加载图像而不会看到闪烁(空白而不是图像,例如100毫秒(。
我的第一个方法:
$("#svg").html(newSVG); // With blinking
我的第二种方法:
将更新的 SVG 加载到 Frame2 中,然后将其放入 Frame1 中。还是眨眼。
// Load SVG in frame2
$("#svg .frame2").hide().html(content).delay(500).show();
// Overwrite frame1 content with frame2 content
$("#svg .frame1").delay(500).hide().html(content).delay(500).show();
// Remove frame2 content
$("#svg .frame2").hide().html("").show();
有没有办法以干净的方式进入,以便用户在短时间内看不到白色的空白图像?我可以使用 jQuery 和 AngularJS。
谢谢!
在图形编程的最低级别,他们使用一种称为双缓冲的技巧来更新图像而不会闪烁。这个想法是你在某处有一个显示驱动程序,你可以告诉它绘制存储在内存某个区域的图像。
在这种情况下,处理图形的直观方法是简单地将所有绘图都绘制到该区域中。但是,使用双缓冲时,您可以使用两个区域:一个区域保存您完成的最后一帧,另一个区域用于绘制您正在处理的帧。完成绘制后,将显示驱动程序指向该区域,然后在另一个区域中绘制下一帧。由于来回切换仅涉及更改一个变量(告诉显示驱动程序要绘制哪个区域的变量(,因此转换速度非常快。而且由于显示驱动程序只能看到完成的图像,因此不会闪烁。
我们无法在浏览器中访问此类低级技术,但我们可以调整其背后的基本思想。为此,您可以将图像加载到用户看不到它的地方。完成后,将旧映像换成新映像。一种可能性可能如下:
// Assume that the new SVG has been loaded into newSVG, like your first example.
var oldSVG = document.getElementById("svg");
oldSVG.parentNode.replaceChild(newSVG, oldSVG);
魔术发生在对replaceChild
的召唤中。它在一个步骤中将旧图像换成新图像,因此浏览器无法显示任何中间步骤。这可以防止闪烁,并可能节省性能,因为浏览器只需要重排一次(因为元素更改(而不是两次(因为元素被删除,然后因为添加了元素(。
从技术上讲,对 replaceChild
的调用返回被换出的节点,因此如果您愿意为同一元素调用 document.getElementById
两次,则可以将其作为单行代码执行此操作。但这是浪费,特别是如果你要经常这样做,所以我们使用变量来避免不得不更频繁地调用document.getElementById
。
将新帧放在旧帧下(绝对定位和 z 索引将在这里为您提供帮助(,将新图像数据加载到新帧中,在新图像的 onload 事件中将其 z 索引移动到旧帧上方。
或者,您可以在加载新图像时将旧图像的不透明度转换为0,将新图像的不透明度转换为 1。
- 如何在不刷新页面的情况下更新显示框
- 获取 HTML 5 音频控制文件位置并在不使用 id 选择器的情况下更新 src
- 在不重定向页面的情况下更新表
- Angular/UI路由器-如何在不刷新所有内容的情况下更新URL
- 如何在不按ctrl+F5的情况下更新我的Web应用程序(chrome、mozilla、IE8+)更改
- 可以在不重新加载页面的情况下更新javascript中的cookie
- 在不重新加载控制器的情况下更新路由
- 在不重新加载页面的情况下更新 URL 哈希
- 在不重新加载页面的情况下更新块中的内容
- 需要 Ajax 函数 - 在不刷新页面的情况下更新数据库
- 在不加载页面的情况下更新谷歌地图上的标记位置
- 在不刷新的情况下更新标签内的变量
- 在不超出页面的情况下更新数据库
- 如何在不使用映射的情况下更新视图模型
- 在不刷新页面的情况下更新 SQL 数据
- 如何在代码点火器中使用 websocket 在不刷新页面的情况下更新内容
- 如何在不刷新浏览器的情况下更新倒计时达到 0 时的日期
- 在不触发状态更改的情况下更新 URL
- 在不重新加载整个页面的情况下更新网页的特定区域
- GULP:如何在不刷新的情况下更新浏览器(仅适用于 CSS 更改)