5
5
</template >
6
6
7
7
<script >
8
- const padding = 15 // tag's padding
8
+ const tagAndTagSpacing = 4 // tagAndTagSpacing
9
9
10
10
export default {
11
11
name: ' ScrollPane' ,
@@ -20,18 +20,54 @@ export default {
20
20
const $scrollWrapper = this .$refs .scrollContainer .$refs .wrap
21
21
$scrollWrapper .scrollLeft = $scrollWrapper .scrollLeft + eventDelta / 4
22
22
},
23
- moveToTarget ($target ) {
23
+ moveToTarget (currentTag ) {
24
24
const $container = this .$refs .scrollContainer .$el
25
25
const $containerWidth = $container .offsetWidth
26
26
const $scrollWrapper = this .$refs .scrollContainer .$refs .wrap
27
- const $targetLeft = $target .offsetLeft
28
- const $targetWidth = $target .offsetWidth
29
- if ($targetLeft > $containerWidth) {
30
- // tag in the right
31
- $scrollWrapper .scrollLeft = $targetLeft - $containerWidth + $targetWidth + padding
27
+ const tagList = this .$parent .$refs .tag
28
+
29
+ let firstTag = null
30
+ let lastTag = null
31
+ let prevTag = null
32
+ let nextTag = null
33
+
34
+ // find first tag and last tag
35
+ if (tagList .length > 0 ) {
36
+ firstTag = tagList[0 ]
37
+ lastTag = tagList[tagList .length - 1 ]
38
+ }
39
+
40
+ // find preTag and nextTag
41
+ for (let i = 0 ; i < tagList .length ; i++ ) {
42
+ if (tagList[i] === currentTag) {
43
+ if (i === 0 ) {
44
+ nextTag = tagList[i].length > 1 && tagList[i + 1 ]
45
+ } else if (i === tagList .length - 1 ) {
46
+ prevTag = tagList[i].length > 1 && tagList[i - 1 ]
47
+ } else {
48
+ prevTag = tagList[i - 1 ]
49
+ nextTag = tagList[i + 1 ]
50
+ }
51
+ break
52
+ }
53
+ }
54
+
55
+ if (firstTag === currentTag) {
56
+ $scrollWrapper .scrollLeft = 0
57
+ } else if (lastTag === currentTag) {
58
+ $scrollWrapper .scrollLeft = $scrollWrapper .scrollWidth - $containerWidth
32
59
} else {
33
- // tag in the left
34
- $scrollWrapper .scrollLeft = $targetLeft - padding
60
+ // the tag's offsetLeft after of nextTag
61
+ const afterNextTagOffsetLeft = nextTag .$el .offsetLeft + nextTag .$el .offsetWidth + tagAndTagSpacing
62
+
63
+ // the tag's offsetLeft before of prevTag
64
+ const beforePrevTagOffsetLeft = prevTag .$el .offsetLeft - tagAndTagSpacing
65
+
66
+ if (afterNextTagOffsetLeft > $scrollWrapper .scrollLeft + $containerWidth) {
67
+ $scrollWrapper .scrollLeft = afterNextTagOffsetLeft - $containerWidth
68
+ } else if (beforePrevTagOffsetLeft < $scrollWrapper .scrollLeft ) {
69
+ $scrollWrapper .scrollLeft = beforePrevTagOffsetLeft
70
+ }
35
71
}
36
72
}
37
73
}
0 commit comments