VUE3实现两张图片滑动对比效果实现

news2024/12/25 9:40:19

封装组件

<template>
    <div id="bottomImg" class="bottomImg" :style="{ height: imgHeigth, width: imgWidth, backgroundImage: 'url(' + props.bottomImg + ')' }">
        <span class="imgLabel">{{ props.bottomLabel }}</span>
        <div v-if="props.upperImg" class="upperImg" :style="{ backgroundImage: 'url(' + props.upperImg + ')', width: 100 - upperImgWidth + '%' }">
            <span class="imgLabel">{{ props.upperLabel }}</span>
        </div>
        <div v-else class="upperUndefined" :style="{ width: 100 - upperImgWidth + '%' }">
            <span class="undefinedSpan">暂无结果</span>
        </div>
        <span class="spanHandle" :style="{ left: 'calc(' + upperImgWidth + '% - 24px)' }"></span>
        <input class="inputRange" type="range" v-model="upperImgWidth" min="0" max="100" />
    </div>
</template>
<script lang="ts" setup>
import { ref, watch, onMounted } from 'vue'
const imgHeigth = ref('100%')
const imgWidth = ref('100%')
const upperImgWidth = ref(50)
const props = defineProps({
  bottomImg: {
    type: String,
    default: '',
  },
  upperImg: {
    type: String,
    default: '',
  },
  bottomLabel: {
    type: String,
    default: '原图',
  },
  upperLabel: {
    type: String,
    default: '效果图',
  },
})
// 跟踪底层图片的变化,因为底层图片是基础
watch(
  () => props.bottomImg,
  () => {
    getImgSize()
    upperImgWidth.value = 50
  }
)
// 首次加载时初始化
onMounted(() => {
  getImgSize()
})
function getImgSize () {
  // 加载图片获取图片真实宽度和高度
  const image = new Image()
  image.onload = function () {
    // imgHeigth.value = image.height + '100px'
    imgWidth.value = image.width + 'px'
  }
  // image.onload = function () {
  //   imgHeigth.value = image.height + 'px'
  //   imgWidth.value = image.width + 'px'
  // }
  image.src = props.bottomImg // img.src 应该是放在 onload 方法后边的, 因为当image的src发生改变,浏览器就会跑去加载这个src里的资源,先告诉浏览器图片加载完要怎么处理,再让它去加载图片
}
</script>
<style>
    .bottomImg {
        position: relative;
        overflow: hidden;
        background-size: 100%;
        background-repeat: no-repeat;
    }
    .upperImg {
        position: absolute;
        top: 0;
        right: 0;
        z-index: 1;
        height: 650px;
        background-position: right top;
        border-left: 2px solid rgb(255, 255, 255, 0.5);
        background-size: 100%;
        background-repeat: no-repeat;
    }
    .imgLabel {
        font-size: 20px;
        color: aliceblue;
        text-shadow: 1px 1px #533d4a, 2px 2px #533d4a;
    }
    .upperUndefined {
        position: absolute;
        top: 0;
        right: 0;
        height: 100%;
        z-index: 1;
        font-size: 60px;
        background-color: rgb(255, 255, 255, 0.8);
        background-position: right top;
        border-left: 2px solid rgb(255, 255, 255, 0.5);
    }
    .undefinedSpan {
        display: flex;
        width: 100%;
        height: 100%;
        align-items: center;
        justify-content: center;
        color: #999;
        overflow: hidden;
    }
    .inputRange {
        position: absolute;
        height: 100%;
        z-index: 3;
        left: -4px;
        touch-action: auto;
        width: calc(100% + 4px);
        opacity: 0;
    }
    .spanHandle {
        position: absolute;
        z-index: 2;
        height: 48px;
        width: 48px;
        position: center;
        font-size: 24px;
        border: 1px;
        border-radius: 50%;
        top: calc(50% - 24px);
        background-color: rgb(255, 255, 255, 0.5);
    }

    .spanHandle:before {
        left: 5px;
        transform: rotate(-45deg);
    }
    .spanHandle:after {
        right: -5px;
        transform: rotate(135deg);
    }
    .spanHandle:after,
    .spanHandle:before {
        border-left: 2px solid;
        border-top: 2px solid;
        content: "";
        height: 10px;
        position: absolute;
        top: 50%;
        transform-origin: 0 0;
        width: 10px;
    }
</style>

引入所需的页面

 

最后根据自己需要的结果调整样式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dify v0.6.14源码部署

一.前置条件 1.安装和配置poetry 通过Windows PowerShell安装poetry&#xff1a; (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -关于poetry相关配置参考文献[1]。 2.下载dify和启动中间件容器 克隆Dify v0.6.14代码&am…

Ubuntu/Kali简洁高效安装最新版的docker-compose

基于docker已安装的情况下&#xff0c;通过执行一下代码完成docker-compose的安装 sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep \"tag_name\": | sed …

Unity不用脚本实现点击按钮让另外一个物体隐藏

1.首先在场景中创建一个按钮和一个其他随便什么东西 2.点击按钮中的这个加号 3.然后将刚刚你创建的物体拖到这里来 4.然后依次点击下面这些给按钮绑定事件 5.运行游戏并点击按钮&#xff0c;就会发现拖进来的物体消失了 总结&#xff1a;如果按钮的功能单一&#xff0c;可以使用…

数据结构之线性表表示集合详解与示例(C,C#,C++)

文章目录 基本特征线性表的特点&#xff1a;线性表的表示方法&#xff1a;C、C#和C语言如何实现一个线性表表示集合1. C实现2. C#实现3. C实现 总结 线性表是计算机数据结构中的一个基本概念&#xff0c;它是一种最简单的抽象数据类型。在线性表中&#xff0c;数据元素之间的关…

相对定位语法:css+xpath基础语法使用-定位页面元素

文章目录 CSS相对定位获取元素关系定位顺序关系 XPath相对定位基础语法顺序关系-通过索引获取元素选取元素 总结 ✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来&#xff01; 编程真是一件很奇妙的东西。你只是浅尝辄止&#xff0c;那么只会觉得枯燥乏味&#xff0c…

图片压缩python

linux粘贴文本格式错乱&#xff1a; vi/vim :set paste然后再 insert &#xff0c;粘贴 centos安装pillow图像处理库&#xff1a; 引用&#xff1a;https://blog.csdn.net/newbieLCQ/article/details/125345335 linux赋予执行权限&#xff1a; # 创建文件 touch comperss.p…

docker快速安装(环境CentOS7)

1. 查看自己的Linux系统 cat /etc/redhat-release 2. 安装依赖插件 yum -y install gcc yum -y install gcc-c yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum -y insta…

uniapp开发钉钉小程序流程

下载开发工具 1、小程序开发工具 登录钉钉开发平台&#xff0c;根据自己的需求下载合适的版本&#xff0c;我这里下载的是Windows &#xff08;64位&#xff09;版本 小程序开发工具 - 钉钉开放平台 2、HBuilder X HBuilderX-高效极客技巧 新建项目及相关配置 新建项目 …

图示 JVM 可达性分析算法

可达性分析算法&#xff1a; 以 GC Roots 为起始点进行搜索&#xff0c;可达的对象都是存活的&#xff0c;不可达的对象可被回收。 Java 虚拟机使用该算法来判断对象是否可被回收&#xff0c;GC Roots 一般包含以下内容&#xff1a; 虚拟机栈中局部变量表中引用的对象本地方法栈…

LabVIEW机器学习实现外观检测

介绍如何利用LabVIEW平台结合机器学习技术实现对被测样品的外观检测。详细说明了硬件选择、算法使用、操作步骤以及注意事项。 硬件选择 工业相机&#xff1a;高分辨率工业相机&#xff08;如Basler、FLIR等&#xff09;用于采集样品的图像。 照明设备&#xff1a;均匀的LED照…

30.【C语言】详解printf

1.printf&#xff08;print formate&#xff09;输入函数 01.简单使用 调用前要引用头文件 #include <stdio.h> printf("abc"); 默认情况下打印完光标停留在同一行 \n可以换行 printf("abc\n"); ​ printf("ab\nc"); ​ printf(…

RocketMQ 如何保证全链路消息不丢失?

目录 1. RocketMQ 消息丢失的原因有哪些 2. 如何保证 RocketMQ 全链路消息不丢失 2.1 保证生产者发送消息到 MQ&#xff0c;消息不丢失 2.2 保证消息写入 Broker 后不丢失 2.3 保证 Broker 集群时&#xff0c;消息不丢失 2.4 保证消费者消费消息不丢失 3. 如果整个 MQ 服…

学习测试9-接口测试 3-jmeter

jmeter启动 测试计划 1 创建线程组 2 创建http请求 数据类型 from表单数据可以通过剪切板直接粘贴 JSON数据需要从括号开始复制 3 查看结果树 4 http cookie管理器&#xff0c;可以记住登录状态 内部不用设置 5 断言 系统返回的信息进行判断 系统返回“新增会议信息成功” …

SerDes系列之如何选择AC耦合电容

交流耦合电容用于隔离PCB互连时的直流分量&#xff08;Common-mode voltage&#xff09;&#xff0c;同时传递交流分量&#xff08;Voltage swing&#xff09;&#xff0c;其作用类似于一个高通滤波器。 但是&#xff0c;如果电容容值选取不当&#xff0c;使用过程中会产生信号…

Linux中的环境变量

一、基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可以链接成功&#xff…

Guava LocalCache源码分析:LocalCache的get、put、expand、refresh、remove、clear、cleanUp

Guava LocalCache源码分析&#xff1a;LocalCache的get、put、expand 前言一、get二、put三、expand 前言 上篇文章&#xff0c;详细描写了Guava LocalCache怎样如ConcurrentHashMap对缓存数据进行了分段存储。本章主要针对LocalCache重要的几个接口进行说明。 一、get CanIg…

[笔记]Fluke3563 振动分析仪

参考文档&#xff1a;Fluke 3563 Analysis Vibration Sensor system | Fluke 1.四大机械故障损伤原因 2.振动特征 福禄克做的示意图很棒&#xff1a; 不平衡对应转动轴的一倍频&#xff0c;不对中是2倍频&#xff0c;然后3~6倍频会有未紧固故障&#xff0c;更高频的位置是齿轮…

怎么压缩视频文件?简单的压缩视频方法分享

视频已成为我们日常生活中不可或缺的一部分。但随着视频质量的提高&#xff0c;文件大小也逐渐成为我们分享的阻碍。如何有效压缩视频文件&#xff0c;使其既能保持清晰&#xff0c;又能轻松分享&#xff1f;今天&#xff0c;给大家分享五种实用的视频压缩方法&#xff0c;快来…

ubuntu上模拟串口通信

前言 有时候写了一些串口相关的程序&#xff0c;需要调试的时候&#xff0c;又没有硬件&#xff0c;或者需要等其他模块完成才能一起联调。这样搭建环境费时费力&#xff0c;很多问题等到最后联调才发现就已经很晚了。 本文提供一种在ubuntu环境下模拟串口&#xff0c;直接就可…

性价比高的宠物空气净化器什么牌子好?热门养宠空气净化器分享

作为一名有6年经验的铲屎官&#xff0c;许多新手铲屎官可能听说过宠物空气净化器&#xff0c;但了解不多。实际上&#xff0c;宠物空气净化器是养猫家庭必备的小家电之一。它的大面积进风口能有效吸附空气中的浮毛和皮屑&#xff0c;专门的除臭技术可以去除猫咪带来的异味。宠物…