圖像滑塊對比功能的開發記錄

背景介紹

最近,公司需要開發一款在線圖像壓縮工具,其中的一個關鍵功能是讓用戶直觀地比較壓縮前后的圖像效果。因此,我們設計了一個對比組件,它允許用戶通過拖動滑塊,動態調整兩張圖像的顯示區域,從而清晰地看到壓縮前后的差異。

目標效果

  • 兩張圖片堆疊放置,一張始終可見,另一張可調整可見范圍。
  • 通過滑塊拖動,控制上層圖片的顯示區域。
  • 適配 PC 和移動端,提供流暢的交互體驗。

效果如圖:

開發思路

結構設計

  1. 創建一個外層容器,用于包裹兩張圖片和滑塊。
  2. 底層圖片(原始圖像)始終可見。
  3. 頂層圖片(優化后圖像)放置在上方,并使用 clip-path 控制其顯示范圍。
  4. 滑塊(拖動條) 用于調整頂層圖片的可見區域。
<div class="image-change-block"><div class="desc-container"><div class="before-desc">BEFORE (827 KB)</div><div class="after-desc">AFTER (94 KB)</div></div><img src="after.jpg" class="new-img" /><div class="clip-container"><img src="before.jpg" class="old-img" /></div><div class="handle-container"><div class="bar-btn" id="barBtn"></div><div class="bar-line" id="barLine"></div></div>
</div>

樣式布局

  • 兩張圖片:底層圖片 position: absolute; 覆蓋整個容器,頂層圖片使用 clip-path 或 width 控制顯示區域。
  • 滑塊樣式:自定義 div + 偽元素 作為滑塊,并放在 absolute 位置。
.image-change-block {position: relative;max-width: 44rem;overflow: hidden;border-radius: 1.25rem;
}.desc-container {top: 1.25rem;position: absolute;display: flex;align-items: center;justify-content: space-between;flex-wrap: wrap;width: 100%;padding: 0 1.25rem;gap: 0.3125rem;
}.after-desc,
.before-desc {background-color: #000000;opacity: 0.6;color: #fff;border-radius: 0.25rem;z-index: 10;font-size: var(--global--font-size-sm);padding: 0.3125rem 1.5rem;
}.old-img,
.new-img {width: 100%;height: 100%;object-fit: cover;display: block;
}.clip-container {position: absolute;top: 0;left: 0;width: 100%;height: 100%;overflow: hidden;
}.old-img {position: absolute;top: 0;left: 0;width: 100%;height: 100%;clip-path: inset(0 50% 0 0);transition: clip-path 0.01s ease;
}.handle-container {position: absolute;top: 0;left: 0;height: 100%;width: 100%;pointer-events: none;
}.bar-btn {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 2rem;height: 2rem;border-radius: 50%;pointer-events: all;cursor: ew-resize;z-index: 2;
}.bar-line {position: absolute;top: 0;left: 50%;height: 100%;width: 3px;background-color: var(--theme-green-color);z-index: 1;
}.bar-btn::before {width: 28px;height: 28px;content: "";cursor: ew-resize;background: #00d4c9;position: absolute;left: 50%;top: 50%;transform: translate(-45%, -50%);display: block;border-radius: 50%;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);z-index: 1;
}.bar-btn::after {content: "";background: var(--theme-green-color);width: 3px;height: 100%;position: absolute;left: 50%;top: 0;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

交互邏輯

封裝一個兼容 PC 和移動端的拖拽對比函數,通過傳入對應的 dom 實現鼠標或手指拖動滑塊時圖像的對比。

initClip({barBtn: document.querySelector(`.bar-btn`),barLine: document.querySelector(`.bar-line`),clipContainer: document.querySelector(`.clip-container`),oldImg: document.querySelector(`.old-img`),
});/*** 初始化通過剪裁實現圖像對比的功能* @param {Object} doms - 包含所需DOM元素的對象*  - barBtn: 滑動按鈕元素*  - barLine: 滑動線條元素*  - clipContainer: 剪裁容器元素*  - oldImg: 被剪裁的圖片元素*/
function initClip(doms) {// 解構賦值獲取所需的DOM元素const { barBtn, barLine, clipContainer, oldImg } = doms;// 定義變量以跟蹤鼠標或觸摸是否在拖動let isDragging = false;let isMDragging = false;/*** 更新圖片剪裁位置* @param {number} x - 鼠標或觸摸在剪裁容器上的x坐標*/function updateImageClip(x) {// 計算剪裁容器的寬度const containerWidth = clipContainer.offsetWidth;// 計算并限制剪裁的百分比const percent = Math.min(Math.max(x / containerWidth, 0), 1);// 更新圖片的剪裁路徑oldImg.style.clipPath = `inset(0 ${100 - percent * 100}% 0 0)`;// 更新滑動按鈕和線條的位置barBtn.style.left = `${percent * 100}%`;barLine.style.left = `${percent * 100}%`;}// 添加鼠標按下事件監聽器到滑動按鈕barBtn.addEventListener("mousedown", (e) => {// 開始拖動并阻止默認行為isDragging = true;e.preventDefault();});// 添加鼠標抬起事件監聽器到文檔document.addEventListener("mouseup", () => {// 結束拖動isDragging = false;});// 添加鼠標移動事件監聽器到文檔document.addEventListener("mousemove", (e) => {// 如果正在拖動,則更新圖片剪裁if (isDragging) {const x = e.clientX - clipContainer.getBoundingClientRect().left;updateImageClip(x);}});// 添加點擊事件監聽器到剪裁容器clipContainer.addEventListener("click", (e) => {// 點擊時更新圖片剪裁const x = e.clientX - clipContainer.getBoundingClientRect().left;updateImageClip(x);});// 添加觸摸開始事件監聽器到滑動按鈕barBtn.addEventListener("touchstart", (e) => {// 開始拖動并阻止默認行為isMDragging = true;e.preventDefault();});// 添加觸摸結束事件監聽器到文檔document.addEventListener("touchend", () => {// 結束拖動isMDragging = false;});// 添加觸摸移動事件監聽器到文檔document.addEventListener("touchmove", (e) => {// 如果正在拖動,則更新圖片剪裁if (isMDragging) {const touch = e.touches[0];const x = touch.clientX - clipContainer.getBoundingClientRect().left;updateImageClip(x);}});
}

總結

這個滑塊對比組件利用 clip-path 來裁剪圖像,并結合鼠標和觸摸事件監聽,實現了流暢的交互體驗。它不僅適用于圖像壓縮前后的對比,還可以擴展到濾鏡效果、照片修復等其他圖像對比場景。在實際開發中,我們可以根據 UI 需求,進一步優化滑塊的樣式、動畫效果,以及提升移動端的操作體驗。

原文鏈接

圖像滑塊對比功能的開發記錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71872.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71872.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71872.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tcc編譯器教程2 編譯lua解釋器

本文主要介紹了使用tcc編譯器編譯lua解釋器源碼。 1 介紹 lua是一門編程語言,開源且源碼很容易編譯,我平時用來測試C語言編程環境時經常使用。一般能編譯成功就說明編程環境設置正常。下面用之前設置好的tcc編程環境進行測試。 2 獲取源碼 我一般有保留多個版本的lua源碼進…

Unity DOTS從入門到精通之 自定義Authoring類

文章目錄 前言安裝 DOTS 包什么是Authoring1. 實體組件2. Authoring類 前言 DOTS&#xff08;面向數據的技術堆棧&#xff09;是一套由 Unity 提供支持的技術&#xff0c;用于提供高性能游戲開發解決方案&#xff0c;特別適合需要處理大量數據的游戲&#xff0c;例如大型開放世…

comctl32!ListView_OnSetItem函數分析LISTSUBITEM結構中的image表示圖標位置

第一部分&#xff1a; BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi) { LISTSUBITEM lsi; BOOL fChanged FALSE; int i; int idpa; HDPA hdpa; if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)) { …

【算法】大數據查重

大數據查重 哈希表 找出第一個出現重復的數字 || 找所有重復出現的數字 #include <iostream> #include <vector> #include <unordered_map> #include <unordered_set> #include <stdlib.h> #include <time.h> #include <string> …

模型微調-基于LLaMA-Factory進行微調的一個簡單案例

模型微調-基于LLaMA-Factory進行微調的一個簡單案例 1. 租用云計算資源2. 拉取 LLaMa-Factory3. 安裝依賴環境4. 啟動 LLaMa-Factory 界面5. 從 Huggingface 下載模型6. 模型驗證7. 模型微調 1. 租用云計算資源 以下示例基于 AutoDL 云計算資源。 在云計算平臺選擇可用的云計…

【單片機】ARM 處理器簡介

ARM 公司簡介 ARM&#xff08;Advanced RISC Machine&#xff09; 是英國 ARM 公司&#xff08;原 Acorn RISC Machine&#xff09; 開發的一種精簡指令集&#xff08;RISC&#xff09; 處理器架構。ARM 處理器因其低功耗、高性能、廣泛適用性&#xff0c;成為嵌入式系統、移動…

springboot的實體類字段校驗的分組校驗

分組校驗&#xff08;Group Validation&#xff09;允許在不同的場景下對同一個實體類應用不同的校驗規則。例如&#xff0c;在新增數據和更新數據時&#xff0c;可能需要對某些字段的校驗規則進行調整。以下是分組校驗的具體實現步驟&#xff1a; 一、定義分組接口 創建空的標…

vue3,Element Plus中隱藏樹el-tree滾動條

el-tree&#xff0c;節點過多&#xff0c;默認會出現垂直滾動條&#xff0c;顯得不美觀 可以使用隱藏組件 el-scrollbar 將 el-tree 包裹&#xff0c;就可以隱藏垂直滾動條 <el-scrollbar> <el-tree> ... </el-tree> </el-scrollbar> /* 滾動條禁用鼠…

mysql練習

創建數據庫db_ck&#xff0c;再創建表t_hero&#xff0c;將四大名著中的主要人物都插入這個表中&#xff0c;將實現過程中sql提交上上來 1、創建數據庫db_ck mysql> create database db_ck; 2、創建表t_hero mysql> use db_ck Database changed mysql> create table …

svn刪除所有隱藏.svn文件,文件夾脫離svn控制

新建一個文件&#xff0c;取名remove-svn-folders.reg&#xff0c;輸入如下內容&#xff1a; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…

文心一言:中國大模型時代的破局者與探路者

2023年&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的浪潮席卷全球&#xff0c;而百度推出的“文心一言”&#xff08;ERNIE Bot&#xff09;作為中國AI領域的代表性產品&#xff0c;迅速成為行業焦點。這款基于百度自主研發的“文心大模型”打造的對話式AI工具&am…

Ubuntu 安裝docker docker-compose

Docker 通過提供輕量級、可移植且高效的解決方案&#xff0c;簡化了軟件開發和部署。“docker build”命令是 Docker 鏡像創建過程的核心。本文將探討 Docker 構建命令、用法以及 Docker 構建的優化。 Docker 構建有什么作用&#xff1f; Docker build 是一個命令行界面 CLI命…

Unity開發——CanvasGroup組件介紹和應用

CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染順序的組件。 一、常用屬性的解釋 1、alpha&#xff1a;控制UI的透明度 類型&#xff1a;float&#xff0c;0.0 ~1.0&#xff0c; 其中 0.0 完全透明&#xff0c;1.0 完全不透明。 通過調整alpha值可以實現UI的淡入淡…

每天五分鐘深度學習PyTorch:向更深的卷積神經網絡挑戰的ResNet

本文重點 ResNet大名鼎鼎,它是由何愷明團隊設計的,它獲取了2015年ImageNet冠軍,它很好的解決了當神經網絡層數過多出現的難以訓練的問題,它創造性的設計了跳躍連接的方式,使得卷積神經網絡的層數出現了大幅度提升,設置可以達到上千層,可以說resnet對于網絡模型的設計具…

大模型巔峰對決:DeepSeek vs GPT-4/Claude/PaLM-2 全面對比與核心差異揭秘

文章目錄 一、架構設計深度解剖1.1 核心架構對比圖譜1.2 動態MoE架構實現架構差異分析表 二、訓練策略全面對比2.1 訓練數據工程對比2.2 分布式訓練代碼對比DeepSeek混合并行實現GPT-4 Megatron實現對比 2.3 關鍵訓練參數對比 三、性能表現多維評測3.1 基準測試全景對比3.2 推理…

基于hive的電信離線用戶的行為分析系統

標題:基于hive的電信離線用戶的行為分析系統 內容:1.摘要 隨著電信行業的快速發展&#xff0c;用戶行為數據呈現出海量、復雜的特點。為了深入了解用戶行為模式&#xff0c;提升電信服務質量和精準營銷能力&#xff0c;本研究旨在構建基于 Hive 的電信離線用戶行為分析系統。通…

Python使用alembic實現數據庫管理

python使用alembic實現數據庫管理 環境準備 安裝依賴&#xff1a; pip install sqlalchemy alembic項目結構 my_project/ ├── models.py # 定義數據模型 └── alembic/ # 遷移腳本目錄&#xff08;自動生成&#xff09; 使用步驟&#xff1a; 1. 初始化Alembic環境 …

對WebSocket做一點簡單的理解

1.概念 WebSocket 是基于 TCP 的一種新的網絡協議。它實現了瀏覽器與服務器全雙工通信——瀏覽器和服務器只需要完成一次握手&#xff0c;兩者之間就可以創建持久性的連接&#xff0c; 并進行雙向數據傳輸。 HTTP協議和WebSocket協議對比&#xff1a; HTTP是短連接 WebSocke…

kali虛擬機登錄頁面發癲 大寫鎖定輸入不了密碼

不知道怎么了 總是發癲 重啟切換太麻煩了 還有時候不成功 kali其實可以開啟虛擬鍵盤 如下 就解決的 發癲kali 發癲 發癲

基于Python的商品銷量的數據分析及推薦系統

一、研究背景及意義 1.1 研究背景 隨著電子商務的快速發展&#xff0c;商品銷售數據呈現爆炸式增長。這些數據中蘊含著消費者行為、市場趨勢、商品關聯等有價值的信息。然而&#xff0c;傳統的數據分析方法難以處理海量、多源的銷售數據&#xff0c;無法滿足現代電商的需求。…