html中margin的用法
最近,我发现了名为“亿图网”的网站,它的目标是在2025年记录互联网的独特印记。用户们可以上传一张64x64像素的小图片,这些图片会形成一个庞大的互联网影像。
正如其名所示,这个页面计划承载高达千万张小图片。在开始思考如何高效地展示这些图片时,我曾对各种实现方案进行尝试,并最终找到了一个高效的解决方案。
在你继续阅读之前,不妨先访问一下“亿图网”,看看你是否能猜到我是如何实现的。如果你已经打开了网站,也可以尝试上传一张图片,为自己的“位置”做出贡献!
最初的选择难题是:是用传统的HTML元素来展示图片,还是使用Canvas来进行绘制。
我最初使用标签来分别加载图片。为此,我编写了一个脚本,生成了一个32x32的图片网格(共1024张图片),并使用Laravel Blade模板进行渲染。
虽然这种方式看起来还不错,但它隐藏了几个严重的问题:
1. 浏览器滚动性能差。
2. DOM节点数量巨大,导致性能开销大。
3. 同时加载大量图片会导致网络请求数激增。
4. 实现平滑滚动或高级动画效果变得困难。
于是,我尝试了Canvas方式。我通过绘制一个棋盘格图案来测试Canvas的渲染效率。
Canvas方式的优点显著:
1. 它具有灵活的滚动和缩放功能。
2. 可以极大减少DOM节点数量。
3. 性能出色,支持高级动画和交互效果。
经过对比,我最终选择了Canvas方式,它为我提供了更大的灵活性和更好的渲染效率。
即使Canvas性能出色,但加载数百万张小图片仍然是一个巨大的挑战。以一个标准的1080p屏幕为例,我们需要考虑如何高效地预加载周围的图片以实现流畅滚动。如果将屏幕外8个方向的图片也加载进来,那么一次滚动就需要加载大量的图片,这显然是一个难以瞬间完成的任务。
我的解决方案是将小图片合并成大图块。为此,我设计了一个后端PHP控制器,将16x16(共256张)的小图片合并成一个1024x1024像素的大图块。
当用户访问页面时,浏览器只需要加载少量的大图块,而不是大量的单独图片。这极大地减少了网络请求次数,提高了加载速度。例如,在上面的例子中,现在只需要加载24个大图块,而不是4080张单独的图片。
对于那些尚未上传图片的位置,我们用“❓”号进行标记,这样能够清晰地表示这些位置还未被填充。
为了更好地隐藏大图块的加载细节并提升用户体验,我采用了一些小技巧:
1. 始终显示64x64的小块加载动画,使用户感知不到是加载了更大的图片块。
2. 网格总是以方形的方式进行加载,以避免出现边界空白的视觉问题。
回顾整个过程,从最初的逐个加载小图片,到探索Canvas的使用,再到通过图片块合并优化加载效率,每一步都是为了在用户体验与性能之间找到更好的平衡。