创建图片对比slider滑块示例详解

目录
  • 引言
    • CSS
    • JavaScript
  • 定义 HTML 结构
  • 定义 CSS 样式
  • 实际代码

引言

在这篇文章, 我们会创建一个 slider 滑块来对比两张图片。

老样子,话不多说,先看效果。

CSS

.container {
  position: relative;
}
.resizer {
  background-color: #cbd5e0;
  cursor: ew-resize;
  height: 100%;
  left: 50%;
  position: absolute;
  top: 0;
  width: 2px;
}
.modified-image {
  background-position: top left;
  background-repeat: no-repeat;
  background-size: auto 100%;
  height: 100%;
  left: 0;
  position: absolute;
  top: 0;
  width: 50%;
  filter: grayscale(100%);
}

JavaScript

// Query the element
const resizer = document.getElementById('dragMe');
const leftSide = resizer.previousElementSibling;
const rightSide = resizer.nextElementSibling;
// The current position of mouse
let x = 0;
let y = 0;
let leftWidth = 0;
// Handle the mousedown event
// that's triggered when user drags the resizer
const mouseDownHandler = function (e) {
  // Get the current mouse position
  x = e.clientX;
  y = e.clientY;
  leftWidth = leftSide.getBoundingClientRect().width;
  // Attach the listeners to `document`
  document.addEventListener('mousemove', mouseMoveHandler);
  document.addEventListener('mouseup', mouseUpHandler);
};
const mouseMoveHandler = function (e) {
  // How far the mouse has been moved
  const dx = e.clientX - x;
  const dy = e.clientY - y;
  let newLeftWidth =
    ((leftWidth + dx) * 100) / resizer.parentNode.getBoundingClientRect().width;
  newLeftWidth = Math.max(newLeftWidth, 0);
  newLeftWidth = Math.min(newLeftWidth, 100);
  leftSide.style.width = `${newLeftWidth}%`;
  resizer.style.left = `${newLeftWidth}%`;
  resizer.style.cursor = 'col-resize';
  resizer.parentNode.style.cursor = 'col-resize';
  leftSide.style.userSelect = 'none';
  leftSide.style.pointerEvents = 'none';
  rightSide.style.userSelect = 'none';
  rightSide.style.pointerEvents = 'none';
};
const mouseUpHandler = function () {
  resizer.style.removeProperty('cursor');
  resizer.parentNode.style.removeProperty('cursor');
  leftSide.style.removeProperty('user-select');
  leftSide.style.removeProperty('pointer-events');
  rightSide.style.removeProperty('user-select');
  rightSide.style.removeProperty('pointer-events');
  // Remove the handlers of `mousemove` and `mouseup`
  document.removeEventListener('mousemove', mouseMoveHandler);
  document.removeEventListener('mouseup', mouseUpHandler);
};
// Attach the handler
resizer.addEventListener('mousedown', mouseDownHandler);

通过上面的示例可以看到,拖动中间的 slider 滑块,可以很清楚的看到图片的对比效果。

下面我们就来看看是如何实现的。

定义 HTML 结构

<div class="container">
  <!-- 修改后的图 -->
  <div class="modified-image"></div>
  <!-- slider 滑块 -->
  <div class="resizer" id="dragMe"></div>
  <!-- 原图 -->
  <img
    src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/361d53f154ec41668a661d1d927f0c2e~tplv-k3u1fbpfcp-watermark.image?"
  />
</div>

修改后的图放在底部,滑块在中间,原图在最上层。

定义 CSS 样式

.container {
  position: relative;
}
.modified-image {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 50%;
}

修改后的元素初始默认占据 50% 的宽度。

我们不使用 img 元素来显示修改后的图片,而是使用背景图方式显示,因为图片可以进行缩放。

<div
  class="modified-image"
  style="background-image: url('https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/361d53f154ec41668a661d1d927f0c2e~tplv-k3u1fbpfcp-watermark.image?')"
></div>

因为使用背景图,所以修改后的图片元素需要设置更多样式,以达到最佳的显示效果。

.modified-image {
  background-position: top left;
  background-repeat: no-repeat;
  background-size: auto 100%;
  /* ... */
}

为了达到对比的效果,我们还要给修改后的图片添加一层滤镜效果。

.modified-image {
  filter: grayscale(100%);
  /* ... */
}

接下来设置 .resizer 元素的样式,相对而言要简单很多,只需要将它设置到中心位置即可。

.resizer {
  position: absolute;
  left: 50%;
  top: 0;
  height: 100%;
  width: 2px;
  background-color: #cbd5e0;
  cursor: ew-resize;
}

使用 position 属性将它定为到中间,注意将鼠标的展现形式更换为 cursor: ew-resize

HTML 结构和 CSS 样式就差不多了,接下来处理 JavaScript 事件相关内容。

当我们移动 .resizer 元素时,需要事实计算鼠标移动了多远的距离。然后根据当前鼠标的位置,修改 .resizer 元素的位置,以及修改后图片的大小。

如何拖动一个元素其实很简单,还不是很清楚的同学可以去看看我之前的文章 《如何实现一个自定义的 range slider?元素拖动其实很简单》。

接下来来看看

实际代码

const resizer = document.getElementById('dragMe');
// 上一个兄弟元素,也就是修改后的图片元素
const leftSide = resizer.previousElementSibling;
// 记录当前鼠标的位置
let x = 0;
let y = 0;
// 记录修改后图片的宽度
let leftWidth = 0;
// 点击 resizer 元素时触发 mousedown 事件
const mouseDownHandler = function (e) {
  // 获取当前鼠标位置
  x = e.clientX;
  y = e.clientY;
  leftWidth = leftSide.getBoundingClientRect().width;
  // 在 document 元素上添加事件
  document.addEventListener('mousemove', mouseMoveHandler);
  document.addEventListener('mouseup', mouseUpHandler);
};
const mouseMoveHandler = function (e) {
  // 计算鼠标移动距离
  const dx = e.clientX - x;
  const dy = e.clientY - y;
  let newLeftWidth =
    ((leftWidth + dx) * 100) / resizer.parentNode.getBoundingClientRect().width;
  newLeftWidth = Math.max(newLeftWidth, 0);
  newLeftWidth = Math.min(newLeftWidth, 100);
  // 设置修改后的图片元素的宽度
  leftSide.style.width = `${newLeftWidth}%`;
  resizer.style.left = `${newLeftWidth}%`;
};
// 给 resizer 元素添加事件
resizer.addEventListener('mousedown', mouseDownHandler);

代码有点长,需要你花点时间仔细看看才能理解。

最后还有一个需要注意的点,我们要保证鼠标滑块不会滑出可视范围,所以需要限制其最大值和最小值。

因为修改后的图片元素的宽度值时百分比类型,所以最小值为 0,最大值为 100。

const mouseMoveHandler = function (e) {
  // ...
  newLeftWidth = Math.max(newLeftWidth, 0);
  newLeftWidth = Math.min(newLeftWidth, 100);
};

以上就是创建图片对比slider滑块示例详解的详细内容,更多关于图片对比slider滑块的资料请关注我们其它相关文章!

(0)

相关推荐

  • Element中Slider滑块的具体使用

    组件-滑块 基础用法 <template> <div class="block"> <span class="demonstration">默认</span> <el-slider v-model="value1"></el-slider> </div> <div class="block"> <span class=&quo

  • python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例

    PyQt5滑块条控件QSlider介绍 QSlider控件提供一个垂直或者水平的滑动条,滑动条是一个用于控制有界值典型的控件,它允许用户沿水平或者垂直方向在某一范围内移动滑块,并将滑块所在的位置转换为一个合法范围内的整数值,有时候这中方式比输入数字或者使用SpinBox(计数器·)更加自然,在槽函数中对滑块所在位置的处理相当于从整数之间的最小值和最高值进行取值 一个滑块条控件可以以垂直或者水平的方式显示,在构造函数中进行设置 self.sp=QSlider(Qt.Horizontal) self

  • Java Swing JSlider滑块的实现示例

    1. 概述 官方JavaDocsApi: javax.swing.JSlider JSlider,滑块. 以图形方式在有界区间内通过移动滑块来选择值的组件. 滑块可以显示主刻度标记以及主刻度之间的次刻度标记.刻度标记之间的值的个数由 setMajorTickSpacing(int) 和 setMinorTickSpacing(int) 来控制.刻度标记的绘制由 setPaintTicks(boolean) 控制. 滑块也可以在固定时间间隔(或在任意位置)沿滑块刻度打印文本标签.标签的绘制由 se

  • jQuery插件slider实现拖动滑块选取价格范围

    在一些产品报价网站上,需要给出一系列价格范围供用户筛选,我们在筛选的范围之外再加一个自定义价格范围,这样为用户多提供了一种选择方式.本文将使用jQuery插件结合CSS实现使用滑块滑动的方式选择价格范围,请看本文讲解. jQuery ui 有个slider插件,就是一个非常好使的拖动滑块插件.要想实现滑块拖动,需要在页面head间先载入如下js. <script type="text/javascript" src="js/jquery.js"><

  • 创建图片对比slider滑块示例详解

    目录 引言 CSS JavaScript 定义 HTML 结构 定义 CSS 样式 实际代码 引言 在这篇文章, 我们会创建一个 slider 滑块来对比两张图片. 老样子,话不多说,先看效果. CSS .container { position: relative; } .resizer { background-color: #cbd5e0; cursor: ew-resize; height: 100%; left: 50%; position: absolute; top: 0; wid

  • xxl-job对比ElasticJob使用示例详解

    目录 1. xxl-job 2. 运行 xxl-job 3. 开发定时任务 3.1 项目创建及配置 3.2 定时任务开发方式 3.2.1 BEAN 模式(类形式) 3.2.2 BEAN模式(方法形式) 3.2.3 GLUE 模式(Java) 4. 小结 1. xxl-job 松哥也在微信群里和小伙伴们讨论过各自到底用的是 xxl-job 还是 ElasticJob,讨论的结果就是,xxl-job 使用的人更多一些. 不说功能的优劣,我们单纯从数据上其实就能看出一些端倪: 这是 xxl-job 的

  • Java实现图片裁剪功能的示例详解

    目录 前言 Maven依赖 代码 验证一下 前言 本文提供将图片按照自定义尺寸进行裁剪的Java工具类,一如既往的实用主义. Maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1.1-jre</version> </dependency> <dependen

  • python机器学习创建基于规则聊天机器人过程示例详解

    目录 聊天机器人 基于规则的聊天机器人 创建语料库 创建一个聊天机器人 总结 还记得这个价值一个亿的AI核心代码? while True: AI = input('我:') print(AI.replace("吗", " ").replace('?','!').replace('?','!')) 以上这段代码就是我们今天的主题,基于规则的聊天机器人 聊天机器人 聊天机器人本身是一种机器或软件,它通过文本或句子模仿人类交互. 简而言之,可以使用类似于与人类对话的软件进

  • Python实现为图片添加水印的示例详解

    目录 1.引言 2.filestools介绍 2.1 安装 2.2 filestools 功能介绍 2.3 watermarker模块介绍 2.4 代码实例 补充 1.引言 小屌丝:鱼哥,这个周末过得咋样 小鱼:酸爽~ ~ 小屌丝:额~~ 我能想到的,是这样吗? 小鱼:有多远你走多远. 小屌丝:唉,鱼哥,你别说,我觉得这个图片,跟你平时的表情挺贴切的. 小鱼:你想咋的!!!! 小屌丝:突然想到,能不能给你来一个专属的图片,例如追加水印啥的,让别人无图可盗!! 小鱼:嘿~ 你别说,还真的可以哈,

  • Java实现图片合成的示例详解

    目录 场景 环境 搭建 引入pom文件 定义核心接口ImageService 定义核心接口实现类ImageServiceImpl 测试ImageController 测试效果 总结 场景 前端有一个神器——canvas,这个画布标签可以处理各种图片的合成,可以精确到图片的具体坐标,加水印,去水印,简直不要太简单!那java后端可以处理吗?请大声的告诉他,能,必须能!今天小编告诉你一个神器——image-combiner,合成图片so easy! 环境 jdk1.8 spring boot 搭建

  • java zxing合成复杂二维码图片示例详解

    目录 说明: 整体思路: 图片合成四部曲 踩过的坑 说明: 最近接到需要将二维码合成复杂图片的需求,要求给二维码上下或者左侧添加相关文字描述,技术没有难点,整理本文主要记录思路和踩过的坑. 整体思路: 引入zxing成熟的二维码生成接口,生成标准二维码文件,通过java图形图像处理API为二维码添加相关文字描述,根据需要,可以为合成后的图片添加相关背景.示例如下图所示: 1.先拿点位图来说,生成二维码图片核心代码如下 /** * 定义二维码的参数 */ HashMap<EncodeHintTyp

  • Python Flask实现图片上传与下载的示例详解

    目录 1.效果预览 2.新增逻辑概览 3.tuchuang.py 逻辑介绍 3.1 图片上传 3.2 图片合法检查 3.3 图片下载 4.__init__.py 逻辑介绍 5.upload.html 介绍 5.1 upload Jinja 模板介绍 5.2 upload css 介绍(虚线框) 5.3 upload js 介绍(拖拽) 1.效果预览 我们基于 Flask 官方指导工程,增加一个图片拖拽上传功能,效果如下: 2.新增逻辑概览 我们在官方指导工程上进行增加代码,改动如下: 由于 fl

  • C#实现给图片添加日期信息的示例详解

    实践过程 效果 代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string flag = null; PropertyItem[] pi; string TakePicDateTime; int SpaceLocation; string pdt; string ptm; Bitmap Pic; Graphics g; Thread td; private void

  • flutter中的资源和图片加载示例详解

    目录 封面图 指定相应的资源 资源绑定 Asset bundling 资源变体 加载资源 加载文本资源 加载图片 加载依赖包中的图片 最后 封面图 下个季度的目标是把前端监控相关的内容梳理出来,梳理出来之后可能会在公司内部做个分享- Flutter应用程序既括代码也包括一些其他的资产,我们通常这些资产为资源. 有时候我会思考assets这个单词,在程序中到底应该翻译为资产呢?还是翻译为资源?按照习惯,我们这里还是称为资源好了- 这些资源是一些与应用程序捆绑在一起和并且部署应用时会用到的的文件,在

随机推荐