UPDATE,
在 Droppable 中有個屬性叫做 tolerance
(簡稱叫阿縮比(疑),他可以設定幾種 Drag&Drop 中 drop
的發生情況。預設是使用 intersect
(交叉),當兩個物件交疊 50% 以上,則判定為真。而其他的設定值則為:fit
,touch
與 pointer
。
fit
是放置物件要完全放入目標物件,才會觸發。這麼說好了,倘若你買了一組沙發,放不進購物車也是很正常的(喂)。而 touch
則是,不管你買啥鬼東西,只要碰到購物車就會自動放進去(好貼心)。最後 pointer
則是,滑鼠抓取的位置進入目標物件之後才觸發,換句話說就是,要親手放進去才算。
但是!只有 pointer
不會發生漂移情況,fit
與 touch
還是會跟 intersect
一樣!
因為要用到,所以非得來筆記一下才行。在 jQuery UI 中提供了很多很方便的工具,但是,這些工具也不是完全沒有問題。例如,draggable 所說的 bind('drag') 其實沒有什麼效果(其他的也一樣)。至於為什麼?我比較好奇的反而是,為什麼官方要這樣寫,實際測試的時候 沒有 bind 的效果 啊(摔滑鼠)。
另外呢,draggable 在 Firefox 上還是有 視窗內 scrollbar 捲動的位移問題 ,然後這個禍害延燒到 sortable 套件上,只要視窗的 scrollbar 有捲動,你所抓取的物件就會亂飄。雖然說這件事情問萬能的 Google 大神就可以找到解法,不過我還是好心的提供一下解決方法(總之,這就是 UI 對 Firefox 的一個 bug,用清除 margin-top
可以解決)。
// 前略
start: function (event, ui) {
if( ui.helper !== undefined )
ui.helper.css('position','absolute').css('margin-top', $(window).scrollTop() );
},
beforeStop: function (event, ui) {
if( ui.offset !== undefined )
ui.helper.css('margin-top', 0);
},
// 後略
接著是 droppable,如果你的目標物件有留白,那你的放置物件就會發生錯位問題。講白話一點,就是你想買得東西要 某種角度 才放得進購物車。以 draggable 與 droppable 來說,你的目標物件(droppable)如果有設定留白(margin
, padding
)偏移,那麼你的放置物件(draggable)就會放不太進去。
因為放置物件要觸發目標物件的 dropover,必須是放置物件中心點(Natural Size)接近目標物件的邊緣,才會發生。問題是,如果目標物件偏移了(通常是為了視覺效果對齊等等),那麼,你的放置物件就會有一個 隱形的偏移量,你的放置物件就得歪著擺才行!!!
所以?我想了一個還不錯骯髒的作法。
$('.item')
.draggable({ ...中略... })
.css({
'margin-top':-15px, // 看你偏移多少就補多少
'margin-left':-15px // 看你偏移多少就補多少
});
至於其他的,目前是沒遇到什麼鬼打牆的事件,所以暫時就這樣吧!