您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么使用slider滑塊創(chuàng)建圖片對比”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么使用slider滑塊創(chuàng)建圖片對比”吧!
先看效果
.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%); }
// 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);
通過上面的示例可以看到,拖動(dòng)中間的 slider 滑塊,可以很清楚的看到圖片的對比效果。
下面我們就來看看是如何實(shí)現(xiàn)的。
<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>
修改后的圖放在底部,滑塊在中間,原圖在最上層。
.container { position: relative; } .modified-image { position: absolute; left: 0; top: 0; height: 100%; width: 50%; }
修改后的元素初始默認(rèn)占據(jù) 50% 的寬度。
我們不使用 img 元素來顯示修改后的圖片,而是使用背景圖方式顯示,因?yàn)閳D片可以進(jìn)行縮放。
<div class="modified-image" ></div>
因?yàn)槭褂帽尘皥D,所以修改后的圖片元素需要設(shè)置更多樣式,以達(dá)到最佳的顯示效果。
.modified-image { background-position: top left; background-repeat: no-repeat; background-size: auto 100%; /* ... */ }
為了達(dá)到對比的效果,我們還要給修改后的圖片添加一層濾鏡效果。
.modified-image { filter: grayscale(100%); /* ... */ }
接下來設(shè)置 .resizer
元素的樣式,相對而言要簡單很多,只需要將它設(shè)置到中心位置即可。
.resizer { position: absolute; left: 50%; top: 0; height: 100%; width: 2px; background-color: #cbd5e0; cursor: ew-resize; }
使用 position
屬性將它定為到中間,注意將鼠標(biāo)的展現(xiàn)形式更換為 cursor: ew-resize
。
HTML 結(jié)構(gòu)和 CSS 樣式就差不多了,接下來處理 JavaScript 事件相關(guān)內(nèi)容。
當(dāng)我們移動(dòng) .resizer
元素時(shí),需要事實(shí)計(jì)算鼠標(biāo)移動(dòng)了多遠(yuǎn)的距離。然后根據(jù)當(dāng)前鼠標(biāo)的位置,修改 .resizer
元素的位置,以及修改后圖片的大小。
const resizer = document.getElementById('dragMe'); // 上一個(gè)兄弟元素,也就是修改后的圖片元素 const leftSide = resizer.previousElementSibling; // 記錄當(dāng)前鼠標(biāo)的位置 let x = 0; let y = 0; // 記錄修改后圖片的寬度 let leftWidth = 0; // 點(diǎn)擊 resizer 元素時(shí)觸發(fā) mousedown 事件 const mouseDownHandler = function (e) { // 獲取當(dāng)前鼠標(biāo)位置 x = e.clientX; y = e.clientY; leftWidth = leftSide.getBoundingClientRect().width; // 在 document 元素上添加事件 document.addEventListener('mousemove', mouseMoveHandler); document.addEventListener('mouseup', mouseUpHandler); }; const mouseMoveHandler = function (e) { // 計(jì)算鼠標(biāo)移動(dòng)距離 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); // 設(shè)置修改后的圖片元素的寬度 leftSide.style.width = `${newLeftWidth}%`; resizer.style.left = `${newLeftWidth}%`; }; // 給 resizer 元素添加事件 resizer.addEventListener('mousedown', mouseDownHandler);
代碼有點(diǎn)長,需要你花點(diǎn)時(shí)間仔細(xì)看看才能理解。
最后還有一個(gè)需要注意的點(diǎn),我們要保證鼠標(biāo)滑塊不會(huì)滑出可視范圍,所以需要限制其最大值和最小值。
因?yàn)樾薷暮蟮膱D片元素的寬度值時(shí)百分比類型,所以最小值為 0,最大值為 100。
const mouseMoveHandler = function (e) { // ... newLeftWidth = Math.max(newLeftWidth, 0); newLeftWidth = Math.min(newLeftWidth, 100); };
到此,相信大家對“怎么使用slider滑塊創(chuàng)建圖片對比”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。