PicturePreview.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <div class="picture_area" :style="getAreaStyle()">
  3. <SerialNumberPosition :property="data.property" />
  4. <div class="main">
  5. <div class="view_area">
  6. <el-carousel
  7. v-if="'list' === data.property.view_method"
  8. ref="picture_carousel"
  9. class="view_independent"
  10. indicator-position="none"
  11. :autoplay="false"
  12. >
  13. <el-carousel-item v-for="(file, i) in data.file_list" :key="i">
  14. <el-image :id="file.file_id" :src="file.file_url" fit="contain" />
  15. </el-carousel-item>
  16. </el-carousel>
  17. <ul class="view_list">
  18. <li v-for="(file, i) in data.file_list" :key="i" @click="handleIndicatorClick(i)">
  19. <el-image :id="file.file_id" :src="file.file_url" fit="contain" />
  20. </li>
  21. </ul>
  22. </div>
  23. </div>
  24. </div>
  25. </template>
  26. <script>
  27. import { getPictureData } from '@/views/book/courseware/data/picture';
  28. import PreviewMixin from '../common/PreviewMixin';
  29. export default {
  30. name: 'PicturePreview',
  31. mixins: [PreviewMixin],
  32. data() {
  33. return {
  34. data: getPictureData(),
  35. curImgIndex: 0,
  36. };
  37. },
  38. methods: {
  39. handleIndicatorClick(index) {
  40. // 获取 Carousel 实例
  41. const carousel = this.$refs.picture_carousel;
  42. // 切换到对应索引的图片
  43. carousel.setActiveItem(index);
  44. },
  45. },
  46. };
  47. </script>
  48. <style lang="scss" scoped>
  49. .picture_area {
  50. display: grid;
  51. gap: 6px;
  52. padding: 8px;
  53. > .main {
  54. display: flex;
  55. margin: 4px auto;
  56. > span {
  57. display: flex;
  58. }
  59. }
  60. .main {
  61. grid-area: main;
  62. width: 100%;
  63. .view_area {
  64. width: 100%;
  65. :deep .el-carousel {
  66. margin-bottom: 16px;
  67. background-color: #d9d9d9;
  68. &__container::before {
  69. display: inline-block;
  70. padding-bottom: 55%;
  71. content: '';
  72. }
  73. &__container {
  74. height: 100%;
  75. }
  76. &__item {
  77. display: flex;
  78. justify-content: center;
  79. text-align: center;
  80. }
  81. }
  82. .view_list {
  83. display: grid;
  84. grid-template-columns: repeat(6, 1fr);
  85. grid-auto-rows: auto;
  86. gap: 21px 32px;
  87. li {
  88. display: flex;
  89. align-items: center;
  90. justify-content: center;
  91. background-color: #d9d9d9;
  92. }
  93. .el-image {
  94. cursor: pointer;
  95. }
  96. }
  97. }
  98. }
  99. }
  100. </style>