首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何正确堆叠砖石布局和惰性加载图像?

堆叠砖石布局(Masonry Layout)是一种常用的网页布局方式,它可以实现不规则的瀑布流效果,使网页内容更加美观和吸引人。在前端开发中,可以使用CSS和JavaScript来实现堆叠砖石布局。

实现堆叠砖石布局的关键是计算每个砖石(元素)的位置和大小。一种常见的做法是使用CSS的flexbox布局或grid布局来创建一个容器,并设置每个砖石元素的宽度和高度。然后,通过JavaScript计算每个砖石元素的位置,以实现瀑布流效果。

以下是一个简单的堆叠砖石布局的示例代码:

HTML:

代码语言:html
复制
<div class="masonry-container">
  <div class="brick"></div>
  <div class="brick"></div>
  <div class="brick"></div>
  ...
</div>

CSS:

代码语言:css
复制
.masonry-container {
  display: flex;
  flex-wrap: wrap;
}

.brick {
  width: 200px;
  height: auto;
  margin-bottom: 10px;
}

JavaScript:

代码语言:javascript
复制
window.addEventListener('load', function() {
  var container = document.querySelector('.masonry-container');
  var bricks = container.querySelectorAll('.brick');
  
  // 计算每个砖石元素的位置
  function layout() {
    var containerWidth = container.offsetWidth;
    var brickWidth = bricks[0].offsetWidth;
    var numColumns = Math.floor(containerWidth / brickWidth);
    var columnHeights = new Array(numColumns).fill(0);
    
    for (var i = 0; i < bricks.length; i++) {
      var brick = bricks[i];
      var columnIndex = i % numColumns;
      var columnHeight = columnHeights[columnIndex];
      
      brick.style.position = 'absolute';
      brick.style.left = columnIndex * brickWidth + 'px';
      brick.style.top = columnHeight + 'px';
      
      columnHeights[columnIndex] += brick.offsetHeight + 10; // 10px为砖石之间的间距
    }
    
    var containerHeight = Math.max.apply(null, columnHeights);
    container.style.height = containerHeight + 'px';
  }
  
  layout(); // 初始化布局
  
  // 当窗口大小改变时重新布局
  window.addEventListener('resize', layout);
});

以上代码中,通过CSS的flexbox布局将砖石元素进行水平排列,并通过JavaScript计算每个砖石元素的位置。在计算位置时,首先获取容器的宽度和每个砖石元素的宽度,然后根据容器宽度和砖石元素宽度计算出一行可以容纳的砖石数量。接着,使用一个数组来保存每一列的高度,然后遍历每个砖石元素,根据当前列的高度设置砖石元素的位置,并更新列的高度。最后,根据列的高度确定容器的高度,以适应内容。

惰性加载图像(Lazy Loading Images)是一种优化网页加载速度的技术,它可以延迟加载页面中的图像,只有当图像进入可视区域时才进行加载,从而减少页面的初始加载时间和带宽消耗。

在前端开发中,可以使用JavaScript来实现惰性加载图像。以下是一个简单的惰性加载图像的示例代码:

HTML:

代码语言:html
复制
<img class="lazy" data-src="image.jpg" alt="Image">

CSS:

代码语言:css
复制
.lazy {
  opacity: 0;
  transition: opacity 0.3s;
}

.lazy.loaded {
  opacity: 1;
}

JavaScript:

代码语言:javascript
复制
window.addEventListener('load', function() {
  var lazyImages = document.querySelectorAll('.lazy');
  
  function lazyLoad() {
    for (var i = 0; i < lazyImages.length; i++) {
      var lazyImage = lazyImages[i];
      
      if (isInViewport(lazyImage)) {
        lazyImage.src = lazyImage.dataset.src;
        lazyImage.classList.add('loaded');
        lazyImages.splice(i, 1); // 加载后从数组中移除
        i--;
      }
    }
  }
  
  function isInViewport(element) {
    var rect = element.getBoundingClientRect();
    return rect.top >= 0 && rect.left >= 0 && rect.bottom <= window.innerHeight && rect.right <= window.innerWidth;
  }
  
  lazyLoad(); // 初始化加载
  
  // 监听滚动事件,实现惰性加载
  window.addEventListener('scroll', lazyLoad);
});

以上代码中,通过给图像元素添加一个lazy类,并将图像的真实地址保存在data-src属性中。初始状态下,图像元素的透明度为0,通过CSS的过渡效果实现渐变显示。在JavaScript中,通过isInViewport函数判断图像是否进入可视区域,如果是,则将data-src属性的值赋给src属性,同时添加loaded类,使图像显示出来。然后,通过监听滚动事件,实现惰性加载的效果。

堆叠砖石布局和惰性加载图像在实际开发中都有广泛的应用场景。堆叠砖石布局可以用于展示图片墙、商品列表等不规则排列的内容,提升用户体验。惰性加载图像可以用于优化页面加载速度,特别是对于包含大量图像的页面,可以减少初始加载时间,提高页面性能。

腾讯云提供了一系列与前端开发、云计算相关的产品和服务,例如云服务器、云存储、云函数等,可以满足开发者在云计算领域的需求。具体的产品介绍和相关链接可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

shopify主题Grid模板修改

Shopify Grid主题是一个砖石风格的主题,非常适合有故事可讲的当代品牌,灵活明亮,具有现代的气息,兼容OS 2.0,独特的布局强大的导航更方便打造您的品牌。...独特的圬工网格 Grid独特的砖石风格布局,让您优雅地展示产品,视频,更多。 多列菜单 在一个大的、多列的下拉菜单中展示产品图像。...砌体标准布局砖石标准布局中有多个产品、职位或促销。 多种产品页面布局 从多个产品页面布局选择,为您的客户创造最佳的购物体验。...现代砌体布局 用这个诱人的主题吸引您的客户,它具有一个独特的砌体网格设计,用于展示产品、视频更多。...我喜欢大图像,因为我的行业是非常注重图像的。有时我也会考虑其他主题,但都没有选择。 我真的很喜欢Grid主题来搭建我的网上珠宝店。

1.4K30

Texture

Texture原名是AsyncDisplayKit,是Facebook的paper团队发布的一个基于UIKit的库,这个库能够将图片加载布局计算以及UI渲染等操作均放在后台线程,进而可以极大地优化APP...ASNetworkImageNode 作用等同于UIImageView,当需要加载网络图片的时候会使用此类,Texture用的是第三方的图片加载库PINRemoteImage。...3、组合LayoutSpecsLayoutElements,创建复杂UI 通过下图我们可以看到如何将ASTextNode(黄色高亮)、ASVedioNode(顶部图像ASStackLayoutSpec...使用ASCenterLayoutSpec(中心布局规则)ASOverlayLayoutSpec(覆盖布局规则)来放置顶部ASVedioNode(顶部图像)。 ?...在堆叠布局中,以垂直或水平堆叠对齐item,堆叠布局可以是另一堆叠布局的子布局,这使得可以使用ASStackLayoutSpec来创建任何布局

2.4K61
  • Vogue Shopify主题模板配置修改

    Vogue是一个书样式外观高度可视化产品的Shopify主题,可以创造奢华的购物体验,提升您的品牌销量。...Vogue Shopify主题特色 针对大图像进行了优化 在整个商店中展示高分辨率商品图像。 宽布局 充分利用具有全宽布局的大型影像。...网格样式布局 在主页上以网格样式布局展示多个产品、帖子或促销信息。 查找手册功能 在以社论式跨页显示产品系列的样板中展示您的产品。 连续产品滚动 通过在产品页面之间无限滚动来提高可发现性。...针对大图像进行了优化‎ ‎在整个商店中使用高分辨率产品图像展示您的产品。‎ ‎砌体标准布局‎ ‎在砖石标准布局中展示多个产品,帖子或促销。‎...满意的客户‎ ‎在用了几个星期的每一个免费布局之后,我测试了很多,当我开始使用Vogue主题时,我知道我已经找到了适合我的商店的完美布局。我喜欢。‎

    1.1K20

    【技术创作101训练营】项目的架构设计与模块规划

    1、业务需求不断增加(业务问题) 用户有了新需求 我们有了新创意 对手出了新功能 2、旧功能的残留不断堆叠(混合问题) 不能删(不知道有没有用) 不敢删(不知道删了会怎样) 删不动(与其它功能有千丝万缕的联系...Input Delay 首次输入延迟 体现可交互性 CLS - Cumulative Layout Shift 累计布局偏移 体现视觉稳定性 研发方面 1、迭代周期太长(性能-开发阶段)...特性模块都做成惰性加载的 特性模块不应导出组件,它只应该提供路由 路由树应该领域树同构 3、控制依赖 不同的子树之间不要相互依赖 架构设计过程 1.对业务知识进行建模 业务专家 架构师...1、工件体积要小,要支持分块加载 特性模块的惰性加载机制 2、可维护性要好,新增修改都方便 特性模块的所有组件是私有的,所有影响都局限在小范围 3、架构组件之间的耦合要小、隔离要严格,要局部化...禁止特性模块的跨子树依赖 4、架构组织职责要明确,这样分工才能明确 按业务领域划分,把业务知识局部化 如何做好横向切分 1、做好版本管理 严格遵循语义化版本规范 2、做好关注点分离 分离技术问题业务问题

    1.4K382

    如何深入理解 JavaScript 中的懒加载

    它延迟显示某些元素,如图片、视频其他多媒体,直到用户主动与网页进行交互。本文将向您展示如何使用懒加载,以便您的用户在访问您的网站时获得更好的体验。 介绍 网络用户对网站加载时间性能有很高的期望。...例如,假设您有一个页面上有多个图像,并且希望在用户向下滚动页面时延迟加载这些图像。下面是如何使用Intersection Observer API原生JavaScript实现延迟加载的方法。...管理多个延迟加载元素,确保它们在正确的时间加载,并处理交互可能具有挑战性。 管理图像尺寸:在响应式设计中,懒加载图像在处理不同屏幕尺寸分辨率时可能会变得具有挑战性。...使用 srcset sizes 属性实现响应式图像,根据用户的视口提供不同的图像尺寸,节省带宽。 使用占位元素:为了防止内容移动布局不稳定,使用占位元素来保留懒加载内容的空间。...可以使用占位图像或简单的占位符,比如具有定义尺寸背景颜色的div元素,以保持布局直到实际内容加载完成。

    34930

    OpenHarmony实现倒计时效果

    短信倒计时 1.背景 倒计时的效果在网站或其他平台看到的很多了吧,今天就让我们来看看在OpenHarmony中如何实现它吧!...,不正确的话,弹窗提示。...img image-20221019154500731 6.编写代码,实现功能 1.布局拆分 首先我们来看一下布局,然后将布局分解成它的各个基础元素: 识别出它的行列。...这个布局是否包含网格布局? 是否有重叠的元素? 界面是否需要选项卡? 留意需要对齐、内间距、或者边界的区域。 首先,识别出稍大的元素。在这个例子中,一个重叠图像,两个行区域,一个文本区域。...image-20221019160852761 2.实现堆叠布局 首先是背景图片,我们采用堆叠布局,用Stack来展示背景并铺满整个页面。

    1.3K20

    程序猿必备的10款web前端动画插件三

    今天我们将大家分享一些类似的Three.js动力隧道实验。 3.一些装饰鼓舞人心的WebGL背景滚动效果 这个想法是扭曲一些图像六角网格图案滚动,创造一个有趣的效果。...4.开发者/设计师页面布局概念 具有开发者/设计者主题特殊图像的实验页面布局概念显示效果。我们希望与您分享一个简单的页面布局概念。...当你打开演示,你会发现一些“小故障”的影响,对一些单词肖像。小故障揭示了“编码方”。当点击左下角的“编码器”开关时,图像将被拆开,并带有小矩形的动画,显露出另一个图像。...在预览太阳镜如何看待一个人的过程中,这并不是一种“试穿”,而是戴上太阳镜并通过它们观看时的视图。为此,我们使用简单的叠加效果一些动画来模仿您从第一人称角度尝试眼镜时所做的动作。...这个想法是在加载完成后显示一些带有(微妙)动画的图像网格项目。对于演示,我们有三个略有不同的网格布局,不同的排水沟列号。

    2.1K80

    计算机视觉之ResNet50图像分类

    ResNet网络介绍 ResNet50网络是由微软实验室的何恺明提出,获得了ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络堆叠到一定深度时会出现退化问题。...数据集准备与加载 CIFAR-10数据集共有60000张32*32的彩色图像,分为10个类别,每类有6000张图,数据集一共有50000张训练图片10000张评估图片。...本节内容首先介绍了如何构建残差网络结构,然后讲述了如何通过堆叠残差网络来构建ResNet50网络。...模型训练与评估 使用ResNet50预训练模型进行微调,包括加载预训练模型参数、定义优化器损失函数、打印训练损失和评估精度,并保存最佳ckpt文件。...这篇文章描述了如何使用MindSpore框架构建ResNet50网络模型,并在CIFAR-10数据集上进行训练评估。

    89110

    惰性加载优化 React 程序

    惰性加载是一种优化 Web 应用移动应用的旧技术。非常直截了当 —— 如果在某一时刻资源没有被查看或需要,就不要渲染它们。例如,如果我们有一个要显示的文章列表,开始时应该只渲染视口上的内容。...为什么要用懒惰性载? 大多数时候,我们的用户看不到整个网页,至少在开始时是这样。无论我们的程序 UI 如何构建,用户最初甚至永远都不需要某些组件!...因此按需加载或呈现这些组件似乎是一个更有效的决策。它可以提高程序的性能,同时也可以为我们节省大量资源。 怎么做? 我们将创建一个示例程序,可以在其中使用惰性加载。...插入图像后的效果 正如我之前所说,图像是网页的数据饥饿组件,在这里我们正在为每个文章加载图像。虽然整个组件是延迟加载的,并且图像加载了组件,但图像加载有点慢,而且不是那么顺利。...因此,我们可以用 LazyLoad 为单个图像创建更好的图像加载体验。 该技术是将非常低质量的图像作为占位符加载,然后加载原始图像。所以,最终的 App.js 是这样: ?

    2.7K20

    为什么我对JavaScript的未来持乐观态度?

    尽管有种种怪异不完善之处,但由于其内置的增长黑客(它在浏览器中)、其庞大的工具库生态系统以及TypeScript的持续增长采用,JavaScript的采用率继续上升。...下面是一个例子,说明这种排列组合如何使所有的 web 开发者受益。想象一下,你是一个框架的作者,试图编写一个可重复使用的图像组件,以帮助成千上万的开发人员在使用图像时获得良好的性能。...加载图片而不引起布局变化,正确地保持长宽比,并且不因图片的大小/重量而降低页面的初始加载性能,这很难在所有主要的浏览器上实现支持。...现在有跨浏览器支持: aspect-ratio,防止布局变化的宽/高属性,本地图像惰性加载,以及纯 CSS/SVG-based 模糊图像占位符。...还有 Request、Response 其他100多个现在可在浏览器 Node.js 中使用的 API。

    90830

    安卓软件开发:使用AndroidView(MDC)实现高级轮播图App-下篇

    下面的代码展示了如何在 Activity 中初始化 RecyclerView 配置 CarouselSnapHelper CarouselLayoutManager。...R.drawable.app, R.drawable.app, R.drawable.a ) } } 轮播图的 RecyclerView 创建一个适配器加载显示图像...Jetpack Compose 的 LazyColumn LazyRow 提供了内置的性能优化机制,处理长列表时会自动实现惰性加载,不会加载屏幕外的内容,提升性能。...Jetpack Compose:内置性能优化 Compose 则通过惰性布局(如 LazyColumn、LazyRow)自动优化性能。它只会渲染屏幕上可见的内容,减少了不必要的计算。...UI 状态的绑定让开发不再需要手动管理视图更新,代码很简洁清晰,维护成本也非常低。 五、总结 在这篇文章中,展示了如何使用 MDC(Android View)实现一个高级轮播图组件。

    44081

    揭示不为人知的CSS

    如果你在日常工作中使用CSS,那么你的主要目标很可能集中在使事情看起来是正确的。最终得到的正确结果远比如何实现更重要。这意味着相比正确的语法视觉效果我们更少关注CSS的实现原理。...浮动布局 绝对定位布局 层叠上下文 渲染过程概述 当你加载一个HTML文档的时候,页面的渲染过程中会按照顺序发生了很多事情。...CSSdisplay属性在决定元素如何参与当前的格式化上下文定位方案中起着关键的作用。这些部分将决定元素的最终布局位置。 这是一个复杂的步骤,是迄今为止最难尝试总结的。...从技术上讲,外部显示类型决定了元素如何参与其父元素的格式化上下文。 内部显示类型确定该元素将生成什么样的格式化上下文。 这将影响其子元素的布局。 想象一下Flexbox容器的工作原理。...格式化上下文 格式化上下文是关于布局的。 它们是管理容器内元素布局的规则,以及它们如何相互交互。

    1.6K30

    瞒不住了,Prefetch 就是一个大谎言

    ={async () => { // 惰性加载点击“购买”按钮背后的逻辑。...当用户单击 Buy 按钮时,浏览器会惰性加载 buy.js 包。根据 bundle 的大小网络的速度,这可能会引入一个显著的、明显的延迟。那我们能做些什么来改善呢?...在闲置的时候加载 因此,大多数浏览器只在 network 空闲时才处理 prefetch。这是有意义的,但是为了让应用程序具有交互性,需要确保在出现次要事物(如高分辨率图像)之前出现交互性。...使用 service worker,我们可以对流程进行正确的控制,还可以了解 chunk 依赖关系图,并可以加载相关代码。...结论 你或许经常看到是“专家”给出的常见的性能优化建议中包含了 prefetch,以确保惰性加载的块不会对用户交互造成延迟。

    33620

    瞒不住了,Prefetch 就是一个大谎言

    ={async () => { // 惰性加载点击“购买”按钮背后的逻辑。...当用户单击 Buy 按钮时,浏览器会惰性加载 buy.js 包。根据 bundle 的大小网络的速度,这可能会引入一个显著的、明显的延迟。那我们能做些什么来改善呢?...在闲置的时候加载因此,大多数浏览器只在 network 空闲时才处理 prefetch。这是有意义的,但是为了让应用程序具有交互性,需要确保在出现次要事物(如高分辨率图像)之前出现交互性。...使用 service worker,我们可以对流程进行正确的控制,还可以了解 chunk 依赖关系图,并可以加载相关代码。...结论你或许经常看到是“专家”给出的常见的性能优化建议中包含了 prefetch,以确保惰性加载的块不会对用户交互造成延迟。

    71300

    加载图片以获取最佳性能的最佳方案

    图片懒加载是一个很受欢迎的优化站点的方法,因为它很容易实现,并且能明显提升性能。使用惰性加载,我们可以异步加载图片,这意味着可以只加载浏览器视口内的图片。...大约一年前,图像iframe的原生惰性加载特性已发布,但是仅针对谷歌其他主流浏览器。该功能的重点是使浏览器可以控制何时请求图像或iframe资源,这使得开发工作更加容易。...标记图片 我们希望JavaScript函数基于浏览器原生支持的特性来开启图像加载过程。为此,我们将图像的路径添加到data-src而不是src。...我习惯使用lazysizes,但是任何懒加载插件都会生效,前提是保证元素的标记要正确(比如类名,data元素等)。...懒加载在商城站点运营活动的场景使用更加频繁,当然,图片还要进行最优压缩、切割CDN处理等。更多博文内容详见Jimmy Blog

    1.3K21

    浏览器之性能指标-CLS

    以下是宽高比在渲染中的几个方面作用: 布局计算:浏览器在计算页面布局时,会使用图片的宽高比来确定图片在文档流中的尺寸位置。宽高比可以帮助浏览器确定图片的宽度高度,以便正确地分配空间。...避免布局偏移:使用正确的宽高比可以避免在图片加载过程中发生布局偏移。如果在图片加载前没有指定宽高比,浏览器可能无法正确预留图片所需的空间,导致页面布局加载后发生突然变化。...❝总而言之,宽高比在图片的布局、显示响应式设计方面都起到重要作用,它能够确保图片在不同环境下呈现出正确的比例外观,并避免布局偏移的问题。...当处理响应式图像时,可以使用srcset属性来指定不同大小分辨率的图像源,让浏览器根据需要选择最合适的图像进行加载显示。...当浏览器根据设备的屏幕大小分辨率选择加载图像时,它会根据srcset属性sizes属性的规则选择最合适的图像源,并自动调整图像的大小。

    85520

    康耐视VIDI介绍-蓝色定位工具(Locate)

    布局模型提供了检查特征是否存在以及验证区域中一个或多个特征的正确实例数的功能。可以生成节点模型,其定义一组特征之间的空间关系。 3.1特征尺寸 工具的特征尺寸的配置取决于特征工具参数设置。...布局模型可用于执行以下操作: 检查并确认一个或多个区域内是否存在特征。 验证该区域是否存在正确的特征,以及此区域中该特征的实例数。 为下游工具提供关注区 (ROI)。...要实现更复杂的验证表达式,您可以通过创建具有相同位置维度的多个区域来“堆叠”区域,但每个区域的验证标准不同。...浏览所有图像并确定工具正确标记了图像中的特征 右键单击图像并选择接受视图。 再次右键单击图像,然后选择清除标记标签。 手动标注图像中的特征。...⑧将模型应用于多个图像后,按大脑图标训练工具。 ⑩训练后查看结果: A.浏览所有图像并确定工具正确标记了图像中的特征。 如果工具已正确标记特征,请右键单击图像,然后选择接受视图。

    3.6K30

    【CSS】禅意花园--心得分享

    若是没有了z-index,绝对定位元素将自下而上层叠,因而在html中先出现的元素会被堆叠于底部,而后出现的元素会被堆叠于上部。 z-index的合法值是从0开始的任意整数。...background 许多设计师会同时定义背景色背景图片。背景色由浏览器直接控制,会CSS中的其他定义一起快速显示于页面上,而背景图片需要相对较长的时间加载。...因此,同时定义二者有助于让页面的加载过程变得更为平滑。...但是,要知道并非各种宽度长度属性都能够应用同样的方法。例如:图像,因为图像的尺寸是固定的,它们不会随着字符大小的改变而改变。所以,要彻底应用弹性设计还需要更多的考虑。...(2)若用浮动实现布局,请确保正确地清除浮动。 (3)为元素应用内边距或边框来避免外边距重叠。 有时候元素之间留出了一条并不希望看到的缝隙,而另一些时候却无法让元素之间保持一段距离。

    29630

    更轻量级的 V8 引擎

    例如:优化的代码;类型反馈,用于确定如何优化代码;用于在 C++ JavaScript 对象之间进行绑定的冗余元数据;仅在特殊情况下才需要元数据,如堆栈跟踪符号;还有在页面加载期间仅执行几次的函数的字节码...惰性反馈分配前后的反馈矢量树 我们实验现场测试结果表明,在台式机上的惰性反馈没有出现性能下降的趋势,而在移动平台上,由于减少了垃圾收集,实际上在低端设备上性能有所提高。...因此,我们修复了这些不匹配问题,并添加了检查压力模式,以确保函数的急速惰性编译始终能够产生一致的输出,从而使我们对 V8 解析器预解析器的正确一致性更具信心。...经过两个 GC 循环后,老化的函数的对象布局 其他优化 除了这些较大的项目,我们还发现并解决了一些导致效率低下的问题。 第一个是减小 FunctionTemplateInfo 对象的大小。...以前通过优化代码跳转到大型跳转表中的特定偏移量来计算这个 ID,然后再将正确的 ID 加载到寄存器中,最后跳转到运行时以执行反优化。这样做的好处是,对于每个取消点,在优化代码中只需要一条跳转指令。

    1.3K20

    在PyTorch中构建高效的自定义数据集

    张量(tensor)其他类型 为了进一步探索不同类型的数据在DataLoader中是如何加载的,我们将更新我们先前模拟的数字数据集,以产生两对张量数据:数据集中每个数字的后4个数字的张量,以及加入一些随机噪音的张量...当您在训练期间有成千上万的样本要加载时,这使数据集具有很好的可伸缩性。 您可以想象如何在计算机视觉训练场景中使用该数据集。...数据集将具有文件名列表图像目录的路径,从而让__getitem__函数仅读取图像文件并将它们及时转换为张量来进行训练。...PyTorch数据加载教程(https://pytorch.org/tutorials/beginner/data_loading_tutorial.html)有更详细的图像数据集,加载器,互补数据集...而且,如果您现在尝试加载此数据集,您应该获得跟您当初所期望的数据:正确的批(batch)大小格式的张量。下图显示了批大小为2的张量,但请注意有三个张量: ?

    3.6K20
    领券