55</template >
66
77<script >
8- const padding = 15 // tag's padding
8+ const tagAndTagSpacing = 4 // tagAndTagSpacing
99
1010export default {
1111 name: ' ScrollPane' ,
@@ -20,18 +20,54 @@ export default {
2020 const $scrollWrapper = this .$refs .scrollContainer .$refs .wrap
2121 $scrollWrapper .scrollLeft = $scrollWrapper .scrollLeft + eventDelta / 4
2222 },
23- moveToTarget ($target ) {
23+ moveToTarget (currentTag ) {
2424 const $container = this .$refs .scrollContainer .$el
2525 const $containerWidth = $container .offsetWidth
2626 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
3259 } 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+ }
3571 }
3672 }
3773 }
0 commit comments