亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

JS 實(shí)現(xiàn)橫向排列的頁(yè)面元素左右拖拽

admin
2025年7月1日 16:20 本文熱度 483

在前端開(kāi)發(fā)中,頁(yè)面中的數(shù)據(jù)元素橫向排列是一種很常見(jiàn)的ui設(shè)計(jì),比如首頁(yè)面中的產(chǎn)品列表,tab標(biāo)簽頁(yè)的標(biāo)題等。

當(dāng)列表元素?cái)?shù)量過(guò)多的時(shí)候,橫向排列不下,就會(huì)出現(xiàn)橫向滾動(dòng)條,或者讓列表元素?fù)Q行的情況。

今天我們介紹一種可以讓列表元素左右拖拽的實(shí)現(xiàn)方案,以避免出現(xiàn)橫向滾動(dòng)條,和換行的情況。

最為演示示例,我們假定頁(yè)面中有一個(gè) div 作為數(shù)據(jù)顯示的容器(container),container 內(nèi)有一個(gè)子元素(div),子元素的寬度大于container,我們?cè)O(shè)置container 的css 樣式:overflow: hidden; 如下圖:

現(xiàn)在,我們?cè)谧釉刂刑砑訑?shù)據(jù)列表:

實(shí)現(xiàn)代碼:

HTML

<div class="container">    <div class="data-list">        <div class="data-item">數(shù)據(jù)項(xiàng) 1</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 2</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 3</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 4</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 5</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 6</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 7</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 8</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 9</div>        <div class="data-item">數(shù)據(jù)項(xiàng) 10</div>    </div></div>

CSS

.container {    height100vh;    width600px;    background-color#fff;    border1px solid #ddd;    overflow: hidden;}.data-list {    height100px;    width2090px;}.data-item {    float: left;    height100%;    width200px;    background-color#eee;    text-align: center;    line-height100px;    user-select: none;}.data-item + .data-item {    margin-left10px;}

接下來(lái),我們給子元素(data-list)添加拖動(dòng)事件。我們先前寫(xiě)過(guò)一篇關(guān)于拖動(dòng)div的文章(JS 實(shí)現(xiàn) div 自由拖拽),大家有興趣的可以看一下。在那片文章中實(shí)現(xiàn)的是鼠標(biāo)自由拖拽div,本章中只需要左右拖動(dòng)。另外,為了多演示一種拖動(dòng)方式,本章中我們使用 transform 方式來(lái)實(shí)現(xiàn)。如下 JS 代碼:

var el = document.querySelector('.data-list');el.addEventListener('mousedown', drag);var offset=0;function drag(e){    var startX = e.clientX;    var mousemove=(evt)=>{        let x=evt.clientX;        offset += x - startX;        //給元素設(shè)置位移        setPosition(offset);        startX=x; //更新鼠標(biāo)位置    };    var mouseup=(evt)=>{        document.removeEventListener('mousemove', mousemove);        document.removeEventListener('mouseup', mouseup);    };    document.addEventListener('mousemove', mousemove);    document.addEventListener('mouseup', mouseup);}//給元素設(shè)置 transform 位移function setPosition(ofs){    el.style.transform='translateX('+ofs+'px)';}

至此,子元素就實(shí)現(xiàn)了左右拖動(dòng):

不過(guò)還有個(gè)問(wèn)題,就是在子元素可以被無(wú)限橫向拖拽,甚至可以被拖到視窗范圍之外。所以我們還需要在結(jié)束拖拽的時(shí)候,也就是 mouseup 事件中,檢查一下子元素的位置,如果子元素的最左側(cè)與容器的最左側(cè)有間距,或者子元素的最右側(cè)與容器的最右側(cè)有間距,就重新調(diào)整子元素的偏移量。

為此,我們添加一個(gè) checkPosition 的函數(shù):

function checkPosition(){    if(offset>0){        this.setPosition(0);        return;    }    //最大偏移量:子元素的寬度 與 父元素寬度 的差值    var maxOffset=el.offsetWidth - el.parentNode.offsetWidth;    if(Math.abs(offset)>maxOffset){        setPosition(-maxOffset);    }}

同時(shí),修改一下setPosition 函數(shù),以更新偏移量:

//給元素設(shè)置 transform 位移function setPosition(ofs){    el.style.transform='translateX('+ofs+'px)';    offset=ofs;}

然后在mouseUp事件中,調(diào)用 checkPosition

var mouseup=(evt)=>{    checkPosition();    document.removeEventListener('mousemove', mousemove);    document.removeEventListener('mouseup', mouseup);};

這樣當(dāng)子元素被拖到視窗之外時(shí),會(huì)自動(dòng)“復(fù)位”:

為了讓子元素在“復(fù)位”的時(shí)候,更平滑一些,我們還可以再做一些改進(jìn),就是給子元素添加動(dòng)畫(huà)(transition)。但是我們不希望在拖動(dòng)的過(guò)程中啟用動(dòng)畫(huà),而是在拖拽結(jié)束,讓子元素恢復(fù)位置的時(shí)候再啟用動(dòng)畫(huà),所以我們?cè)?mouseup 事件中添加 transition 樣式,而在 mousedown 事件的時(shí)候,取消 transition 樣式。如下:

var offset=0;function drag(e){    //取消動(dòng)畫(huà)    el.style.transition='';    var startX = e.clientX;function checkPosition(){    //添加動(dòng)畫(huà)    el.style.transition='transform 0.3s';    if(offset>0){        this.setPosition(0);        return;    …}

完整代碼如下:

<!DOCTYPE html><html lang="zh"><head>  	<meta charset="utf-8">  	<title>DIV 拖拽</title>  	<style>        .container {            height100vh;            width600px;            background-color#fff;            border1px solid #ddd;            overflow: hidden;        }        .data-list {            height100px;            width2090px;        }        .data-item {            float: left;            height100%;            width200px;            background-color#eee;            text-align: center;            line-height100px;            user-select: none;        }        .data-item + .data-item {            margin-left10px;        }    </style>    </style></head><body>    <div class="container">        <div class="data-list">            <div class="data-item">數(shù)據(jù)項(xiàng) 1</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 2</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 3</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 4</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 5</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 6</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 7</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 8</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 9</div>            <div class="data-item">數(shù)據(jù)項(xiàng) 10</div>        </div>    </div><script>    var el = document.querySelector('.data-list');    el.addEventListener('mousedown', drag);    var offset=0;    function drag(e){        el.style.transition='';        var startX = e.clientX;        var mousemove=(evt)=>{            let x=evt.clientX;            offset += x - startX;            //給元素設(shè)置位移            setPosition(offset);            startX=x; //更新鼠標(biāo)位置        };        var mouseup=(evt)=>{            checkPosition();            document.removeEventListener('mousemove', mousemove);            document.removeEventListener('mouseup', mouseup);        };        document.addEventListener('mousemove', mousemove);        document.addEventListener('mouseup', mouseup);    }    //給元素設(shè)置 transform 位移    function setPosition(ofs){        el.style.transform='translateX('+ofs+'px)';        offset=ofs;    }    function checkPosition(){        el.style.transition='transform 0.3s';        if(offset>0){            this.setPosition(0);            return;        }        //最大偏移量:子元素的寬度 與 父元素的寬度 的差值        var maxOffset=el.offsetWidth - el.parentNode.offsetWidth;        if(Math.abs(offset)>maxOffset){            setPosition(-maxOffset);        }    }</script></body></html>


該文章在 2025/7/1 21:09:46 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved