Html 图像大小调整导致滚动缓慢
我正在加载大图像并让浏览器调整它们的大小。我正在明确设置大小Html 图像大小调整导致滚动缓慢,html,css,Html,Css,我正在加载大图像并让浏览器调整它们的大小。我正在明确设置大小 <img src="http://example.com/image1.jpg" width="240" height="360"/> 等等 我不知道为什么一些绘制事件包括图像解码,而其他不包括,也不知道为什么有时缓存了大小调整,有时不缓存。我想这一定是因为新的图像进入了查看端口 我能做些什么来确保在加载页面时,我只需为每张图像支付一次图像调整成本,并避免在滚动期间调整图像大小? (当然,我知道最好的解决方案是通过加载已
<img src="http://example.com/image1.jpg" width="240" height="360"/>
等等
我不知道为什么一些绘制事件包括图像解码,而其他不包括,也不知道为什么有时缓存了大小调整,有时不缓存。我想这一定是因为新的图像进入了查看端口
我能做些什么来确保在加载页面时,我只需为每张图像支付一次图像调整成本,并避免在滚动期间调整图像大小?
(当然,我知道最好的解决方案是通过加载已经具有适当大小的图像来避免浏览器的大小调整。在这种情况下,这是不实际的。)CSS在这里会有所帮助。这将作为默认值,可能会减慢单个加载时间。要实现这一点,只需对图像执行基本的css。参考资料如下:
<img src="....." />
然后,您可以添加额外的代码,使其具有圆角、边框或任何您想要的效果
为了避免所有的大小调整,这当然会有帮助的是在Photoshop中调整图像的大小。然后,它将只显示图像,而不会在显示页面的不同部分时渲染每个图像 大型图像加载到内存(RAM)需要更多的时间,即使图像已经在内存(RAM)上,如果内存消耗巨大(太多大型图像或有一个应用程序在后台占用了大量内存),不可见(可见区域外)图像会推送到分页/交换文件(硬盘驱动器上),因此,当图像到达可见区域时,浏览器将以硬盘驱动器速度(慢速)从分页/交换加载图像 在这种情况下,如果一个页面上有许多大图像,则不能依赖客户端的大小调整,因为这会使客户端浏览体验变差
你应该考虑在服务器端调整你的图像大小,或者按需调整大小,或者预先调整大小(缩略图)。< /P> 在按需方法的情况下,您可以使用Apache的mod_rewrite将图像指向脚本以调整其大小,并将客户端浏览器请求的图像指向脚本
看看流行的图片共享/托管站点,查看一个随机图片并复制其URL,将其粘贴到另一个选项卡,然后通过更改/删除URL的某些部分来使用URL。 您可以看到,它们在服务器端动态调整图像大小 TLDR:如果你坚持不使用缩略图,你就无法在页面上平滑滚动许多大图像,或者使用缩略图,或者获得起伏的滚动哦,还有一件事要考虑,那就是增加你和你的客户机RAM来处理这样的内存需求
< p>这个函数将允许你只调整一次图像大小,将它替换成一个新的图像,按期望的比例调整大小:function resizeImage(image, maxWidth, maxHeight) {
// Output scale is the minimum of the two possible scales
var scale = Math.min((maxWidth / image.width), (maxHeight / image.height))
// Output canvas
var outputCanvas = document.createElement('canvas')
outputCanvas.width = image.width * scale
outputCanvas.height = image.height * scale
// Draw image content in output canvas
var outputContext = outputCanvas.getContext('2d')
outputContext.drawImage(image, 0, 0, parseInt(image.width * scale), parseInt(image.height * scale))
// Replace image source
image.src = outputCanvas.toDataURL()
}
它将您传递的图像作为image
参数,并创建一个画布,在其中调整image
,然后使用toDataURL()
将image.src
属性设置为输出画布的内容
您调整大小的图像必须位于相对路径中(是的,这并不酷),否则,如果未满足要求,您将由于CORS而出现安全错误
但是您可以将base64数据作为
src
属性传递,使用AJAX很容易做到这一点。您的问题是,您同时下载了大量图像,大量大型图像。如果有大量的大图像,并且用户个人的ram和处理器限制,则将它们渲染为原始图像以外的不同大小也会很慢
无论您告诉浏览器渲染图像的大小如何,浏览器都会加载原始图像大小,然后动态调整。大图像必须通过用户的internet连接从服务器传输到浏览器。通过使用html属性,您真正要做的就是在下载图像后使用CSS更改图像大小
在mho中,最好的选择是在服务器端创建多个图像大小,最好是在创建资产时创建,而不是在运行中创建,并调用最接近您需要的图像大小。如果您使用脚本等动态创建图像,请将它们保留在服务器上,以便以后再次使用,并减少加载时间和服务器资源
最后一个技巧是确保您正在缓存。更多信息请参见此处如果您可以依赖画布,而不仅仅是缩放画布。您找到解决方法了吗?我看到了同样的问题,不知道如何解决它。这是这里唯一真正理解问题并给出有效答案的答案+难道没有更好的事可做吗?我正在开发一款带有Phonegap的移动应用程序,这真的很痛苦
img {
height: 360;
width: 240;
}
function resizeImage(image, maxWidth, maxHeight) {
// Output scale is the minimum of the two possible scales
var scale = Math.min((maxWidth / image.width), (maxHeight / image.height))
// Output canvas
var outputCanvas = document.createElement('canvas')
outputCanvas.width = image.width * scale
outputCanvas.height = image.height * scale
// Draw image content in output canvas
var outputContext = outputCanvas.getContext('2d')
outputContext.drawImage(image, 0, 0, parseInt(image.width * scale), parseInt(image.height * scale))
// Replace image source
image.src = outputCanvas.toDataURL()
}