数据图册页面(左边一列图片缩略图,右边展示图片大图)

news/2024/7/9 23:55:38 标签: vue

最近要写这么一个页面,左侧一列图片缩略图,点击左侧缩略图后有选中效果,然后右侧展示图片原图,还能够左右翻页查看。
最后写了一个demo出来,demo还不是很完善,需要自己修改,后面我也给出了修改建议。

文章目录

      • demo的最终效果:
      • 修改说明
      • 页面源代码

demo的最终效果:

在这里插入图片描述

我这里数据是写死的:
url是获取的本地图片,测试时候可以直接这样写。
到时候有数据时,直接把url封装到这个数组结构中就可以了。
在这里插入图片描述

修改说明

这里说一下我对这个demo的修改,供大家参考:
1、我这里在左侧加了滚动条,查看缩略图列表,用的是el的这个组件<el-scrollbar>

2、右侧大图我又加了点击放大查看,用的是el的<el-image>的:preview-src-list属性,给这个属性绑定一个url数组,可以把这个对象数组的url属性封装到一个url数组中。

可以参考elementui官网的大图预览:
https://element.eleme.io/#/zh-CN/component/image

3、这个样式是左侧缩略图选中时的灰色选中效果,可以自行修改颜色。
.thumbnail.active {
background-color: #ccc;
}
4、可以把右侧大图的宽度定死,这样图片跳转按钮就不会来回跳了
5、还可以把跳转按钮做成循环的,这样到最后一页再跳转的时候就会直接到第一页。
循环的写法:
就是多加一个else判断

// 上一张图片
      prevImage() {
        if (this.currentIndex > 0) {
          this.currentIndex--;
        } else {
          this.currentIndex = this.images.length - 1;
        }
      },
      // 下一张图片
      nextImage() {
        if (this.currentIndex < this.images.length - 1) {
          this.currentIndex++;
        } else {
          this.currentIndex = 0;
        }
      },

页面源代码

<template>
  <!-- 图片展示组件 -->
  <div class="image-gallery">
    <!-- 缩略图列表 -->
    <div class="thumbnail-list">
      <div
        v-for="(image, index) in images"
        :key="index"
        :class="['thumbnail', { active: index === currentIndex }]"
        @click="setCurrentIndex(index)"
      >
        <img :src="image.url" alt="Thumbnail" />
        <div class="image-name">{{ image.name }}</div> <!-- 显示图片名称 -->
      </div>
    </div>

    <!-- 图片展示器 -->
    <div class="image-viewer">
      <div class="image-container">
        <!-- 左翻页箭头 -->
        <div class="arrow left" @click="prevImage">&#8249;</div>

<!--        &lt;!&ndash; 当前选中的图片 &ndash;&gt;-->
<!--        <img :src="currentImage.url" alt="Full Size Image" />-->
        <!-- 当前选中的图片 -->
        <div class="image-wrapper">
          <div class="image-name">{{ currentImage.name }}</div> <!-- 显示图片名称 -->
          <div class="image-name">{{ currentImage.summary }}</div> <!-- 显示图片名称 -->
          <img :src="currentImage.url" alt="Full Size Image" />
        </div>

        <!-- 右翻页箭头 -->
        <div class="arrow right" @click="nextImage">&#8250;</div>
      </div>
    </div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        // 图片对象数组,包含链接和名称
        images: [
          { url: require('@/assets/01.png'), name: '图片1' ,summary:'图片介绍'},
          { url: require('@/assets/02.png'), name: '图片2' ,summary:'图片介绍'},
          { url: require('@/assets/03.png'), name: '图片3' ,summary:'图片介绍'},
        ],
        // 当前选中的图片索引,初始值为 0
        currentIndex: 0,
      };
    },
    computed: {
      // 计算属性,返回当前选中的图片对象
      currentImage() {
        return this.images[this.currentIndex];
      },
    },
    methods: {
      // 设置当前选中的图片索引
      setCurrentIndex(index) {
        this.currentIndex = index;
      },
      // 上一张图片
      prevImage() {
        if (this.currentIndex > 0) {
          this.currentIndex--;
        }
      },
      // 下一张图片
      nextImage() {
        if (this.currentIndex < this.images.length - 1) {
          this.currentIndex++;
        }
      },
    },
  };
</script>

<style scoped>

  .image-gallery {
    display: flex;
    height: 100vh;
  }

  .thumbnail-list {
    width: 200px;
    background-color: #f5f5f5;
    overflow-y: auto;
  }

  .thumbnail {
    padding: 10px;
    cursor: pointer;
    border-bottom: 1px solid #ccc;
  }

  .thumbnail img {
    width: 100%;
  }

  .thumbnail.active {
    background-color: #ccc;
  }

  .image-viewer {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
  }

  .image-container {
    position: relative;
  }

  .arrow {
    position: absolute;
    top: 50%;
    font-size: 24px;
    color: #fff;
    cursor: pointer;
    user-select: none;
    background-color: rgba(0, 0, 0, 0.3);
    padding: 4px 8px;
  }

  .arrow.left {
    left: 10px;
  }

  .arrow.right {
    right: 10px;
  }

  img {
    max-width: 100%;
    max-height: 100%;
  }
  .image-name {
    margin-top: 5px; /* 图片名称与缩略图之间的上边距 */
    text-align: center; /* 居中显示图片名称 */
  }
  /*小的图片查看器样式*/
  .image-wrapper {
  /*      position: relative;*/
    margin-top: 40px;
    }
</style>


http://www.niftyadmin.cn/n/5110673.html

相关文章

运维学习CentOS 7进行Nightingale二进制部署

.因为Nightingale需要MySQL保存一些数据&#xff0c;所以可以参考《CentOS 7.6使用mysql-8.0.31-1.el7.x86_64.rpm-bundle.tar安装Mysql 8.0》部署MySQL。 https://github.com/ccfos/nightingale/releases是可以github上下载Nightingale二进制安装包。 https://n9e.github.io/…

【单调栈】739. 每日温度、496. 下一个更大元素 I

提示&#xff1a;努力生活&#xff0c;开心、快乐的一天 文章目录 739. 每日温度&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3af;题目总结 496. 下一个更大元素 I&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1…

【编解码格式】Theora

Theora Theora是一个免权利金、开放格式的有损影像压缩技术&#xff0c;由Xiph.Org基金会开发&#xff0c;该基金会还开发了著名的声音编码技术Vorbis&#xff0c;以及多媒体容器文件格式Ogg。libtheora则是Xiph.Org基金会针对Theora格式的实现[5][6]。 Theora是由On2 Techno…

3D视觉硬件技术

目前市面上主流的3D光学视觉方案有三种&#xff1a; 双目立体视觉法&#xff08;Stereo Vision&#xff0c;在下文称双目法&#xff09;&#xff0c;结构光法&#xff08;Structured Light&#xff0c;在下文称结构光&#xff09;以及飞行时间法(Time of Flight, ToF在下文称T…

Mysql基础与高级汇总

SQL语言分类 DDL:定义 DML&#xff1a;操作 DCL:控制(用于定义访问权限和安全级别) DQL:查询 Sql方言 ->sql&#xff1a;结构化查询语言 mysql:limit oracle:rownum sqlserver:top 但是存储过程&#xff1a;每一种数据库软件一样SQL语法要求: SQL语句可以单行或多行书写&…

华为OD机试 - 根据某条件聚类最少交换次数 - 滑动窗口(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【华为OD机试】删除目录

某文件系统中有N个目录&#xff0c;每个目录都一个独一无二的ID。每个目录只有一个父目录&#xff0c;但每个父目录下可以有零个或者多个子目录&#xff0c;目录结构呈树状结构。假设&#xff0c;根目录的ID为0&#xff0c;且根目录没有父目录&#xff0c;其他所有目录的ID用唯…

【C++进阶之路】IO流

文章目录 一、C语言的IO1.键盘与显示屏2. 文件与内存3.字符串与内存 二、CIO1.iostream1.1基本使用1.2operator bool 2. fstream2.1二进制的文件读写2.2字符串的文件读写 3. sstream3.1序列化与反序列化3.2拼接字符串3.3将数据类型转换为字符串 总结 一、C语言的IO 1.键盘与显…