Commit 87c343e461a3c9b9dcba94dd23ef95b69f75d002
1 parent
52830ca6
增加逻辑:
1.当吸顶的时候增加一个div标签占位,可让过度更加顺滑(原有逻辑当到达顶部的时候会会变成绝对定位,后面的标签就会立即顶上去,会有跳动的过程,体验不佳)
Showing
2 changed files
with
26 additions
and
4 deletions
Show diff stats
examples/routers/affix.vue
| @@ -10,12 +10,24 @@ | @@ -10,12 +10,24 @@ | ||
| 10 | } | 10 | } |
| 11 | </style> | 11 | </style> |
| 12 | <template> | 12 | <template> |
| 13 | +<div> | ||
| 13 | <Affix> | 14 | <Affix> |
| 14 | - <span class="demo-affix">固定在最顶部</span> | 15 | + <div class="demo-affix">固定在最顶部</div> |
| 15 | </Affix> | 16 | </Affix> |
| 17 | + <div v-for="(item,index) in arr">{{item}}</div> | ||
| 18 | +</div> | ||
| 16 | </template> | 19 | </template> |
| 17 | <script> | 20 | <script> |
| 18 | export default { | 21 | export default { |
| 19 | - | 22 | + data(){ |
| 23 | + return { | ||
| 24 | + arr: [] | ||
| 25 | + } | ||
| 26 | + }, | ||
| 27 | + created(){ | ||
| 28 | + for(let i = 0 ; i < 100 ; i++){ | ||
| 29 | + this.arr.push(i); | ||
| 30 | + } | ||
| 31 | + } | ||
| 20 | } | 32 | } |
| 21 | </script> | 33 | </script> |
src/components/affix/affix.vue
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | - <div :class="classes" :style="styles"> | 3 | + <div ref="point" :class="classes" :style="styles"> |
| 4 | <slot></slot> | 4 | <slot></slot> |
| 5 | </div> | 5 | </div> |
| 6 | + <div v-show="slot" :style="slotStyle"></div> | ||
| 6 | </div> | 7 | </div> |
| 7 | </template> | 8 | </template> |
| 8 | <script> | 9 | <script> |
| @@ -52,7 +53,9 @@ | @@ -52,7 +53,9 @@ | ||
| 52 | data () { | 53 | data () { |
| 53 | return { | 54 | return { |
| 54 | affix: false, | 55 | affix: false, |
| 55 | - styles: {} | 56 | + styles: {}, |
| 57 | + slot: false, | ||
| 58 | + slotStyle: {} | ||
| 56 | }; | 59 | }; |
| 57 | }, | 60 | }, |
| 58 | computed: { | 61 | computed: { |
| @@ -95,6 +98,11 @@ | @@ -95,6 +98,11 @@ | ||
| 95 | // Fixed Top | 98 | // Fixed Top |
| 96 | if ((elOffset.top - this.offsetTop) < scrollTop && this.offsetType == 'top' && !affix) { | 99 | if ((elOffset.top - this.offsetTop) < scrollTop && this.offsetType == 'top' && !affix) { |
| 97 | this.affix = true; | 100 | this.affix = true; |
| 101 | + this.slotStyle = { | ||
| 102 | + width: this.$refs.point.clientWidth + 'px', | ||
| 103 | + height: this.$refs.point.clientHeight + 'px' | ||
| 104 | + } | ||
| 105 | + this.slot = true; | ||
| 98 | this.styles = { | 106 | this.styles = { |
| 99 | top: `${this.offsetTop}px`, | 107 | top: `${this.offsetTop}px`, |
| 100 | left: `${elOffset.left}px`, | 108 | left: `${elOffset.left}px`, |
| @@ -103,6 +111,8 @@ | @@ -103,6 +111,8 @@ | ||
| 103 | 111 | ||
| 104 | this.$emit('on-change', true); | 112 | this.$emit('on-change', true); |
| 105 | } else if ((elOffset.top - this.offsetTop) > scrollTop && this.offsetType == 'top' && affix) { | 113 | } else if ((elOffset.top - this.offsetTop) > scrollTop && this.offsetType == 'top' && affix) { |
| 114 | + this.slot = false; | ||
| 115 | + this.slotStyle = {}; | ||
| 106 | this.affix = false; | 116 | this.affix = false; |
| 107 | this.styles = null; | 117 | this.styles = null; |
| 108 | 118 |