【Uniapp】图片修复对比组件

效果图

在这里插入图片描述
不废话,直接上源码!

组件直接用

<template>
  <view
    class="img-comparison-container"
    :style="'width:' + width + 'rpx;height:' + height + 'rpx'"
  >
    <view class="before-image" :style="'width:' + x + 'rpx'">
      <view :style="'width:' + width + 'rpx;height:' + height + 'rpx'">
        <image
          :src="beforeImageUrl"
          class="images"
          mode="aspectFill"
          data-type="before"
          @tap="previewImage"
        />
      </view>
      <view v-if="beforeText" class="before-text">
        {{ beforeText }}
      </view>
    </view>
    <view class="after-image">
      <view :style="'width:' + width + 'rpx;height:' + height + 'rpx'">
        <image
          :src="afterImageUrl"
          class="images"
          mode="aspectFill"
          data-type="after"
          @tap="previewImage"
        />
      </view>
      <view v-if="afterText" class="after-text">
        {{ afterText }}
      </view>
    </view>
    <view
      class="slider-bar"
      :style="'left:' + x + 'rpx'"
      @touchmove="handleTouchMove"
      @touchstart="handleTouchStart"
      @touchend="handleTouchEnd"
    >
      <view class="slider-button"></view>
    </view>
  </view>
</template>

<script>
export default {
  props: {
    width: {
      type: String,
      default: "750",
    },
    height: {
      type: String,
      default: "850",
    },
    beforeImageUrl: {
      type: String,
    },
    afterImageUrl: {
      type: String,
    },
    beforeText: {
      type: String,
      default: "制作前",
    },
    afterText: {
      type: String,
      default: "制作后",
    },
  },

  data() {
    return {
      isPressDown: false, //鼠标是否正按住
      x: this.width / 2, //设置位置
    };
  },
  methods: {
    handleTouchStart(event) {
      this.isPressDown = true;
      this.startX = event.touches[0].clientX; // 记录触摸起始点
      this.sliderStartX = this.x; // 记录slider起始位置
    },
    handleTouchMove(event) {
      if (!this.isPressDown) {
        return;
      }
      const moveX = event.touches[0].clientX - this.startX; // 计算移动距离
      let newX = this.sliderStartX + moveX * 2; // 计算slider新位置
      // 限制 newX 在 0 和 this.width 之间
      newX = Math.max(0, Math.min(newX, this.width));
      this.x = newX; // 更新位置
    },
    handleTouchEnd() {
      this.isPressDown = false;
    },
    previewImage(e) {
	  const staticPrefix = "static";
	  const imageType = e.currentTarget.dataset.type;
	  const imageUrlMap = {
	    before: this.beforeImageUrl,
	    after: this.afterImageUrl,
	  };
	  // 如果当前图片URL中包含静态前缀,则直接返回
	  if (imageUrlMap[imageType].includes(staticPrefix)) {
	    return;
	  }
	  // 获取当前图片的URL,并使用uni.previewImage方法展示图片
	  const currentImageUrl = imageUrlMap[imageType];
	  uni.previewImage({
	    urls: [imageUrlMap.before, imageUrlMap.after],
	    current: currentImageUrl,
	  });
	}
  },
};
</script>

<style lang="scss" scoped>
.img-comparison-container {
  position: relative;
  display: inline-block;
  overflow: hidden;
  border-radius: 20rpx;

  .before-image {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    width: 50%;
    overflow: hidden;

    .before-text {
      position: absolute;
      left: 22rpx;
      top: 22rpx;
      color: #ffffff;
      background: rgba(34, 34, 34, 0.5);
      border-radius: 20rpx;
      padding: 5rpx 15rpx 5rpx 15rpx;
      font-size: 24rpx;
      white-space: nowrap;
    }
  }

  .after-image {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 0;

    .after-text {
      position: absolute;
      right: 22rpx;
      top: 22rpx;
      color: #ffffff;
      background: rgba(34, 34, 34, 0.5);
      border-radius: 20rpx;
      padding: 5rpx 15rpx 5rpx 15rpx;
      font-size: 24rpx;
      white-space: nowrap;
    }
  }

  .images {
    width: 100%;
    height: 100%;
  }

  .slider-bar {
    cursor: move;
    position: absolute;
    width: 4rpx;
    left: 50%;
    top: 0rpx;
    background: #ffffff;
    height: 100%;
    display: block;
    z-index: 2;
    box-shadow: 0 0 20rpx 1px rgba(0, 0, 0, 0.4);

    .slider-button {
      position: absolute;
      width: 60rpx;
      height: 60rpx;
      border-radius: 50%;
      border: 4rpx solid #ffffff;
      background-color: transparent;
      left: calc(50% - 30rpx);
      top: calc(50% - 30rpx);
    }

    &::before {
      content: "";
      padding: 6rpx;
      border: solid #ffffff;
      border-width: 0 4rpx 4rpx 0;
      position: absolute;
      top: calc(50% - 8rpx);
      left: calc(50% - 16rpx);
      transform: rotate(135deg);
      z-index: 1;
    }

    &::after {
      content: "";
      padding: 6rpx;
      border: solid #ffffff;
      border-width: 0 4rpx 4rpx 0;
      position: absolute;
      top: calc(50% - 8rpx);
      left: 50%;
      transform: rotate(-45deg);
    }
  }
}
</style>

使用方法

引入组件

import compareImage from "../components/index.vue";
<compare-image
  :beforeImageUrl="image.beforeImg"
  :afterImageUrl="image.afterImg"
  width="624"
  height="624"
  beforeText="修复前"
  afterText="修复后"
/>

在这里插入图片描述
感谢你的阅读,如对你有帮助请收藏+关注!
只分享干货实战精品从不啰嗦!!!
如某处不对请留言评论,欢迎指正~
博主可收徒、常玩QQ飞车,可一起来玩玩鸭~

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

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

相关文章

【MATLAB】fminsearchbnd()函数安装包下载

fminsearchbnd()函数 链接&#xff1a;https://pan.baidu.com/s/1apc6_f92rDnV_NwHpZZpDQ?pwdxul8 提取码&#xff1a;xul8 fminsearchbnd, fminsearchcon - File Exchange - MATLAB Central (mathworks.cn) 若链接失效&#xff0c;可以自行注册下载&#xff0c;操作也很简…

一键解锁!贸易行业实现银行与财务系统秒级对接,效率飙升!

客户介绍 某贸易有限公司是一家实力雄厚的工贸一体跨国集团企业。作为行业内的佼佼者&#xff0c;该公司以出口家纺产品和生产销售建材洁具为核心业务。公司始终坚持以市场为导向&#xff0c;不断创新和优化产品和服务&#xff0c;以满足不断变化的市场需求。 客户痛点 以往&…

文本三剑客-awk

一、awk的介绍 1.1awk的简介 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具 可以在无交互的模式下实现复杂的文本操作 相较于sed常作用于一整个行的处理&#xff0c;awk则比较倾向于一行当中分成数个字段来处理&#xff0c;因为awk相当适合小型的文本…

Winform自定义控件 —— 开关

在开始阅读本文之前&#xff0c;如果您有学习创建自定义控件库并在其他项目中引用的需求&#xff0c;请参考&#xff1a;在Visual Studio中创建自定义Winform控件库并在其他解决方案中引用https://blog.csdn.net/YMGogre/article/details/126508042 0、引言 由于 Winform 框架并…

C++ 程序员常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

推荐一款实用的便捷工具:windows输入法删除工具

这是一款输入法删除的工具&#xff0c;能够辅助个人来彻底的删除你电脑上面的输入法&#xff0c;以极为完整的方式来进行卸载&#xff0c;在你找不到卸载的方式之时这款软件极为的适用&#xff0c;能够帮助你面对这个场景&#xff0c;满足个人对于卸载上面的需求! 目录 一、下…

低功耗音频编解码器CJC8990

由工采网代理的CJC8990是一款低功耗音频编解码器&#xff0c;拥有先进的功能并提供高质量音频&#xff0c;非常适合于便携式数字音频应用&#xff0c;支持多种音频数据格式&#xff0c;包括I2S, DSP模式。 产品介绍&#xff1a; 该芯片工作电压&#xff1a;1.5V&#xff5e;3…

【EasyExcel】EasyExcel合并指定列单元格导出详解设置导出样式

【EasyExcel】EasyExcel合并指定列单元格导出&设置导出样式 需求分析 需求背景 许多报表需要对相同数据的单元格进行合并&#xff0c;以提高数据的可读性和美观性。例如&#xff0c;在销售报表中&#xff0c;将相同客户的订单合并在一起。同时&#xff0c;报表中的标题和内…

MySQL中order by排序时,数据存在null,排序在最前面

order by排序是最常用的功能&#xff0c;但是排序有时会遇到数据为空null的情况&#xff0c;这样排序就会乱了&#xff0c;这里以MySQL为例&#xff0c;记录我遇到的问题和解决思路。 sql 排序为 null 值问题&#xff1a; 排序时我们用 receive_date(一个统计的时间&#xff…

物业水电抄表系统的全面解析

1.系统概述 物业水电抄表系统是现代物业管理中的重要组成部分&#xff0c;它通过自动化的方式&#xff0c;实时监控和记录居民或企业的水电使用情况&#xff0c;极大地提高了工作效率&#xff0c;降低了人工抄表的错误率。该系统通常包括数据采集、数据传输、数据分析和数据展…

python创建新环境并安装pytorch

python创建新环境并安装pytorch 一、创建新环境1、准备工作2、创建虚拟环境并命名3、激活虚拟环境 二、安装pytorch1、pytorch官网2、选择与你的系统相对应的版本3、安装成功 一、创建新环境 1、准备工作 本次创建的环境是在anaconda环境下&#xff0c;否则需要在纯净环境下创…

centOS忘记密码的处理办法

1、开机后在出现内核选项时&#xff0c;按 e&#xff1b; 2、在Linux 开头的这行&#xff0c;输入 rd.break 如下图&#xff1b; 3、然后&#xff0c;执行&#xff1a;CtrlX&#xff1b; 4、进入之后是 switch_root:/#输入 mount -o rw,remount /sysroot 以读写方式重新挂载 /s…

初讲树,二叉数(搜索二叉树,实现的方法<链式,顺序>)

目录 1.树的概念及其结构 1.1树的概念 1.2树相关的概念 1.3树的表示 2.二叉树概念及其结构 2.1概念 2.2现实中的二叉树 2.3特殊的二叉树 2.4二叉树的性质 2.5二叉树存储结构 2.5.1链式存储 2.5.2顺序存储 3.搜索二叉树 1.树的概念及其结构 1.1树的概念 树是一种非…

从零入门激光SLAM(十六)——卡尔曼滤波基础

一、卡尔曼滤波简介KF 卡尔曼滤波器&#xff08;Kalman Filter&#xff09;是一种用于估计动态系统状态的递归算法。它通过结合系统的动态模型和噪声观测数据&#xff0c;提供对系统状态的最优估计。卡尔曼滤波器广泛应用于信号处理、控制系统、导航、计算机视觉等领域。 卡尔…

无人机超强教程!无人机图像拼接、航拍植被动态定量化研究、激光雷达地形测量与河网水系提取

查看原文>>>无人机生态环境监测、图像处理与GIS数据分析综合实践技术应用 目录 一、无人机航拍基本流程、航线规划与飞行实践 二、无人机图像拼接软件的学习与操作实践 三、无人机图像拼接典型案例详解 四、无人机图像拼接数据在GIS中的处理与分析 五、无人机图…

Leaflet【二】图层绘制——UI图层【点线面】 矢量图层【img、svg】

layer图层 在leaflet当中使用图层比OL当中简便一点&#xff0c;我们创建的layer图层可以直接通过 addTo 方法加到地图上&#xff0c;不需要通过layer、source再去做一些区分&#xff0c; 图标 Icon 创建Marker时提供的一个Icon 详细配置–>go // 导入一张图片作为图标imp…

python放烟花的代码

以下是一个简单的Python烟花大会的代码示例。这个代码使用Python的turtle模块来绘制烟花&#xff0c;并使用随机函数来生成烟花的路径和颜色。 python import turtle import random # 设置画布和画笔 canvas turtle.Screen() canvas.bgcolor("black") pen turtle.…

光伏电站设备数据采集

随着全球对可再生能源的关注度日益提升&#xff0c;光伏电站作为绿色能源的重要组成部分&#xff0c;其运营效率和稳定性显得尤为重要。在光伏电站的日常管理中&#xff0c;设备数据采集是一项至关重要的工作&#xff0c;它直接关系到电站的运行状态、故障预警以及能源产出的优…

人工智能创新领衔,Android系统如虎添翼:2024 Google I/O 大会深度解析

人工智能创新领衔&#xff0c;Android系统如虎添翼&#xff1a;2024 Google I/O 大会深度解析 2024年5月14日举行的Google I/O大会&#xff0c;犹如一场精彩的科技盛宴&#xff0c;吸引了全球的目光。大会上&#xff0c;谷歌发布了一系列重磅产品和技术更新&#xff0c;展现了…

揭秘!国产电路仿真软件新星闪耀,让电路设计更智能!

在数字化时代&#xff0c;电路设计与仿真软件的重要性日益凸显。随着科技的飞速发展&#xff0c;国产电路仿真软件也逐渐崭露头角&#xff0c;成为行业内的佼佼者。今天&#xff0c;我们就来揭秘这些国产电路仿真软件的新星&#xff0c;看看它们是如何让电路设计变得更加智能、…