日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

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

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

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

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

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

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

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

現(xiàn)在,我們在子元素中添加數(shù)據(jù)列表:

實現(xiàn)代碼:

HTML

<div class="container">    <div class="data-list">        <div class="data-item">數(shù)據(jù)項 1</div>        <div class="data-item">數(shù)據(jù)項 2</div>        <div class="data-item">數(shù)據(jù)項 3</div>        <div class="data-item">數(shù)據(jù)項 4</div>        <div class="data-item">數(shù)據(jù)項 5</div>        <div class="data-item">數(shù)據(jù)項 6</div>        <div class="data-item">數(shù)據(jù)項 7</div>        <div class="data-item">數(shù)據(jù)項 8</div>        <div class="data-item">數(shù)據(jù)項 9</div>        <div class="data-item">數(shù)據(jù)項 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;}

接下來,我們給子元素(data-list)添加拖動事件。我們先前寫過一篇關(guān)于拖動div的文章(JS 實現(xiàn) div 自由拖拽),大家有興趣的可以看一下。在那片文章中實現(xiàn)的是鼠標(biāo)自由拖拽div,本章中只需要左右拖動。另外,為了多演示一種拖動方式,本章中我們使用 transform 方式來實現(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)';}

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

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

為此,我們添加一個 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);    }}

同時,修改一下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)子元素被拖到視窗之外時,會自動“復(fù)位”:

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

var offset=0;function drag(e){    //取消動畫    el.style.transition='';    var startX = e.clientX;function checkPosition(){    //添加動畫    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ù)項 1</div>            <div class="data-item">數(shù)據(jù)項 2</div>            <div class="data-item">數(shù)據(jù)項 3</div>            <div class="data-item">數(shù)據(jù)項 4</div>            <div class="data-item">數(shù)據(jù)項 5</div>            <div class="data-item">數(shù)據(jù)項 6</div>            <div class="data-item">數(shù)據(jù)項 7</div>            <div class="data-item">數(shù)據(jù)項 8</div>            <div class="data-item">數(shù)據(jù)項 9</div>            <div class="data-item">數(shù)據(jù)項 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ān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

玖玖黄色| 好屌妞精品视频在线| 蜜桃福利精品无码| 91麻豆极品| 在线观看免费不卡AV| 86久久精品| 性二区一区| 亚洲一区成人在线xxx| 无码视频播放一区| 素人无码一区二区三区| 久久精品系列中文字幕| 男操女午夜视频| 草肥B云婷一区二区三区| 久久日韩一道本| 香港伦理性感女教师在线播放网站| 在线国产中文传媒abcd| 黑人巨大解禁日本人妻视频| 精品久久精品内射| 乱码久久久久久| 五月天激情四射一区| 日本精品久久无码| 欧美日韩国产免费观看色五月婷婷 | 成人69视频久久| 台湾佬中文111vvvv网| 日本美女高潮久久久久久久。| 第一页久久国产日韩| 亚洲精品入口| 淫音色综合99| 美女张开腿让人桶免费app| yeye综合网| 日韩丰满少妇一区三区| 一区二区免费人妻电影| 欧美伊人久久综合熟女导航| 后入干我在线观看| 国产精品99久久久久久久久99| 亚洲精品久久中文字幕| 亚洲国产成人在线网站| 噢美色视| 日本久久久久丶亚洲| 国产乱码一区二区三区| 真实偷拍泄密无码在线视频|