精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

教你如何自定義 Drag 樣式.md

開發(fā) 前端
拖拽預(yù)覽圖的尺寸是和頁面上圖片的CSS 尺寸相關(guān)聯(lián)的,也就是說展示的圖片越大,拖拽的預(yù)覽圖越大。

在 web 中,圖片默認是可以拖拽的,通常是一個半透明的預(yù)覽圖(下面簡稱“預(yù)覽圖”),如下:

這個預(yù)覽圖是系統(tǒng)自動生成的,一般無法進行自定義,但有時候會覺得拖拽的預(yù)覽圖尺寸太大了,不方便放置,例如在這種場景下。

這是一個拖拽圖片保存的功能,需要將圖片拖拽至指定區(qū)域觸發(fā)保存操作。由于拖拽時預(yù)覽圖太大,導(dǎo)致放置區(qū)域都被遮住了,茫茫的一片,體驗非常不好。

如果預(yù)覽圖的尺寸可以小一點,例如這樣:

是不是體驗就會好很多?下面一起來探討一下。

一、預(yù)覽圖的默認尺寸

首先,拖拽預(yù)覽圖的尺寸是和頁面上圖片的CSS 尺寸相關(guān)聯(lián)的,也就是說展示的圖片越大,拖拽的預(yù)覽圖越大。

但是,預(yù)覽圖的大小并不是無限制的,據(jù)我測試,預(yù)覽圖的最大尺寸是 400 * 400,比如下方圖片的尺寸是 500 * 500, 但是拖拽出來的預(yù)覽圖只有 400 * 400,但對實際開發(fā)而言,這個尺寸還是過大。

以上是 MacOS Chrome 下的表現(xiàn)效果,F(xiàn)irefox 表現(xiàn)要好很多,不會出現(xiàn)預(yù)覽圖過大的情況。

另外,測試了一下 Windows Chrome 的表現(xiàn)效果,比較類似,只不過最大尺寸是 200 * 200,表現(xiàn)如下:

二、借助 setDragImage 修改預(yù)覽圖

原生的拖拽只能通過 setDragImage[1] 來修改預(yù)覽圖,看著好像很強大,實則非常雞肋,簡單使用如下:

function dragstart_handler(ev) {
var img = new Image();
img.src = 'example.jpg';
ev.dataTransfer.setDragImage(img, 0, 0);
}

這里指定了這樣一張圖片作為預(yù)覽圖:

需要綁定在 dragstart事件上,這里采用事件委托的方式。

document.addEventListener('dragstart', ev => {
if (ev.target.tagName === 'IMG') {
dragstart_handler(ev)
}
})

效果是這樣的:

為什么是第二次拖拽才出現(xiàn)自定義預(yù)覽呢?這就是雞肋的地方了,官方規(guī)定 example.jpg為一個已經(jīng)存在的圖片,如果這個還沒有創(chuàng)建或者還未加載完成,那么瀏覽器將會使用默認的拖動圖片,在第二次拖拽的時候圖片加載完了,所以才生效。可以說,幾乎所有setDragImage不起作用的情況都是因為這個原因。

除此之外,還有一個問題,無法直接指定預(yù)覽圖的大小,例如:

function dragstart_handler(ev) {
var img = new Image();
img.src = 'example.jpg';
img.width = 50;//無效
img.height = 50;
ev.dataTransfer.setDragImage(img, 0, 0);
}

這樣也是無效的,內(nèi)存中的圖片會按原始大小來展示。

三、指定預(yù)覽圖為頁面元素

其實,要想修改預(yù)覽圖的大小還可以通過 canvas 渲染原圖,然后修改尺寸再生成圖片,但是 canvas 在渲染圖片時經(jīng)常會出現(xiàn)跨域的問題,并且 canvas 也有一定的門檻,所以這里先不采用。

再回過來看看官方的語法:

dataTransfer.setDragImage(img | element, xOffset, yOffset);

可以看到,第一個參數(shù)不僅支持動態(tài)創(chuàng)建的圖片,也支持頁面上實際存在的元素(頁面上存在的元素肯定是加載完成的)。

假設(shè)我們將自定義預(yù)覽圖添加在頁面。

<img ondragstart="dragstart_handler" src="head.jpg">
<img id="img" src="example.jpg"><!--預(yù)覽圖-->

然后將預(yù)覽圖指定為該圖片example.jpg。

ev.dataTransfer.setDragImage(img, 0, 0);

效果如下:

可以看到,拖拽圖片就像拖拽 example.jpg 一樣,而且也可以通過CSS直接修改尺寸!

#img{
width: 100px;
height: 100px;
}

預(yù)覽圖大小也是跟隨 example.jpg 的。

如果把 example.jpg換成和原始圖相同的鏈接,是不是就相當于可以自定義預(yù)覽圖的大小了呢?

現(xiàn)在需要將自定義圖片隱藏起來,畢竟只是借用一下,頁面上不需要顯示,這里需要一點小技巧了,不能真正的將這個圖片隱藏起來,比如:

#img{
display: none;
/*或者*/
opacity: 0;
/*或者*/
visibility: none
}

這些方式都不行,由于預(yù)覽圖是跟隨這張自定義圖片的,如果直接隱藏了都會導(dǎo)致預(yù)覽圖直接消失不見。

這時采取的方式可以將這張圖片移到視區(qū)之外,比如這樣:

#img{
position: absolute;
top: -9999px;
}

這樣就沒問題了。

實際工作中,這張圖應(yīng)該是自動生成的,而且自動獲取當前拖拽圖片的鏈接,完整實現(xiàn)就是。

/* 
* custom_drag_img
* author: xboxyan
*/
const img = document.createElement('img');
img.style = "position: absolute; top: -9999px; max-width: 100px; max-height: 100px;"
document.body.append(img)
document.addEventListener('dragstart', ev => {
if (ev.target.tagName === 'IMG') {
img.src = ev.target.src;
ev.dataTransfer.setDragImage(img, 0, 0);
}
})

可以將這段代碼注入其他地方,試試效果,比如原始效果如下:

注入以上代碼之后的效果如下:

在某些場景下是不是體驗好很多呢?

四、自定義預(yù)覽圖樣式

上述預(yù)覽圖不僅可以指定圖片元素,也可以其他元素,比如div,添加一些修飾。

<div class="drag_img">
<img src="xxx">
</div>
.drag_img{
position: absolute;
top: -9999px;
max-width: 100px;
max-height: 100px;
border: 3px solid yellow;
}

這樣就可以給預(yù)覽圖加上一個黃色邊框(強調(diào)作用)了。

亦或是通過偽元素加個角標。

.drag_img::after{
content: '';
position: absolute;
top: 0;
right: 0;
width: 20px;
height: 20px;
background: linear-gradient(-135deg, #f44336 50%, transparent 51%);
}

但是添加CSS濾鏡沒有生效,仍然是原始樣式:

.drag_img{
position: absolute;
top: -9999px;
max-width: 100px;
max-height: 100px;
filter: sepia(1); /*褐色濾鏡*/
}

這可能跟系統(tǒng)生成預(yù)覽圖的策略有關(guān),無從得知,也無法修改

五、完全的自定義方案 draggable-polyfill

其實上述都只是針對 setDragImage做的一些自定義,本質(zhì)上還是原生預(yù)覽圖,也僅適用于圖片拖拽(但是性能超好),如果想完全自定義拖拽效果,自定義普通可拖拽元素,就必須通過 JS 模擬實現(xiàn)了。大致思路如下

  1. 去除默認的預(yù)覽圖
  2. 復(fù)制一份當前目標元素,cloneObj
  3. 監(jiān)聽拖拽事件,通過 transform 改變cloneObj的位置
  4. 拖拽結(jié)束移除cloneObj

詳細原理可以參考我之前的一篇文章:實現(xiàn)一個美化原生拖拽的draggable-polyfill[2],雖然是自定義實現(xiàn)的,但是完全不影響原有業(yè)務(wù)拖拽邏輯,這正是 polyfill 的魅力,非常適合原生拖拽實現(xiàn)的場景。

項目地址:https://github.com/XboxYan/draggable-polyfill(或者訪問文章底部「原文鏈接」)[3],非常輕量,100 來行代碼,不影響業(yè)務(wù)邏輯,非常適合學習和時使用,歡迎 star~

3 年前的老代碼了,最近優(yōu)化了一波,非常實用,歡迎 star

六、總結(jié)一下

以上就完成了圖片拖拽預(yù)覽圖的自定義,其實主要用于修改預(yù)覽尺寸,在某些場景下還是挺有用的,這里總結(jié)一些要點:

  1. 在拖拽時產(chǎn)生的預(yù)覽圖是系統(tǒng)生成的,無法直接修改
  2. 在macOS Chrome下,預(yù)覽圖的尺寸最大為 400 * 400,在某些場景下體驗不太友好
  3. setDragImage 可以修改預(yù)覽圖
  4. setDragImage 需要圖片已經(jīng)加載完成才會生效,否則仍然是默認樣式
  5. setDragImage 可以指定頁面上的其他元素,不僅僅是 img
  6. setDragImage 指定的元素不能真正的隱藏,否則預(yù)覽圖將不可見,可以通過移出到視線之外的方式
  7. 以上方案適用于圖片拖拽,并且自定義的樣式有限
  8. 如果需要完全自定義拖拽,可以采用 draggable-polyfill 方案,歡迎star~

總的來說,整體實現(xiàn)還是非常簡單的,由于是原生方案,性能就不用說了,也不會影響原有功能,起到了美化的作用,如果有類似的需求,就趕緊用起來吧~

參考資料

[1]setDragImage: https://developer.mozilla.org/zh-CN/docs/Web/API/DataTransfer/setDragImage。

[2]實現(xiàn)一個美化原生拖拽的draggable-polyfill: https://segmentfault.com/a/1190000020842646。

[3]https://github.com/XboxYan/draggable-polyfill: https://github.com/XboxYan/draggable-polyfill。

責任編輯:姜華 來源: 前端偵探
相關(guān)推薦

2010-08-03 16:13:01

FlexBuilder

2022-05-27 07:51:07

自定義無序列表CSS

2021-01-20 08:58:39

iOS 14桌面圖標快捷指令

2011-05-12 16:30:44

自定義滾動條

2009-08-04 13:35:16

ASP.NET自定義樣

2017-03-02 13:33:19

Android自定義View

2022-06-01 21:54:32

Dragover元素web

2013-06-27 11:10:01

iOS開發(fā)自定義UISlider

2009-09-07 22:00:15

LINQ自定義

2022-02-16 08:12:03

組件樣式元素

2010-02-07 14:02:16

Android 界面

2015-02-12 15:33:43

微信SDK

2015-02-12 15:38:26

微信SDK

2021-12-31 08:43:45

插件KubeScheduler

2023-01-03 07:40:27

自定義滑塊組件

2009-09-03 13:34:03

.NET自定義控件

2020-11-19 10:50:43

ImportPython代碼

2016-12-26 15:25:59

Android自定義View

2009-08-17 17:48:00

C#自定義鼠標樣式

2022-08-01 11:41:00

Vue插件
點贊
收藏

51CTO技術(shù)棧公眾號

国产乱人乱偷精品视频a人人澡| 做a视频在线观看| 视频国产在线观看| 日韩中文欧美在线| 久久最新资源网| 精品影片一区二区入口| 国产69精品久久| 亚洲特级片在线| 国产精品一区二区电影| 亚洲国产美女视频| 国产suv精品一区| 精品久久中文字幕久久av| 麻豆传媒一区| 一级淫片免费看| 久久久精品一品道一区| 国产精品1234| 91狠狠综合久久久| 加勒比色综合久久久久久久久| 精品美女久久久久久免费| 欧美中文娱乐网| 国产露脸国语对白在线| 国产日韩一区二区三区在线| 中日韩美女免费视频网站在线观看| 中文国产在线观看| 黄在线观看免费网站ktv| 国产精品免费av| 国产免费高清一区| 国产天堂第一区| 欧美区亚洲区| 在线观看久久av| 熟妇女人妻丰满少妇中文字幕| 一级毛片久久久| 亚洲日本乱码在线观看| 国产福利不卡| 亚洲免费视频二区| 在线成人h网| 日韩在线中文字| av直播在线观看| 网站一区二区| 欧美另类一区二区三区| 亚洲国产精品久久久久婷蜜芽| 欧美边添边摸边做边爱免费| 2020国产精品久久精品美国| 不卡视频一区二区三区| 国产裸体美女永久免费无遮挡| 一区在线播放| 欧美成人在线网站| 中文字幕第69页| 夜夜春成人影院| 亚洲电影免费观看高清| 中文字幕第22页| 久久精品国产精品亚洲毛片| 亚洲资源在线观看| 亚洲成人一区二区三区| 国产69久久| 久久伊人中文字幕| 九色91在线视频| 亚洲国产欧美另类| 国产成人精品免费网站| 91精品中国老女人| 亚洲综合精品视频| 麻豆精品一区二区综合av| 日本久久久a级免费| 欧美 日韩 精品| 亚洲精品美女91| 午夜精品久久久久久久久久久久久 | 久久久这里只有精品视频| 色偷偷www8888| 日韩精品永久网址| 在线看片第一页欧美| 国产美女精品久久| 久久av资源| 亚洲无限av看| 日韩不卡av在线| 欧美在线色图| 这里只有精品视频在线| 波多野结衣家庭教师在线观看 | 日韩av不卡播放| 欧美少妇另类| 久久精品男人天堂av| 欧美日韩高清在线一区| 国产专区在线| 国产精品三级视频| 日韩 欧美 自拍| 高h视频在线观看| 亚洲精选一二三| 亚洲精品国产suv一区88| 毛片网站在线看| 五月天国产精品| 国产精品69久久久| av日韩国产| 欧美性xxxx极品hd满灌| 日本老熟妇毛茸茸| 99精品女人在线观看免费视频 | 特级丰满少妇一级| 亚洲伦理一区二区| 欧美成人精品高清在线播放| 久久人妻少妇嫩草av无码专区| 青青草原在线亚洲| 亚洲天堂av在线免费| 日韩av网站在线播放| 中文字幕一区二区三区久久网站| 色综合久久精品亚洲国产| 五月天婷婷综合网| 日韩成人dvd| 亚洲一区中文字幕在线观看| 天天操天天干天天爽| 久久精品视频免费观看| 在线观看精品视频| а√在线中文在线新版| 欧美在线观看视频一区二区| 亚欧美一区二区三区| 一区二区三区视频播放| 亚洲社区在线观看| 天天综合天天做| 久久午夜精品一区二区| 亚洲自拍小视频免费观看| 婷婷国产在线| 亚洲人妖av一区二区| 极品美女扒开粉嫩小泬| 亚洲精品成人一区| 亚洲精品一区二区三区不| 97精品在线播放| 国产欧美日韩一级| 91麻豆桃色免费看| 韩国三级av在线免费观看| 亚洲精品成人a在线观看| 99草草国产熟女视频在线| 欧美专区视频| 中文字幕不卡在线视频极品| 国产精品2020| 狠狠v欧美v日韩v亚洲ⅴ| 蜜桃导航-精品导航| 手机在线免费观看av| 在线一区二区三区四区五区| jjzzjjzz欧美69巨大| 久久亚洲国产| 青青草国产精品一区二区| 亚洲经典一区二区| 综合色天天鬼久久鬼色| 日韩视频第二页| 日韩免费高清视频网站| 色香阁99久久精品久久久| 久久久国产高清| 国产成人精品aa毛片| 老司机av福利| 国产亚洲人成a在线v网站| 日韩精品资源二区在线| 亚洲天堂av中文字幕| 中文高清一区| 精品视频免费观看| 成全电影大全在线观看| 日韩欧美一区电影| 老熟妻内射精品一区| 麻豆91精品91久久久的内涵| 日本在线观看一区二区| 欧美xx视频| 日韩精品免费电影| 欧美bbbbbbbbbbbb精品| 成人免费看黄yyy456| 精品免费久久久久久久| 天堂av一区| 久久综合伊人77777蜜臀| 一区二区三区麻豆| 久久精品一区二区三区av| 成人免费在线小视频| 日韩av午夜| 欧美在线视频网| 男操女在线观看| 色婷婷综合久久久久中文一区二区 | 亚洲 欧美 变态 另类 综合| 久久66热偷产精品| 国产精品美女在线播放| 外国成人毛片| 久久九九国产精品怡红院| 国产乱人乱偷精品视频| 一区二区三区在线视频观看| 免费黄色av网址| 99精品福利视频| 久热这里只精品99re8久| 欧美另类老肥妇| 亚洲性视频网址| 99re这里只有精品在线| 国产午夜一区二区三区| 熟女少妇精品一区二区| 亚洲女同中文字幕| 国产精品国产精品国产专区不卡| 182在线视频观看| 亚洲欧美日韩中文视频| 羞羞色院91蜜桃| 亚洲女人小视频在线观看| 自拍偷拍激情视频| 亚洲在线黄色| 亚洲区一区二区三区| 精品一区二区三区中文字幕| 久久久久中文字幕2018| 午夜性色福利影院| 欧美三级电影网站| 激情五月婷婷小说| 26uuu色噜噜精品一区二区| 女性隐私黄www网站视频| 四虎成人av| 国产精品美女黄网| 国产一区精品福利| 欧美激情第99页| 黄色在线视频观看网站| 91麻豆精品国产91久久久 | 三级小说欧洲区亚洲区| 国产精品亚洲视频在线观看| 先锋成人av| 国产一区二区三区在线播放免费观看| 91亚洲国产成人精品一区| 亚洲成人免费影院| 美国美女黄色片| 播五月开心婷婷综合| xx欧美撒尿嘘撒尿xx| 精品成人国产| 亚洲一区三区视频在线观看| 久久影院资源站| 成人亚洲激情网| 成人欧美大片| 欧美国产精品va在线观看| 女人天堂在线| 欧美一区二区啪啪| 中文字幕第四页| 亚洲成人www| 黄色录像二级片| 国产欧美日韩中文久久| 国产乱淫av片| 激情综合色综合久久| 黑鬼大战白妞高潮喷白浆| 国产精品av久久久久久麻豆网| 午夜精品福利一区二区| 欧美尿孔扩张虐视频| 91热精品视频| 精品国产黄a∨片高清在线| 91av在线网站| 欧美人体视频xxxxx| www国产亚洲精品久久网站| 黄色片在线播放| 亚洲精品国产欧美| 亚洲毛片在线播放| 制服丝袜激情欧洲亚洲| www.五月婷婷.com| 欧美性猛交xxxx久久久| 日韩精品国产一区二区| 夜夜精品视频一区二区| 青青青在线免费观看| 亚洲视频一二区| 国产夫妻性爱视频| 成人小视频在线观看| 午夜影院福利社| 国产成人av资源| 9191在线视频| 国产剧情一区二区三区| 黑人另类av| 看片的网站亚洲| 成人性教育视频在线观看| 日日av拍夜夜添久久免费| 久久人人爽人人爽人人片av高请 | 激情开心成人网| 国产91|九色| 深夜成人在线| 热久久免费视频精品| 成人爽a毛片免费啪啪| 4438全国成人免费| 国产免费不卡| 国产精品com| 日韩精品第一| 国产精品视频一| 男人天堂久久| 成人自拍性视频| 日日夜夜精品视频| 国产精品一区二区三区在线 | 91精品国产一区二区人妖| 91免费视频播放| 欧美一区二区高清| 国产 日韩 欧美 综合| 日韩成人在线视频观看| 青青草观看免费视频在线| 亚洲天堂影视av| 日本暖暖在线视频| 久久久精品欧美| 免费电影视频在线看| 91精品国产高清久久久久久| 成人直播视频| 成人黄色免费片| jazzjazz国产精品久久| 狠狠色噜噜狠狠色综合久 | 日本中文字幕一区二区视频| 国产视频一区二区视频| 蜜桃精品视频在线观看| 中文字幕第一页在线视频| 黄色资源网久久资源365| 特级西西人体wwwww| 国产精品久久777777| 免费网站观看www在线观| 欧美日韩国产精品一区| 天堂免费在线视频| 91精品国产乱| 亚洲欧美日韩精品永久在线| 在线视频日本亚洲性| 最新国产在线拍揄自揄视频| 69视频在线免费观看| 国产精品美女午夜爽爽| 国产精品乱码视频| 国内精品久久久久久久影视简单 | 又色又爽又黄18网站| 久久久久久免费网| 免费国产羞羞网站美图| 欧美视频专区一二在线观看| 亚洲精品国产精品国自产网站按摩| 欧美一区二区三区免费观看视频| 四虎影视在线播放| 久久亚洲一区二区三区四区五区高| 漫画在线观看av| 成人黄色短视频在线观看| 亚洲免费成人av在线| 中文字幕精品在线播放| 裸体一区二区| 无码人妻一区二区三区免费n鬼沢| 国产网站一区二区三区| 豆国产97在线 | 亚洲| 欧美在线观看视频一区二区三区| 黄色一级大片在线免费看国产一| 中文字幕亚洲一区在线观看 | 亚洲小说欧美激情另类| 最近中文字幕免费在线观看| 亚洲精品久久久久| а√中文在线8| 国产精品手机播放| 天美av一区二区三区久久| 国产爆乳无码一区二区麻豆 | 国产精品美女一区二区| 国产专区第一页| 亚洲精品在线观| √天堂8在线网| 国产日韩欧美另类| 精品香蕉视频| 欧美精品一区免费| 成人午夜碰碰视频| 欧美极品aaaaabbbbb| 91精品国产高清一区二区三区 | 国产人成一区二区三区影院| 男女视频免费看| 亚洲第一av网站| 精精国产xxxx视频在线中文版| 91亚洲精品一区| 91精品国产福利在线观看麻豆| 中文字幕成人在线视频| 国产日韩视频一区二区三区| 国产精品熟女视频| 国产婷婷色综合av蜜臀av| 日韩伦理在线一区| 精品视频第一区| 久久久久久一区二区| 亚洲午夜久久久久久久久红桃| 精品美女永久免费视频| 熟妇人妻系列aⅴ无码专区友真希| 色综合老司机第九色激情| 九九99久久精品在免费线bt| 综合视频在线观看| 国产一区在线观看视频| 国产性生活大片| 日韩视频免费观看高清完整版在线观看 | 欧美日韩久久久| 老司机精品视频在线观看6| 92看片淫黄大片欧美看国产片| 天天天综合网| 九九九久久久久久久| 一二三四社区欧美黄| 欧美一区二区三区成人片在线| 欧美男插女视频| 亚洲精品高潮| 国产h视频在线播放| 久久久精品国产99久久精品芒果| 国产日产精品一区二区三区| 亚洲欧洲在线免费| 久久影视精品| 日韩成人午夜影院| 成人综合在线观看| 亚洲天堂一区在线| 尤物yw午夜国产精品视频| 亚洲高清国产拍精品26u| 51xx午夜影福利| 成人激情文学综合网| 毛片在线免费视频| 亚洲午夜av久久乱码| 亚洲青青一区| 国产精品自拍片| 国产精品污网站| www.av网站| 欧美做受高潮1| 羞羞答答成人影院www| 韩国av中国字幕| 色94色欧美sute亚洲线路二| 麻豆影院在线| 国产一级特黄a大片99| 日韩精品成人一区二区三区| 99久久久免费精品|