Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
leizi929
Sortable
提交
d903902f
S
Sortable
项目概览
leizi929
/
Sortable
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Sortable
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d903902f
编写于
3月 02, 2019
作者:
O
owen-m1
浏览文件
操作
浏览文件
下载
差异文件
Merge commit '
f27342a2
'
上级
c6ae91ec
f27342a2
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
55 addition
and
38 deletion
+55
-38
Sortable.js
Sortable.js
+55
-38
未找到文件。
Sortable.js
浏览文件 @
d903902f
...
...
@@ -216,7 +216,7 @@
_getParentAutoScrollElement
=
function
(
el
,
includeSelf
)
{
// skip to window
if
(
!
el
||
!
el
.
getBoundingClientRect
)
return
win
;
if
(
!
el
||
!
el
.
getBoundingClientRect
)
return
_getWindowScrollingElement
()
;
var
elem
=
el
;
var
gotSelf
=
false
;
...
...
@@ -228,7 +228,7 @@
elem
.
clientWidth
<
elem
.
scrollWidth
&&
(
elemCSS
.
overflowX
==
'
auto
'
||
elemCSS
.
overflowX
==
'
scroll
'
)
||
elem
.
clientHeight
<
elem
.
scrollHeight
&&
(
elemCSS
.
overflowY
==
'
auto
'
||
elemCSS
.
overflowY
==
'
scroll
'
)
)
{
if
(
!
elem
||
!
elem
.
getBoundingClientRect
||
elem
===
document
.
body
)
return
win
;
if
(
!
elem
||
!
elem
.
getBoundingClientRect
||
elem
===
document
.
body
)
return
_getWindowScrollingElement
()
;
if
(
gotSelf
||
includeSelf
)
return
elem
;
gotSelf
=
true
;
...
...
@@ -237,7 +237,24 @@
/* jshint boss:true */
}
while
(
elem
=
elem
.
parentNode
);
return
win
;
return
_getWindowScrollingElement
();
},
_getWindowScrollingElement
=
function
()
{
if
(
IE11OrLess
)
{
return
document
.
documentElement
;
}
else
{
return
document
.
scrollingElement
;
}
},
_getScrollPosition
=
function
(
el
)
{
return
[
el
.
scrollLeft
,
el
.
scrollTop
];
},
_scrollBy
=
function
(
el
,
x
,
y
)
{
el
.
scrollLeft
+=
x
;
el
.
scrollTop
+=
y
;
},
_autoScroll
=
_throttle
(
function
(
/**Event*/
evt
,
/**Object*/
options
,
/**HTMLElement*/
rootEl
,
/**Boolean*/
isFallback
)
{
...
...
@@ -250,6 +267,8 @@
x
=
evt
.
clientX
,
y
=
evt
.
clientY
,
winScroller
=
_getWindowScrollingElement
(),
scrollThisInstance
=
false
;
// Detect scrollEl
...
...
@@ -295,28 +314,20 @@
scrollPosY
;
if
(
el
!==
win
)
{
scrollWidth
=
el
.
scrollWidth
;
scrollHeight
=
el
.
scrollHeight
;
css
=
_css
(
el
);
canScrollX
=
width
<
scrollWidth
&&
(
css
.
overflowX
===
'
auto
'
||
css
.
overflowX
===
'
scroll
'
);
canScrollY
=
height
<
scrollHeight
&&
(
css
.
overflowY
===
'
auto
'
||
css
.
overflowY
===
'
scroll
'
);
scrollWidth
=
el
.
scrollWidth
;
scrollHeight
=
el
.
scrollHeight
;
scrollPosX
=
el
.
scrollLeft
;
scrollPosY
=
el
.
scrollTop
;
}
else
{
scrollWidth
=
document
.
documentElement
.
scrollWidth
;
scrollHeight
=
document
.
documentElement
.
scrollHeight
;
css
=
_css
(
el
);
css
=
_css
(
document
.
documentElement
);
scrollPosX
=
el
.
scrollLeft
;
scrollPosY
=
el
.
scrollTop
;
if
(
el
===
winScroller
)
{
canScrollX
=
width
<
scrollWidth
&&
(
css
.
overflowX
===
'
auto
'
||
css
.
overflowX
===
'
scroll
'
||
css
.
overflowX
===
'
visible
'
);
canScrollY
=
height
<
scrollHeight
&&
(
css
.
overflowY
===
'
auto
'
||
css
.
overflowY
===
'
scroll
'
||
css
.
overflowY
===
'
visible
'
);
scrollPosX
=
document
.
documentElement
.
scrollLeft
;
scrollPosY
=
document
.
documentElement
.
scrollTop
;
}
else
{
canScrollX
=
width
<
scrollWidth
&&
(
css
.
overflowX
===
'
auto
'
||
css
.
overflowX
===
'
scroll
'
)
;
canScrollY
=
height
<
scrollHeight
&&
(
css
.
overflowY
===
'
auto
'
||
css
.
overflowY
===
'
scroll
'
)
;
}
vx
=
canScrollX
&&
(
abs
(
right
-
x
)
<=
sens
&&
(
scrollPosX
+
width
)
<
scrollWidth
)
-
(
abs
(
left
-
x
)
<=
sens
&&
!!
scrollPosX
);
...
...
@@ -355,17 +366,13 @@
return
;
}
}
if
(
autoScrolls
[
this
.
layer
].
el
===
win
)
{
win
.
scrollTo
(
win
.
pageXOffset
+
scrollOffsetX
,
win
.
pageYOffset
+
scrollOffsetY
);
}
else
{
autoScrolls
[
this
.
layer
].
el
.
scrollTop
+=
scrollOffsetY
;
autoScrolls
[
this
.
layer
].
el
.
scrollLeft
+=
scrollOffsetX
;
}
_scrollBy
(
autoScrolls
[
this
.
layer
].
el
,
scrollOffsetX
,
scrollOffsetY
);
}).
bind
({
layer
:
layersOut
}),
24
);
}
}
layersOut
++
;
}
while
(
options
.
bubbleScroll
&&
currentParent
!==
win
&&
(
currentParent
=
_getParentAutoScrollElement
(
currentParent
,
false
)));
}
while
(
options
.
bubbleScroll
&&
currentParent
!==
win
Scroller
&&
(
currentParent
=
_getParentAutoScrollElement
(
currentParent
,
false
)));
scrolling
=
scrollThisInstance
;
// in case another function catches scrolling as false in between when it is not
}
},
30
),
...
...
@@ -768,7 +775,7 @@
}
else
{
// if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
if
(
!
_this
.
options
.
bubbleScroll
||
_getParentAutoScrollElement
(
elem
,
true
)
===
window
)
{
if
(
!
_this
.
options
.
bubbleScroll
||
_getParentAutoScrollElement
(
elem
,
true
)
===
_getWindowScrollingElement
()
)
{
_clearAutoScrolls
();
return
;
}
...
...
@@ -1116,6 +1123,7 @@
}
},
// Returns true - if no further action is needed (either inserted or another condition)
_onDragOver
:
function
(
/**Event*/
evt
)
{
var
el
=
this
.
el
,
...
...
@@ -1254,11 +1262,14 @@
targetBeforeFirstSwap
,
aligned
=
target
.
sortableMouseAligned
,
differentLevel
=
dragEl
.
parentNode
!==
el
,
scrolledPastTop
=
_isScrolledPast
(
target
,
axis
===
'
vertical
'
?
'
top
'
:
'
left
'
);
side1
=
axis
===
'
vertical
'
?
'
top
'
:
'
left
'
,
scrolledPastTop
=
_isScrolledPast
(
target
,
side1
)
||
_isScrolledPast
(
dragEl
,
side1
),
scrollBefore
=
scrolledPastTop
?
_getScrollPosition
(
scrolledPastTop
)[
1
]
:
void
0
;
if
(
lastTarget
!==
target
)
{
lastMode
=
null
;
targetBeforeFirstSwap
=
_getRect
(
target
)[
axis
===
'
vertical
'
?
'
top
'
:
'
left
'
];
targetBeforeFirstSwap
=
_getRect
(
target
)[
side1
];
pastFirstInvertThresh
=
false
;
}
...
...
@@ -1275,7 +1286,7 @@
)
{
// New target that we will be inside
if
(
lastMode
!==
'
swap
'
)
{
isCircumstantialInvert
=
options
.
invertSwap
||
differentLevel
||
scrolling
||
scrolledPastTop
;
isCircumstantialInvert
=
options
.
invertSwap
||
differentLevel
;
}
direction
=
_getSwapDirection
(
evt
,
target
,
axis
,
...
...
@@ -1324,13 +1335,19 @@
target
.
parentNode
.
insertBefore
(
dragEl
,
after
?
nextSibling
:
target
);
}
// Undo chrome's scroll adjustment
if
(
scrolledPastTop
)
{
_scrollBy
(
scrolledPastTop
,
0
,
scrollBefore
-
_getScrollPosition
(
scrolledPastTop
)[
1
]);
}
parentEl
=
dragEl
.
parentNode
;
// actualization
// must be done before animation
if
(
targetBeforeFirstSwap
!==
undefined
&&
!
isCircumstantialInvert
)
{
targetMoveDistance
=
abs
(
targetBeforeFirstSwap
-
_getRect
(
target
)[
axis
===
'
vertical
'
?
'
top
'
:
'
left
'
]);
targetMoveDistance
=
abs
(
targetBeforeFirstSwap
-
_getRect
(
target
)[
side1
]);
}
changed
();
!
differentLevel
&&
this
.
_animate
(
targetRect
,
target
);
this
.
_animate
(
dragRect
,
dragEl
);
...
...
@@ -2226,7 +2243,6 @@
* @param {HTMLElement} el The element whose boundingClientRect is wanted
* @param {[HTMLElement]} container the parent the element will be placed in
* @param {[Boolean]} adjustForTransform Whether the rect should compensate for parent's transform
* (used for fixed positioning on el)
* @return {Object} The boundingClientRect of el
*/
function
_getRect
(
el
,
container
,
adjustForTransform
)
{
...
...
@@ -2240,7 +2256,7 @@
height
,
width
;
if
(
el
!==
win
)
{
if
(
el
!==
win
&&
el
!==
_getWindowScrollingElement
()
)
{
elRect
=
el
.
getBoundingClientRect
();
top
=
elRect
.
top
;
left
=
elRect
.
left
;
...
...
@@ -2312,10 +2328,11 @@
* Checks if a side of an element is scrolled past a side of it's parents
* @param {HTMLElement} el The element who's side being scrolled out of view is in question
* @param {String} side Side of the element in question ('top', 'left', 'right', 'bottom')
* @return {Boolean} Whether the element is overflowing the viewport on the given side of it's parent
* @return {int} Amount the element is overflowing over the specified side of it's parent scroll element
* @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
*/
function
_isScrolledPast
(
el
,
side
)
{
var
parent
=
_getParentAutoScrollElement
(
parent
,
true
),
var
parent
=
_getParentAutoScrollElement
(
el
,
true
),
elSide
=
_getRect
(
el
)[
side
];
/* jshint boss:true */
...
...
@@ -2329,9 +2346,9 @@
visible
=
elSide
<=
parentSide
;
}
if
(
!
visible
)
return
true
;
if
(
!
visible
)
return
parent
;
if
(
parent
===
win
)
break
;
if
(
parent
===
_getWindowScrollingElement
()
)
break
;
parent
=
_getParentAutoScrollElement
(
parent
,
false
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录