组件库地址

组件的下载与配置

组件说明

  • 该组件基于 Vue 3 与 Element Plus 实现
  • 该组件全屏显示背景图片,实现了响应式
  • 该组件使用了粘滞定位,其中 z-index 的值为 -100
  • 当需要显示的背景图片多于一张时,会开启背景图片的轮播,轮播图使用了 Element Plus 组件库中轮播图(走马灯)组件

组件属性说明

属性名 属性说明 类型 默认值
images 背景图片地址
注意:背景图片需要放置在 public 目录下,背景图片的路径需要以 / 开头,后面编写图片在 public 目录下的路径
Array
由图片地址字符串组成的数组
[]
interval 背景轮播切换背景图片的时间间隔,单位毫秒(ms) Number 5000

组件测试

  1. <script setup lang="ts">
  2. </script>
  3. <template>
  4. <div>
  5. <GoodsCardRowSmall
  6. class="goods"
  7. v-for="i in 20"
  8. :imgSrc="'/img/book-1.png_580x580q90.jpg_.webp'"
  9. ></GoodsCardRowSmall>
  10. </div>
  11. <!-- 使用全屏响应式轮播背景图组件 -->
  12. <Background
  13. :images="['/img/background-1.jpg', '/img/background-1.jpg', '/img/background-1.jpg']"
  14. :interval="5000"
  15. ></Background>
  16. </template>
  17. <style scoped lang="scss">
  18. div {
  19. .goods {
  20. margin-bottom: 1rem;
  21. }
  22. }
  23. </style>
  • 全屏响应式轮播背景图(基于 Vue 3 与 Element Plus) - 图1

组件源码

  1. <script setup lang="ts">
  2. /* 接收参数 */
  3. const props = defineProps({
  4. // 背景需要展示的图片
  5. images: {type: Array<string>, default: []},
  6. // 背景图片有多张时,每个背景图片轮播的事件间隔,单位“毫秒”
  7. interval: {type: Number, default: 5000}
  8. })
  9. /*
  10. * 处理图片响应式问题
  11. * 使用 vueuse 监听容器大小修改图片宽高显示
  12. * 修改为使用背景图片实现背景响应式
  13. */
  14. // import { vElementSize } from '@vueuse/components' // 获取元素大小的指令
  15. // // 指令绑定的元素宽度改变时调用函数
  16. // function onResize({ width, height }: { width: number; height: number }) {
  17. // // 获取所有图片
  18. // let imgs = document.querySelectorAll('img')
  19. // let wh = width/height // 宽高比
  20. // if (
  21. // wh < 1960/1080 ||
  22. // wh < 1760/990 ||
  23. // wh < 1690/1050 ||
  24. // wh < 1600/900 ||
  25. // wh < 1366/768 ||
  26. // wh < 1280/1024 ||
  27. // wh < 1280/720 ||
  28. // wh < 1128/634 ||
  29. // wh < 1024/768 ||
  30. // wh < 800/600
  31. // ) {
  32. // imgs.forEach(img => {
  33. // img.style.height = '100%'
  34. // img.style.width = 'auto'
  35. // })
  36. // } else {
  37. // imgs.forEach(img => {
  38. // img.style.height = 'auto'
  39. // img.style.width = '100%'
  40. // })
  41. // }
  42. // }
  43. /* 动态添加背景 */
  44. import {onMounted} from 'vue'
  45. onMounted(() => {
  46. document.querySelectorAll('.img').forEach((img, idx) => {
  47. img.style.backgroundImage = `url(${props.images[idx]})`
  48. })
  49. })
  50. </script>
  51. <template>
  52. <div class="background-container">
  53. <!-- 单个背景图片 -->
  54. <div
  55. class="background-img"
  56. v-if="images.length == 1"
  57. >
  58. <!--<img :src="images[0]" alt="背景图片" ref="img">-->
  59. <div class="img"></div>
  60. </div>
  61. <!-- 轮播图组件,展示多个背景图 -->
  62. <div class="carousel" v-else-if="images.length > 1">
  63. <el-carousel height="100vh" :interval="interval">
  64. <el-carousel-item v-for="idx in images.length" :key="idx">
  65. <div class="img"></div>
  66. </el-carousel-item>
  67. </el-carousel>
  68. </div>
  69. </div>
  70. </template>
  71. <style scoped lang="scss">
  72. // 图片变化过度
  73. img {
  74. transition: all 0.5s;
  75. }
  76. // 背景组件容器
  77. .background-container {
  78. // 粘滞定位
  79. position: fixed;
  80. top: 0;
  81. left: 0;
  82. z-index: -100;
  83. width: 100%;
  84. height: 100vh;
  85. // 单个背景图片
  86. .background-img {
  87. width: 100%;
  88. height: 100%;
  89. }
  90. // 轮播图展示多个背景图片
  91. .carousel {
  92. height: 100%;
  93. width: 100%;
  94. }
  95. // 图片盒子样式
  96. .img {
  97. width: 100%;
  98. height: 100%;
  99. background-size: cover;
  100. background-position: center;
  101. background-attachment: fixed; // 背景图片粘滞
  102. }
  103. }
  104. </style>