【精品】基于VUE3的 电商详情 图片显示模块

效果

在这里插入图片描述

组件

<template>
    <div class="goods-imgs">
        <div class="imgs-show">
            <img :src="mainImage" alt="大图" />
        </div>
        <ul class="img-thumbnail">
            <li v-for="(item, index) in imageList" :key="index" class="img-li" :style="imgStyle"
                @click="changeImg(item, index)">
                <img :class="index === imgActiveIndex ? 'img_activeBorder' : ''" :src="item" alt="小图" />
            </li>
        </ul>
    </div>
</template>
<script setup lang="ts">
import { ref, Ref, onBeforeMount, computed } from 'vue'

const props = defineProps({
    mainImage: String,
    imageList: Array
})

const mainImage = ref(props.mainImage)

const imageList: Ref<any> = ref(props.imageList)


const imgActiveIndex = ref(0) // 当前移动图片的索引值
const imgDistance = ref(0) // 移动的距离
const allDistance = ref(0) // 总移动距离

const changeImg = (item: string, index: number) => {
    mainImage.value = item
    imgActiveIndex.value = index
}

const imgLeft = () => {
    if (imgActiveIndex.value > 0) {
        imgActiveIndex.value-- // 索引值-1
        imageList.value.forEach((item: string, index: number) => {
            // 循环小图,通过判断索引值赋值给大图
            if (imgActiveIndex.value === index) {
                mainImage.value = item
            }
        })
    }
    if (imgActiveIndex.value >= 4) {
        var index1 = 0
        const temp = window.setInterval(() => {
            // 利用定时器实现图片左右移动的动画效果
            if (index1 < 33) {
                // 移动次数(33次)
                imgDistance.value += 2 // 每次向左移动的距离 (移动总距离为33*imgDistance)
                index1++
                return
            } else {
                window.clearInterval(temp) // 移动完清除定时器
            }
        }, 10)
    }
}
const imgRight = () => {
    if (imgActiveIndex.value < imageList.value.length - 1) {
        imgActiveIndex.value++
        imageList.value.forEach((item: string, index: number) => {
            if (imgActiveIndex.value === index) {
                mainImage.value = item
            }
        })
        if (imgActiveIndex.value >= 5) {
            allDistance.value = -66 * (imgActiveIndex.value - 4)
            var index2 = 0
            const temp = window.setInterval(() => {
                if (index2 < 33) {
                    imgDistance.value -= 2 // 每次向右移动的距离
                    index2++
                    return
                } else {
                    window.clearInterval(temp)
                }
            }, 10)
        }
    } else if (imgActiveIndex.value === imageList.value.length - 1) {
        // 到达最后一张图片,再点击跳转回第一张
        imgActiveIndex.value = 0
        mainImage.value = imageList.value[0]
        var index3 = 0
        const temp = window.setInterval(() => {
            // 利用定时器实现图片左右移动的动画效果
            if (index3 < Math.abs(allDistance.value / 2)) {
                // 取绝对值再除
                imgDistance.value += 2 // 每次向左移动的距离 (移动总距离为33*imgDistance)
                index3++
                return
            } else {
                window.clearInterval(temp) // 移动完清除定时器
            }
        }, 1)
    }
}

const imgStyle = computed(() => {
    return {
        transform: `translate3d(${imgDistance.value}px, 0, 0)`, // 计算移动的距离(x,y,z)
    }
})
</script>

<style scoped lang="less">
.goods-imgs {
    margin-top: 2px;
    width: 100%;
    height: 435px;

    .imgs-show {
        width: 100%;

        height: 350px;

        img {
            width: 100%;
            height: 100%;
        }
    }

    .img-thumbnail {
        margin-top: 8px;
        position: relative;
        display: flex;
        width: 100%;
        height: 85px;
        overflow: hidden;
        overflow-x: scroll;
        list-style: none;

        .img-li {
            float: left;
            margin: 0 8px;
            cursor: pointer;

            img {
                width: 100%;
                height: 100%;
            }

            .img_activeBorder {
                border: 3px solid #0dcc73;
            }
        }
    }
}
</style>

使用

<!-- 个人主页 -->
<template >
   <GoodsImage :mainImage="mainImage" :imageList="imageList"></GoodsImage>
</template>

<script setup lang="ts">
//自定义组件
import GoodsImage from '@/components/GoodsImage.vue'
import { ref} from 'vue'

const mainImage = ref(
    'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg'
)
const imageList = ref([
    'https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg',
    'https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg',
    'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
    'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
    'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
    'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
    'https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg',
    'https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg',
    'https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg',
    'https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg',
    'https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg',
])
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【安装】MongoDB7安装MongoSH命令

MongoDB Shell Download | MongoDB 下载之后 解压 配置环境变量即可 以前使用 mongo命令 改为 mongosh 官方说明 安装mongosh MongoDB 中文手册 | MongoD Manual | 中文操作手册 | MongoDB 最新版 (whaleal.com) 安装 mongosh — MongoDB Shell

Java smslib包开发

上一篇文章我详细介绍RXTXcomm的安装方法和简单代码,如果小伙伴涉及到需要使用手机短信模块完成短信收发需求的话,可以使用到smslib进行开发。 首先还是同样的,将整个smslib包源码导入项目,并且将它所需依赖一起进行导入 导入完成之后,我们就可以对smslib包进行二次开发了 下面…

江西南昌电气机械三维测量仪机械零件3d扫描-CASAIM中科广电

精密机械零部件是指机械设备中起到特定功能的零件&#xff0c;其制造精度要求非常高。这些零部件通常由金属、塑料或陶瓷等材料制成&#xff0c;常见的精密机械零部件包括齿轮、轴承、螺丝、活塞、阀门等。精密机械零部件的制造需要高精度的加工设备和工艺&#xff0c;以确保其…

Ubuntu20.04搭建OpenGL环境(glfw+glad)

Ubuntu20.04搭建OpenGL环境(glfwglad) Linux环境搭建 本文在VMware安装Ubuntu20.04桌面版的环境下搭建OpenGL&#xff0c;按照本文搭建完成后可以执行LearnOpenGL网站上的demo。 关于VMware可自行到VMware Workstation Pro | CN下载 关于Ubuntu20.04桌面版可自行到官网或In…

Docker-Consul

Docker-Consul 一、介绍1.什么是服务注册与发现2.什么是consul3.consul提供的一些关键特性&#xff1a; 二、consul 部署1.环境准备2.consul服务器3.查看集群信息4.通过 http api 获取集群信息 三、registrator服务器1.安装 Gliderlabs/Registrator2.测试服务发现功能是否正常3…

wps 画项目进度甘特图

效果如上 步骤一&#xff1a; 创建excel 表格 步骤二&#xff1a; 选中开始时间和结束时间两列数据&#xff0c;右键设置单元格格式 步骤三&#xff1a; 选择数值&#xff0c;点击确定&#xff0c;将日期转成数值。 步骤四&#xff1a;插入图表 选中任务&#xff0c;开始时间…

ssm+vue毕业论文管理系统源码和论文

ssmvue毕业论文管理系统053 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 高校规模越来越大&#xff0c;学生越来越多&#xff0c;每年都有大批的大学生完成学业。毕业之前&#xff0c;各大高校设立…

KiCad 已经打开 交错保存 错误

期望结果&#xff1a; 打开工程 .pro 文件后&#xff0c;双击工程文件列表中的的 原理图&#xff1a;*.kicad_sch 能够打开原理图。 实际结果&#xff1a; 打开工程 .pro 文件后&#xff0c;双击工程文件列表中的的 原理图&#xff0c;弹出错误提示框如下&#xff1a; 重现步…

Java | IDEA中Netty运行多个client的方法

想要运行多个client但出现这种提示&#xff1a; 解决方法 1、打开IDEA&#xff0c;右上角找到下图&#xff0c;并点击 2、勾选

msvcp120.dll文件缺失一键修复方法,靠谱的多种修复msvcp120.dll方案

msvcp120.dll文件的丢失&#xff0c;其实是比较常见的&#xff0c;msvcp120.dll是一个Microsoft Visual C Redistributable的关键文件&#xff0c;它包含了一些用于C编程的标准函数和类的定义。如果msvcp120.dll丢失了&#xff0c;那么你的一些与这个文件相关的程序是打不开的&…

在线设计APP ui的网站,分享这7款

在数字时代&#xff0c;用户界面&#xff08;UI&#xff09;设计变得非常重要&#xff0c;因为良好的UI设计可以改善用户体验&#xff0c;增强产品吸引力。随着科学技术的发展&#xff0c;越来越多的应用在线设计网站出现&#xff0c;为设计师和团队提供了一种新的创作方式。本…

AI 时代,程序员无需焦虑

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

腾讯云下一代CDN -- EdgeOne加速MinIO对象存储

省流 使用MinIO作为EdgeOne的源站。 背景介绍 项目中需要一个兼容S3协议的对象存储服务&#xff0c;腾讯云的COS虽然也兼容S3协议&#xff0c;但是也只是支持简单的上传下载&#xff0c;对于上传的时候同时打标签这种需求&#xff0c;就不兼容S3了。所以决定自建一个对象存储…

嵌入式学习之linux

今天&#xff0c;主要对linux文件操作原理进行了学习&#xff0c;主要学习的内容就是对linux文件操作原理进行理解。写的代码如下&#xff1a;

0基础学习VR全景平台篇 第89篇:智慧眼-安放热点

一、功能说明 安放热点&#xff0c;是智慧眼成员们正式进入城市化管理的第一步&#xff0c;即发现问题后以安放热点的形式进行标记&#xff0c;再由其他的角色成员对该热点内容作出如核实、处理、确认完结等操作&#xff08;具体流程根据项目实际情况而定&#xff09;。 二、…

【Git游戏】提交的技巧

修改历史的提交 rebase 通过git rebase -i 将要修改的提交提到最前端&#xff0c; 然后修改&#xff0c;再通过git commit --amend提交该记录&#xff0c;最后通过git rebase -i 在替换会原始的位置 &#xff08;该过程中有可能会产生rebase confict&#xff09; cherry-pick …

调查问卷平台哪家好?

在如今的数字化时代&#xff0c;问卷调查已成为企业和组织了解顾客需求、员工满意度以及市场趋势的重要工具。然而&#xff0c;在众多的在线调查工具中&#xff0c;为什么我们要选择Zoho Survey&#xff1f; 一、强大的功能和灵活的问卷设计 1、多种问卷题型&#xff1a; Zo…

Django(6)-django项目自动化测试

Django 应用的测试应该写在应用的 tests.py 文件里。测试系统会自动的在所有以 tests 开头的文件里寻找并执行测试代码。 我们的 polls 应用现在有一个小 bug 需要被修复&#xff1a;我们的要求是如果 Question 是在一天之内发布的&#xff0c; Question.was_published_recentl…

成集云 | 旺店通多包裹数据同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 随着品牌电商兴起&#xff0c;线上线下开始逐渐融为一体&#xff0c;成集云以旺店通ERP系统为例&#xff0c;通过成集云-旺店通连接器&#xff0c;将旺店通ERP系统多包裹数据同步至钉钉实现数据互通&#xff0c;帮助企业解决了电商发货存在的错…

【Unity3D赛车游戏】【四】在Unity中添加阿克曼转向,下压力,质心会让汽车更稳定

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…