当前位置:首页 > VUE

vue实现画廊

2026-02-10 10:58:38VUE

Vue实现画廊功能

使用Vue实现画廊功能可以通过组件化开发结合第三方库或原生JavaScript实现。以下是两种常见方案:

基于vue-gallery组件

安装vue-gallery库:

npm install vue-gallery --save

基本实现代码:

<template>
  <gallery :images="images" :index="index" @close="index = null"></gallery>
  <div class="image" v-for="(image, imageIndex) in images" :key="imageIndex" 
       @click="index = imageIndex" :style="{ backgroundImage: 'url(' + image + ')' }"></div>
</template>

<script>
import VueGallery from 'vue-gallery';
export default {
  components: {
    'gallery': VueGallery
  },
  data() {
    return {
      images: [
        'image1.jpg',
        'image2.jpg',
        'image3.jpg'
      ],
      index: null
    }
  }
}
</script>

<style>
.image {
  float: left;
  width: 200px;
  height: 200px;
  margin: 5px;
  cursor: pointer;
  background-size: cover;
}
</style>

原生Vue实现方案

<template>
  <div class="gallery">
    <div class="thumbnails">
      <img v-for="(img, idx) in images" :key="idx" 
           :src="img.thumbnail" @click="openLightbox(idx)">
    </div>

    <div class="lightbox" v-if="lightboxVisible" @click="closeLightbox">
      <img :src="currentImage.full" class="lightbox-image">
      <button @click.stop="prevImage">Previous</button>
      <button @click.stop="nextImage">Next</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      images: [
        { thumbnail: 'thumb1.jpg', full: 'full1.jpg' },
        { thumbnail: 'thumb2.jpg', full: 'full2.jpg' }
      ],
      currentIndex: 0,
      lightboxVisible: false
    }
  },
  computed: {
    currentImage() {
      return this.images[this.currentIndex]
    }
  },
  methods: {
    openLightbox(index) {
      this.currentIndex = index
      this.lightboxVisible = true
    },
    closeLightbox() {
      this.lightboxVisible = false
    },
    prevImage() {
      this.currentIndex = (this.currentIndex - 1 + this.images.length) % this.images.length
    },
    nextImage() {
      this.currentIndex = (this.currentIndex + 1) % this.images.length
    }
  }
}
</script>

<style>
.thumbnails {
  display: flex;
  flex-wrap: wrap;
}
.thumbnails img {
  width: 150px;
  height: 150px;
  object-fit: cover;
  margin: 5px;
  cursor: pointer;
}
.lightbox {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0,0.8);
  display: flex;
  align-items: center;
  justify-content: center;
}
.lightbox-image {
  max-width: 80%;
  max-height: 80%;
}
</style>

高级功能扩展

添加过渡动画

<transition name="fade">
  <div class="lightbox" v-if="lightboxVisible">
    <!-- 内容 -->
  </div>
</transition>

<style>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

键盘导航支持

mounted() {
  window.addEventListener('keydown', this.handleKeydown)
},
beforeDestroy() {
  window.removeEventListener('keydown', this.handleKeydown)
},
methods: {
  handleKeydown(e) {
    if (this.lightboxVisible) {
      if (e.key === 'ArrowLeft') this.prevImage()
      if (e.key === 'ArrowRight') this.nextImage()
      if (e.key === 'Escape') this.closeLightbox()
    }
  }
}

图片懒加载优化

使用vue-lazyload插件:

npm install vue-lazyload

实现代码:

vue实现画廊

import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
  preLoad: 1.3,
  loading: 'loading.gif',
  attempt: 1
})

// 模板中使用
<img v-lazy="img.thumbnail">

响应式设计建议

/* 响应式布局 */
.thumbnails {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 10px;
}

@media (max-width: 768px) {
  .thumbnails {
    grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  }
}

标签: 画廊vue
分享给朋友:

相关文章

vue 实现toast

vue 实现toast

vue 实现 toast 的方法 在 Vue 中实现 Toast 提示功能可以通过多种方式,以下是几种常见的实现方法: 使用第三方库 Vue 生态中有许多成熟的 Toast 库,例如 vue-toa…

vue实现sso

vue实现sso

Vue 实现 SSO(单点登录)方案 单点登录(SSO)允许用户通过一次登录访问多个相关系统。以下是基于 Vue 的实现方案: 使用 OAuth2/OpenID Connect 协议 OAuth2…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文档…

vue实现试卷

vue实现试卷

Vue实现试卷系统的基本思路 使用Vue.js构建试卷系统需要结合组件化开发、状态管理和后端数据交互。核心功能包括题目展示、答题逻辑、计时器和提交答案。 核心功能模块划分 试卷组件结构 试卷容器组…

vue实现画板

vue实现画板

Vue 实现画板功能 在 Vue 中实现画板功能可以通过 HTML5 的 Canvas API 实现。以下是一个完整的实现方案: 创建 Vue 组件 新建一个 Vue 单文件组件(SFC),命名为…