FloorBar.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <ul class="floor-bar list-unstyled" :class="{hide: !visible}">
  3. <li v-for="(floor, index) in floors.data" :key="index" class="floor-bar-item">
  4. <a @click="jumpFloor(index)"
  5. :style="{backgroundColor: index==activeFloor?floor.items[1].backGroundColor:'#b7dfff'}">
  6. <span>F{{ floor.floorNumber }}</span><br/>
  7. <span class="floor-item-name">{{ floor.name }}</span>
  8. </a>
  9. </li>
  10. </ul>
  11. </template>
  12. <script>
  13. import { scrollTo } from '~utils/scroll'
  14. export default {
  15. name: 'floor-bar',
  16. props: {
  17. floors: {
  18. type: Object
  19. }
  20. },
  21. data () {
  22. return {
  23. visible: false,
  24. activeFloor: -1
  25. }
  26. },
  27. methods: {
  28. onScroll () {
  29. let scrolled = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
  30. let floors = document.querySelectorAll('.floor')
  31. let barOffset = document.querySelector('.floor-bar').offsetTop
  32. this.visible = (barOffset >= floors[0].offsetTop - scrolled &&
  33. barOffset <= floors[floors.length - 1].offsetTop - scrolled + floors[floors.length - 1].clientHeight)
  34. if (this.visible) {
  35. for (let i = 0; i < floors.length; i++) {
  36. if (barOffset >= floors[i].offsetTop - scrolled + 60) {
  37. this.activeFloor = i
  38. }
  39. }
  40. }
  41. },
  42. jumpFloor (index) {
  43. if (this.visible) {
  44. scrollTo(document.querySelectorAll('.floor').item(index), 300, { offset: -60 })
  45. }
  46. }
  47. },
  48. mounted: function () {
  49. this.$nextTick(function () {
  50. window.addEventListener('scroll', this.onScroll)
  51. })
  52. }
  53. }
  54. </script>
  55. <style lang="scss" scoped>
  56. .floor-bar {
  57. position: fixed;
  58. margin-left: -70px;
  59. width: 60px;
  60. bottom: 20%;
  61. .floor-bar-item {
  62. margin-bottom: 1px;
  63. text-align: center;
  64. a {
  65. display: block;
  66. width: 60px;
  67. height: 45px;
  68. padding-top: 5px;
  69. background-color: #b7dfff;
  70. color: #fff;
  71. overflow: hidden;
  72. .floor-item-name {
  73. font-size: 12px;
  74. display: inline-block;
  75. }
  76. }
  77. }
  78. }
  79. </style>