Image 图片

图片容器,在保留所有原生 img 的特性下,支持懒加载,自定义占位、加载失败等

基础用法

可通过fit确定图片如何适应到容器框,同原生 object-fit

Image 图片 - 图1

  1. <template>
  2. <div class="demo-image">
  3. <div v-for="fit in fits" :key="fit" class="block">
  4. <span class="demonstration">{{ fit }}</span>
  5. <el-image style="width: 100px; height: 100px" :src="url" :fit="fit" />
  6. </div>
  7. </div>
  8. </template>
  9. <script lang="ts" setup>
  10. const fits = ['fill', 'contain', 'cover', 'none', 'scale-down']
  11. const url =
  12. 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg'
  13. </script>
  14. <style scoped>
  15. .demo-image .block {
  16. padding: 30px 0;
  17. text-align: center;
  18. border-right: solid 1px var(--el-border-color);
  19. display: inline-block;
  20. width: 20%;
  21. box-sizing: border-box;
  22. vertical-align: top;
  23. }
  24. .demo-image .block:last-child {
  25. border-right: none;
  26. }
  27. .demo-image .demonstration {
  28. display: block;
  29. color: var(--el-text-color-secondary);
  30. font-size: 14px;
  31. margin-bottom: 20px;
  32. }
  33. </style>

占位内容

可通过slot = placeholder可自定义占位内容

Image 图片 - 图2

  1. <template>
  2. <div class="demo-image__placeholder">
  3. <div class="block">
  4. <span class="demonstration">Default</span>
  5. <el-image :src="src" />
  6. </div>
  7. <div class="block">
  8. <span class="demonstration">Custom</span>
  9. <el-image :src="src">
  10. <template #placeholder>
  11. <div class="image-slot">Loading<span class="dot">...</span></div>
  12. </template>
  13. </el-image>
  14. </div>
  15. </div>
  16. </template>
  17. <script lang="ts" setup>
  18. const src =
  19. 'https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg'
  20. </script>
  21. <style scoped>
  22. .demo-image__placeholder .block {
  23. padding: 30px 0;
  24. text-align: center;
  25. border-right: solid 1px var(--el-border-color);
  26. display: inline-block;
  27. width: 49%;
  28. box-sizing: border-box;
  29. vertical-align: top;
  30. }
  31. .demo-image__placeholder .demonstration {
  32. display: block;
  33. color: var(--el-text-color-secondary);
  34. font-size: 14px;
  35. margin-bottom: 20px;
  36. }
  37. .demo-image__placeholder .el-image {
  38. padding: 0 5px;
  39. max-width: 300px;
  40. max-height: 200px;
  41. }
  42. .demo-image__placeholder.image-slot {
  43. display: flex;
  44. justify-content: center;
  45. align-items: center;
  46. width: 100%;
  47. height: 100%;
  48. background: var(--el-fill-color-light);
  49. color: var(--el-text-color-secondary);
  50. font-size: 14px;
  51. }
  52. .demo-image__placeholder .dot {
  53. animation: dot 2s infinite steps(3, start);
  54. overflow: hidden;
  55. }
  56. </style>

加载失败

可通过slot = error可自定义加载失败内容

Image 图片 - 图3

  1. <template>
  2. <div class="demo-image__error">
  3. <div class="block">
  4. <span class="demonstration">Default</span>
  5. <el-image />
  6. </div>
  7. <div class="block">
  8. <span class="demonstration">Custom</span>
  9. <el-image>
  10. <template #error>
  11. <div class="image-slot">
  12. <el-icon><icon-picture /></el-icon>
  13. </div>
  14. </template>
  15. </el-image>
  16. </div>
  17. </div>
  18. </template>
  19. <script setup lang="ts">
  20. import { Picture as IconPicture } from '@element-plus/icons-vue'
  21. </script>
  22. <style scoped>
  23. .demo-image__error .block {
  24. padding: 30px 0;
  25. text-align: center;
  26. border-right: solid 1px var(--el-border-color);
  27. display: inline-block;
  28. width: 49%;
  29. box-sizing: border-box;
  30. vertical-align: top;
  31. }
  32. .demo-image__error .demonstration {
  33. display: block;
  34. color: var(--el-text-color-secondary);
  35. font-size: 14px;
  36. margin-bottom: 20px;
  37. }
  38. .demo-image__error .el-image {
  39. padding: 0 5px;
  40. max-width: 300px;
  41. max-height: 200px;
  42. width: 100%;
  43. height: 200px;
  44. }
  45. .demo-image__error .image-slot {
  46. display: flex;
  47. justify-content: center;
  48. align-items: center;
  49. width: 100%;
  50. height: 100%;
  51. background: var(--el-fill-color-light);
  52. color: var(--el-text-color-secondary);
  53. font-size: 30px;
  54. }
  55. .demo-image__error .image-slot .el-icon {
  56. font-size: 30px;
  57. }
  58. </style>

懒加载

TIP

浏览器原生支持的 loading属性在 2.2.3版本加入。 您可以使用 loading="lazy" 替换之前的lazy= true

如果当前浏览器支持原生图片延迟加载,则先使用原生能力,否则将使用滚动监听实现相同效果。

可通过lazy开启懒加载功能, 当图片滚动到可视范围内才会加载。 可通过 scroll-container 来设置滚动容器, 若未定义,则为最近一个 overflow 值为 auto 或 scroll 的父元素。

Image 图片 - 图4

  1. <template>
  2. <div class="demo-image__lazy">
  3. <el-image v-for="url in urls" :key="url" :src="url" lazy />
  4. </div>
  5. </template>
  6. <script lang="ts" setup>
  7. const urls = [
  8. 'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
  9. 'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
  10. 'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
  11. 'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
  12. 'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
  13. 'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
  14. 'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
  15. ]
  16. </script>
  17. <style scoped>
  18. .demo-image__lazy {
  19. height: 400px;
  20. overflow-y: auto;
  21. }
  22. .demo-image__lazy .el-image {
  23. display: block;
  24. min-height: 200px;
  25. margin-bottom: 10px;
  26. }
  27. .demo-image__lazy .el-image:last-child {
  28. margin-bottom: 0;
  29. }
  30. </style>

图片预览

可通过 previewSrcList 开启预览大图的功能。 你可以通过 initial-index 初始化第一张预览图片的位置。 默认初始位置为 0。

Image 图片 - 图5

  1. <template>
  2. <div class="demo-image__preview">
  3. <el-image
  4. style="width: 100px; height: 100px"
  5. :src="url"
  6. :preview-src-list="srcList"
  7. :initial-index="4"
  8. fit="cover"
  9. />
  10. </div>
  11. </template>
  12. <script lang="ts" setup>
  13. const url =
  14. 'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg'
  15. const srcList = [
  16. 'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
  17. 'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
  18. 'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
  19. 'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
  20. 'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
  21. 'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
  22. 'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
  23. ]
  24. </script>
  25. <style scoped>
  26. .demo-image__error .image-slot {
  27. font-size: 30px;
  28. }
  29. .demo-image__error .image-slot .el-icon {
  30. font-size: 30px;
  31. }
  32. .demo-image__error .el-image {
  33. width: 100%;
  34. height: 200px;
  35. }
  36. </style>

图像 API

Image 属性

参数说明类型默认值
src图片源地址,同原生属性一致string
fit确定图片如何适应容器框,同原生 object-fit Image 图片 - 图6‘fill’ | ‘contain’ | ‘cover’ | ‘none’ | ‘scale’-down’
hide-on-click-modal当开启 preview 功能时,是否可以通过点击遮罩层关闭 previewbooleanfalse
loading 2.2.3浏览器加载图像的策略,和 浏览器原生 Image 图片 - 图7 能力一致‘eager’ | ‘lazy’
lazy是否使用懒加载booleanfalse
scroll-container开启懒加载功能后,监听 scroll 事件的容器string | HTMLElement最近一个 overflow 值为 auto 或 scroll 的父元素
alt原生属性 altstring
referrer-policy原生属性 referrerPolicystring
preview-src-list开启图片预览功能string[]
z-index设置图片预览的 z-indexnumber
initial-index初始预览图像索引,小于 url-list 的长度number0
close-on-press-escape是否可以通过按下 ESC 关闭 Image Viewerbooleantrue
preview-teleportedimage-viewer 是否插入至 body 元素上。 嵌套的父元素属性会发生修改时应该将此属性设置为 truebooleanfalse

Image 事件

事件名说明类型
load图片加载成功触发(e: Event) => void
error图片加载失败触发(e: Error) => void
switch切换图像时触发。(index: number) => void
close当点击 X 按钮或者在hide-on-click-modal为 true 时点击遮罩层时触发() => void

Image 插槽

插槽名说明
placeholder当图像尚未加载时,自定义的占位符内容
error自定义图像加载失败的内容
viewer图片描述内容

Image Viewer API

ImageViewer 属性

属性说明类型默认值
url-list用于预览的图片链接列表string[][]
z-index预览时遮罩层的 z-indexnumber | string
initial-index初始预览图像索引,小于 url-list 的长度number0
infinite是否可以无限循环预览booleantrue
hide-on-click-modal是否可以通过点击遮罩层关闭预览booleanfalse
teleportedimage 自身是否插入至 body 元素上。 嵌套的父元素属性会发生修改时应该将此属性设置为 truebooleanfalse

ImageViewer 事件

事件名说明类型
close当点击 X 按钮或者在hide-on-click-modal为 true 时点击遮罩层时触发() => void
switch切换图像时触发。(index: number) => void

Image Viewer 方法

方法名说明参数
setActiveItem手动切换图片需要切换的图片的索引,从 0 开始

源代码

组件 Image 图片 - 图8 文档 Image 图片 - 图9

贡献者

Image 图片 - 图10 三咲智子

Image 图片 - 图11 云游君

Image 图片 - 图12 JeremyWuuuuu

Image 图片 - 图13 btea

Image 图片 - 图14 qiang

Image 图片 - 图15 msidolphin

Image 图片 - 图16 Alan Wang

Image 图片 - 图17 C.Y.Kun

Image 图片 - 图18 Aex

Image 图片 - 图19 Lucuai

Image 图片 - 图20 Xc

Image 图片 - 图21 Delyan Haralanov

Image 图片 - 图22 bqy_fe

Image 图片 - 图23 kooriookami

Image 图片 - 图24 程成

Image 图片 - 图25 啝裳

Image 图片 - 图26 zycoJamie

Image 图片 - 图27 SongWuKong

Image 图片 - 图28 cregis0073

Image 图片 - 图29 Esteban Fuentealba

Image 图片 - 图30 Hades-li

Image 图片 - 图31 zz

Image 图片 - 图32 류한경

Image 图片 - 图33 iamkun