【Uniapp】图片修复对比组件

news2024/11/15 19:27:49

效果图

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

组件直接用

<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飞车,可一起来玩玩鸭~

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

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

相关文章

两大DRAM巨头20%产能转给HBM

随着人工智能(AI)需求的激增&#xff0c;全球领先的内存芯片制造商三星(Samsung)和SK海力士(SK Hynix)预计&#xff0c;由于高性能芯片需求不断增长&#xff0c;今年DRAM和高带宽内存(HBM)的价格将保持强劲。据《韩国经济日报》报道&#xff0c;三星和SK海力士已将其超过20%的D…

实验12:综合实验

1、实验目的及要求&#xff1a; 通过本次实验完成一个小型网络中配置设备。实现配置一个路由器、两个交换机和两台PC&#xff0c;以支持IPv4和IPv6连接&#xff1b;路由器和交换机必须安全管理&#xff0c;配置VLAN间路由、DHCP、以太网通道和端口安全。通过登录思科网络技术学…

Beego 使用教程 6:Web 输入处理

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 bee…

⭐解读绍兴BSCI验厂攻略⭐

&#x1f308;解读&#x1f50d;绍兴BSCI验厂攻略&#x1f308; &#x1f60a;深入解读&#x1f449;绍兴BSCI验厂攻略&#x1f448;&#xff0c;助力企业&#x1f481;‍♂️顺利通过国际认证&#x1f990; &#x1f497;在全球化日益&#x1f9ed;加速的今天&#xff0c;&…

我的职场加速器-高效工作从可道云teamOS开始

不论是作为管理者&#xff0c;还是普通打工人&#xff0c;在日常工作中&#xff0c;我们都需要一款既能够保障数据安全&#xff0c;又能够提升团队协作效率的平台。 近期&#xff0c;我体验了可道云teamOS&#xff0c;这款企业级云协作平台给我留下了深刻的印象。 一、极简风…

Pytorch代码基础—张量

Pytorch代码—张量 Pytorch张量 张量的属性&#xff1a; data&#xff1a;被包装的Tensorgrad&#xff1a;data的梯度grad_fn:创建Tensor的Function&#xff0c;是自动求导的关键requires_grad&#xff1a;指示是否需要梯度isleaf&#xff1a;指示是否是叶子结点&#xff0…

SpringBoot应用

文章目录 第一章、SpringBoot基础内容一、Spring和SpringBoot1、Spring介绍2、SpringBoot介绍 二、SpringBoot2入门操作1、在线构建2、idea构建 三、浅谈自动装配的原理 第二章、SpringBoot核心功能一、配置文件1、配置文件介绍2、语法规则3、数据类型4、案例使用 二、WEB开发1…

JavaScript基础知识强化:变量提升、作用域逻辑及TDZ的全面解析

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 ⭐️ 引言&#x1f3af; 变量提升(Hoisting)&#x1f47b; 暂时性死区&#xff08;Temporal Dead Zone, TDZ&#xff09;解释&#x1f4e6; var声明&#x1f512; let与const声明&#x1f4d6; 函数声明 与 函数表达式函数声…

【案例教程】土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测

查看原文>>>土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测 土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译&#xff0c;可获取历史或当前任何一个区域的土地利用/土地覆盖数据&#xff0c;用于评估区域的生…

U盘制作PE后容量少了一半,如何恢复默认空间

格式化U盘 以前制作U盘PE后&#xff0c;从原本64G的容量变成了32G&#xff0c;一直也没去关注处理。 恰巧这两天又遇到U盘无法识别&#xff0c;数据无法读取&#xff0c;想着格式化恢复。 很遗憾&#xff0c;发现利用电脑快速格式化依然无法直接拿到空闲的另一半空间。 磁盘管…

[图解]SysML和EA建模住宅安全系统-03

1 00:00:00,490 --> 00:00:01,180 怎么加 2 00:00:01,570 --> 00:00:04,380 我们来看&#xff0c;这是刚才那个图 3 00:00:05,200 --> 00:00:06,390 17.7 4 00:00:07,150 --> 00:00:08,260 我们同样在这里加 5 00:00:08,430 --> 00:00:10,100 同样在这个下面…

超越人工智能:AnyTool,一款基于GPT-4的智能代理,引领API调用新纪元

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;探索 AnyTool 的创新应用 在人类文明的发展历程中&#xff0c;我们不断探索和创新&#xff0c;利用各种工具增强我们的能力并提高生产效率。…

Python 全栈系列243 S2S flask_celery

说明 按现有的几个架构部件&#xff0c;构建数据流。 S Redis Stream。这个可以作为缓冲队列和简单任务队列&#xff0c;速度非常快&#xff0c;至少是万条/秒的速度。 Q RabbitMQ。这个作为任务队列&#xff0c;消息也主要是元数据。读速比较慢&#xff0c;但有一些特性&a…

百元以内的蓝牙耳机哪个牌子好?2024四大高品质品牌推荐!

通常对于预算有限的消费者来说&#xff0c;如何在百元以内找到一款品质卓越、性能出色的蓝牙耳机&#xff0c;确实是一个值得深思的问题&#xff0c;为了满足广大消费者的需求&#xff0c;我特别筛选了2024年四大高品质蓝牙耳机品牌&#xff0c;它们在价格亲民的同时&#xff0…

ACWing471. 棋盘-DFS剪枝

题目 思路 本思路参考博客AcWing 471. 棋盘 - AcWing 约束方程&#xff1a; 代码 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N], n, m, dist[N][N]; int dx[4] {-1…

CSRF 攻击实验:更改请求方式绕过验证

前言 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;也称为XSRF&#xff0c;是一种安全漏洞&#xff0c;攻击者通过欺骗用户在受信任网站上执行非自愿的操作&#xff0c;以实现未经授权的请求。 CSRF攻击利用了网站对用户提交的请求缺乏充分验证和防范…

力扣【旋转函数】python

如果直接用暴力的话&#xff0c;只能过4个样例好像&#xff0c;超时 因此得用递推公式 F1F0前n-1个数-(n-1)*第n个数 F0sum(nums)-n*第n个数 nlen(nums) ans[]#定义一个存最大值值的列表 ss sum(nums) dm 0 for j in range(n):dm j * nums[j] ans.append(dm) print(dm) n…

基于EBAZ4205矿板的图像处理:05均值滤波算法

基于EBAZ4205矿板的图像处理&#xff1a;05均值滤波算法 项目全部文件已经上传&#xff0c;是免费的 先看效果 可以明显看到图像变糊了&#xff0c;这就是均值滤波的特点&#xff0c;将噪声均摊到每个点上的同时&#xff0c;也会让图像丢失细节。 算法讲解 均值滤波&#x…

【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)

目录 一&#xff1a;选择排序——原理 二&#xff1a;选择排序——分析 三&#xff1a;选择排序——实现 四&#xff1a;选择排序——优化 五&#xff1a;选择排序——效率 一&#xff1a;选择排序——原理 选择排序的原理&#xff1a;通过遍历数组&#xff0c;选出该数组…