校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 純 CSS 實現拖拽效果的代碼

純 CSS 實現拖拽效果的代碼

熱門標簽:400電話唐山辦理 威力最大的電銷機器人 旅游地圖標注線路 廣西房產智能外呼系統推薦 電話機器人鑰匙扣 漯河外呼調研線路 地圖標注位置怎么弄圖 電銷專用外呼線路 電銷外呼系統是違法的嗎

發揮你的想象,CSS也能實現拖拽效果。

一、拖拽效果示例

這是移動端很常見的一個效果,可以按住拖來拖去,比如下面的 起點中文網 [1] 觸屏版:

這類效果用JS可以很容易實現,無非就是多了一些計算,多考慮了一些臨界場景,然后代碼量也多了一些。不過,經過我的一番腦洞,發現CSS也能幾乎實現這一效果,接著往下看。

二、CSS實現原理

在傳統 web 中,頁面滾動是一個很常見交互,操作上就是 利用鼠標滾輪或者直接拖動滾動條 。但是,移動端可不一樣, 直接用手指拖動頁面就可以滾動了。 通常頁面是要么垂直方向滾動,要么水平方向滾動, 如果兩個方向都可以滾動呢? 例如

.dragbox{
  width: 300px;
  height: 300px;
  overflow: auto
}
.dragcon{
  width: 500px;
  height: 500px;
}

只需要內部元素寬高都大于容器就實現兩個方向的滾動了(記得設置 overflow:auto ),示意如下

一般情況下,鼠標滾輪只能同時滾動一個方向(按住 Shift 可以滾動另一方向),但是移動端可以 直接拖著內容任意滾動 ,如下所示

現在,在內容中間添加一個元素,跟隨內容區域一起滾動

接下來,把后面的文本隱藏起來

是不是有點 拖拽 的味道了?原理就是這么簡單!

三、CSS實現細節

首先確定拖拽目標與拖拽容器的尺寸關系,假設拖拽目標的尺寸是 w * h ,那么很容易得出的尺寸關系為: 內部尺寸是容器的2倍減去拖拽目標的尺寸

.dragbox{
  width: 100%;
  height: 100%;
}
.dragcon{
  width: calc(200% - w);
  height: calc(200% - h);
}

用一張動圖描述如下(中間的橙色塊塊表示拖拽目標)

四、CSS實現布局

接下來需要把這個特性加入到頁面當中,這里列舉了兩種布局

1. fixed 定位

現在直接把剛才的布局添加到頁面上,并添加 fixed 定位

<body>
  ...頁面上的其他元素
  <div class=“dragbox”>
    <div class=“dragcon”></div>
    <div class=“ball”></div> <!--拖拽元素-->
  </div>
</body>

關鍵樣式如下

.dragbox{
  position: fixed;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  overflow: auto
}

層級示意關系如下

這樣一來, dragbox 肯定把頁面原有的部分遮擋了,所以還需要添加 pointer-events: none; 同時在拖拽時添加 pointer-events: all

.dragbox{
  /*...*/
  pointer-events: none;
}
.ball{
  /*...*/
  pointer-events: all;
}
.dragbox.active{
  /*...*/
  pointer-events: all;
}

借助 JS 可以在按下時觸發外層容器滾動

ball.addEventListener('touchstart',(ev)=>{
   dragbox.classList.add('active');
})
document.addEventListener('touchend',()=>{
   dragbox.classList.remove('active');
})

實際效果如下

完整代碼可訪問https://codepen.io/xboxyan/pen/PobwxBK(PC訪問請打開移動端模式)

也可直接掃描以下二維碼

1. absolute 定位 + 層級

前面一種布局由于 fixed 定位層級的影響,不得不借助 JS 來動態改變容器的狀態,有沒有什么辦法可以實現 既可以拖拽,又不影響原有頁面 呢?下面來看這一種布局,用到了 ab s olute 定位

這里需要對原有頁面包裹一層 div 容器,如下

<body>
  <div class=“dragbox”>
    <div class=“dragcon”></div>
    <div class=“ball”></div>
  </div>
  <div class=“body”> <!--單獨用一層實現頁面滾動-->
    ...頁面上的其他元素
  </div>
</body>

關鍵樣式如下

.dragbox{
  position: absolute;
  width: 100%;
  height: 100%;
  overflow: auto;
}
.body{
  position: relative;
  height: 100%;
  overflow: auto;
}
.ball{
  position: relative;
  z-index: 10;  /*拖拽目標的層級設置高一點*/
}

現在層級關系就變成了這樣

這里原先頁面內容在層級上處于 dragbox拖拽目標 之間,所以在拖拽時也不會影響到原有頁面的滾動, 無需任何 JS 處理

完整代碼可訪問https://codepen.io/xboxyan/pen/bGBNQxL(PC訪問請打開移動端模式)

也可直接掃描以下二維碼

提示:上面兩種布局方式,第一種方式適應性更好,不影響現有項目;第二種體驗更好,但是會使用 div 作為頁面滾動容器,會對頁面結構做一定的改動,可以根據實際情況自行選擇。

五、CSS實現其他功能

1. 吸附功能

很多時候,在拖拽結束時需要讓它自動吸附在邊緣,就如同文章開頭的示意圖一樣。那么,通過吸附,可以聯想到什么屬性呢?

答案就是 CSS Scroll Snap [2]

<body>
  ...頁面上的其他元素
  <div class=“dragbox”>
    <div class=“dragcon”>A</div>
    <div class=“dragcon”>B</div>
    <div class=“ball”></div>
  </div>
</body>

下面是關鍵樣式

.dragbox{
  ...
  scroll-snap-type: x mandatory;
}
.dragcon{
  scroll-snap-align: start;
}

實際效果如下

完整代碼可訪問https://codepen.io/xboxyan/pen/XWNJyPw(PC訪問請打開移動端模式)

也可直接掃描以下二維碼

1. 設置初始位置

默認情況下,拖拽目標是唯有右下角的,如何位于左下角呢?很簡單,這里拖拽是滾動容器實現的,所以只 需要改變 scrollLeft 或者 scrollTop 即可

dragbox.scrollLeft = 999;
dragbox.scrollTop = 999;

除此之外,也可以采用純 HTML 方式實現, 利用元素的 autofocus 自動聚焦到可視范圍的特性

<div class=“dragcon">
  ...
  <button class="pos" autofocus></button> <!--添加一個自動聚焦的元素-->
</div>

比如你希望初始位置在 左上角 ,那么添加一個 右下角 的自動聚焦元素就可以了(當然還需要設置透明度等隱藏起來)~

1. 設置邊界

現在拖拽目標的邊界是屏幕邊緣,有時候可能需要留一些間距,這種需要在 CSS 就很容易了,可以改變 left/top/right/bottompaddingborder ... 很多方式

.dragbox{
  left: 10px;
  top: 10px;
  right: 10px;
  bottom: 10px;
  /*rect: 10px;*/
}
.dragbox{
  padding: 10px;
}

六、說明和小結

關于兼容性本來以為是沒什么問題的,實測下來 ios 問題多多,主要是 safari 滾動容器的問題。例如,有些低版本 ios 滾動不順暢,需要添加

-webkit-overflow-scrolling:touc h , 才能實現平滑滾動和自動吸附,但是又會導致層級問題,有些文檔上描述設置該屬性會創建一個原生的滾動容器,層級最高。還有第一種 fixed 布局,如果默認情況下設置 pointer-events: none touchstart 之后設置成 auto ,這個在 ios 上滾動竟然失效了,但是反轉過來就可以了(demo中已兼容ios)。

優點嘛,繼承 CSS 的靈活性,幾乎零成本,容易復用,同時利用了原生滾動,也不會有卡頓。

不過也有少許局限,如果 拖拽目標的尺寸是不固定的 ,可能需要借助 JS 來獲取了。當然相比較而言,這還是一個性價比極高的實現方式。

現在回頭看看,其實也沒有用到什么非常生僻的屬性(scroll-snap 可能算一個,不過畢竟是輔助功能),主要還是常見的效果,然后通過聯想和發散,根據平日的積累,充分挖掘原生的能力,最終完成所需要的交互,然后就有了本文。

感謝閱讀,希望能對日后的工作有所啟發。

References

[1] 起點中文網:  https://m.qidian.com/

[2] CSS Scroll Snap:  https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Scroll_Snap

到此這篇關于純 CSS 實現拖拽效果的代碼的文章就介紹到這了,更多相關CSS 實現拖拽效果內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

標簽:綏化 湖北 焦作 湘西 無錫 銅陵 試駕邀約 欽州

巨人網絡通訊聲明:本文標題《純 CSS 實現拖拽效果的代碼》,本文關鍵詞  純,CSS,實現,拖拽,效果,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《純 CSS 實現拖拽效果的代碼》相關的同類信息!
  • 本頁收集關于純 CSS 實現拖拽效果的代碼的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    美国av一区二区| 日日夜夜免费精品| 日韩精品最新网址| 欧美精品一二三| 精品视频一区三区九区| 欧美另类久久久品| 日韩欧美国产综合| 久久婷婷国产综合精品青草| 亚洲精品在线三区| 国产午夜亚洲精品午夜鲁丝片 | 北条麻妃一区二区三区| 国产成人精品免费网站| 成人av影院在线| 91美女福利视频| 欧美日韩亚洲丝袜制服| 欧美日韩二区三区| 精品国产一区a| 久久久久99精品国产片| 国产精品视频免费| 亚洲免费av高清| 日韩国产欧美在线播放| 国产在线播放一区二区三区| 国产精品一区三区| 91一区二区在线观看| 欧美精品一二三| 欧美极品xxx| 亚洲高清免费观看| 国产一区二区看久久| 色婷婷久久99综合精品jk白丝| 欧美日韩在线播| 欧美精品一区二区蜜臀亚洲| 亚洲欧美偷拍另类a∨色屁股| 性欧美疯狂xxxxbbbb| 国产一区二区三区久久久 | 色哟哟一区二区在线观看| 欧美男人的天堂一二区| 久久综合狠狠综合| 亚洲人成7777| 国产在线不卡一卡二卡三卡四卡| 91在线国内视频| 欧美一区二区视频网站| 国产精品久久久久久久蜜臀| 日韩黄色小视频| 成人一区二区视频| 欧美一级免费大片| 亚洲人成影院在线观看| 麻豆高清免费国产一区| 色诱亚洲精品久久久久久| 久久亚洲综合av| 日韩国产欧美在线播放| 日本韩国精品在线| 国产精品久久免费看| 久久成人免费网| 欧美三级电影一区| 亚洲欧洲精品一区二区三区| 国产揄拍国内精品对白| 91精品久久久久久蜜臀| 亚洲黄色在线视频| 成人高清免费在线播放| 国产农村妇女精品| 韩国成人精品a∨在线观看| 欧美一区二区三区在线看| 亚洲综合激情网| 91在线国内视频| 亚洲少妇屁股交4| 高清日韩电视剧大全免费| 2021国产精品久久精品| 韩国三级电影一区二区| 欧美成人伊人久久综合网| 午夜一区二区三区在线观看| 在线观看国产日韩| 亚洲免费观看在线观看| 成人午夜大片免费观看| 久久久久久久久99精品| 国产一区二区三区免费| 久久久高清一区二区三区| 激情都市一区二区| 久久一区二区视频| 国产原创一区二区三区| 国产亚洲欧美日韩在线一区| 国产乱码精品一区二区三区五月婷| 欧美一卡2卡3卡4卡| 毛片一区二区三区| 国产欧美一二三区| 99精品黄色片免费大全| 亚洲三级视频在线观看| 在线观看视频一区二区欧美日韩| 亚洲激情图片一区| 欧美酷刑日本凌虐凌虐| 美腿丝袜亚洲色图| 2021久久国产精品不只是精品| 国产成a人亚洲精| 亚洲少妇30p| 欧美人妖巨大在线| 精品在线你懂的| 久久久久久久久久久久久女国产乱 | 欧美精品一区二区精品网| 国产一区视频网站| 国产三级欧美三级日产三级99| 国产激情一区二区三区四区 | 亚洲免费看黄网站| 制服丝袜国产精品| 国产成人精品一区二区三区四区 | 丝袜a∨在线一区二区三区不卡| 91精品蜜臀在线一区尤物| 久久精品国产网站| 国产精品国产三级国产aⅴ中文 | 亚洲美女视频在线| 精品乱人伦小说| 成人黄色在线网站| 亚洲第一久久影院| 久久免费视频一区| 欧洲亚洲国产日韩| 国产在线精品视频| 亚洲电影一级片| 国产精品久久久久婷婷| 日韩午夜在线观看| 91久久香蕉国产日韩欧美9色| 久久综合综合久久综合| 洋洋av久久久久久久一区| 欧美电影免费观看高清完整版在线 | 久久天天做天天爱综合色| 91视频观看免费| 久久99久久99| 一区二区三区欧美日韩| 久久精品男人天堂av| 欧美日韩亚洲综合一区| av亚洲精华国产精华精华| 九九精品一区二区| 午夜欧美一区二区三区在线播放| 国产精品久久毛片av大全日韩| 日韩欧美国产综合在线一区二区三区| 91美女蜜桃在线| 国产精品亚洲成人| 久久狠狠亚洲综合| 爽爽淫人综合网网站| 亚洲精品视频在线观看免费| 国产蜜臀av在线一区二区三区| 日韩精品一区二区三区视频 | 久久久久久久久伊人| 在线电影国产精品| 欧美综合亚洲图片综合区| 成人avav影音| 成人午夜激情在线| 成人爱爱电影网址| 丁香桃色午夜亚洲一区二区三区| 美洲天堂一区二卡三卡四卡视频| 亚洲第一福利视频在线| 亚洲一区中文在线| 一区二区激情视频| 一区二区三区波多野结衣在线观看 | 精品一区二区免费在线观看| 亚洲成人动漫一区| 亚洲va中文字幕| 亚洲成人一二三| 丝袜亚洲另类欧美综合| 男男成人高潮片免费网站| 日本伊人色综合网| 日本伊人色综合网| 久久99国产精品久久99果冻传媒| 久久精工是国产品牌吗| 国产精品亚洲综合一区在线观看| 丁香五精品蜜臀久久久久99网站| 成人一区二区三区中文字幕| www.久久精品| 欧美午夜在线一二页| 欧美一区二区日韩| 欧美精品一区二区三区久久久| 日本一区二区在线不卡| 国产精品拍天天在线| 一区二区在线观看视频| 同产精品九九九| 久久99精品久久久久久国产越南| 国产九色sp调教91| 91在线观看视频| 欧美剧在线免费观看网站 | 亚洲欧美一区二区三区极速播放 | 久久―日本道色综合久久| 国产精品欧美极品| 午夜精品福利一区二区三区蜜桃| 日韩vs国产vs欧美| 成人综合婷婷国产精品久久蜜臀| 91影院在线免费观看| 7777精品久久久大香线蕉| 精品免费国产一区二区三区四区| 国产欧美精品区一区二区三区| 亚洲一区二区三区四区的| 男人的天堂久久精品| 91蝌蚪porny成人天涯| 欧美一级视频精品观看| 成人免费在线播放视频| 男人的j进女人的j一区| 99久久国产综合精品女不卡| 日韩一级片在线播放| 亚洲精品中文在线| 久久精品二区亚洲w码| 色综合天天狠狠| 国产视频一区在线观看| 亚洲成av人影院| av亚洲产国偷v产偷v自拍|