FloorBar.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. floor_scrollTop: 777
  26. }
  27. },
  28. methods: {
  29. onScroll () {
  30. let scrolled = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
  31. let floors = document.querySelectorAll('.floor')
  32. let barOffset = document.querySelector('.floor-bar').offsetTop
  33. // console.log(floors[floors.length - 1].offsetTop)
  34. if (floors[0].offsetTop === 0) {
  35. this.visible = scrolled >= floors[0].offsetTop + this.floor_scrollTop - 285 && scrolled <= floors[floors.length - 1].offsetTop + this.floor_scrollTop
  36. if (this.visible) {
  37. for (let i = 0; i < floors.length; i++) {
  38. if (barOffset >= floors[i].offsetTop + this.floor_scrollTop - scrolled + 60) {
  39. this.activeFloor = i
  40. }
  41. }
  42. }
  43. } else {
  44. this.visible = scrolled >= floors[0].offsetTop - 285 && scrolled <= floors[floors.length - 1].offsetTop
  45. if (this.visible) {
  46. for (let i = 0; i < floors.length; i++) {
  47. if (barOffset >= floors[i].offsetTop - scrolled + 60) {
  48. this.activeFloor = i
  49. }
  50. }
  51. }
  52. }
  53. /* let barOffset2 = 0
  54. this.visible = (barOffset >= floors[0].offsetTop - scrolled &&
  55. barOffset2 <= floors[floors.length - 1].offsetTop - scrolled + floors[floors.length - 1].clientHeight)
  56. if (this.visible) {
  57. for (let i = 0; i < floors.length; i++) {
  58. if (barOffset >= floors[i].offsetTop - scrolled + 60) {
  59. this.activeFloor = i
  60. }
  61. }
  62. } */
  63. },
  64. jumpFloor (index) {
  65. if (this.visible) {
  66. scrollTo(document.querySelectorAll('.floor').item(index), 300, { offset: -60 })
  67. }
  68. }
  69. },
  70. mounted: function () {
  71. this.$nextTick(function () {
  72. window.addEventListener('scroll', this.onScroll)
  73. })
  74. }
  75. }
  76. </script>
  77. <style lang="scss" scoped>
  78. .floor-bar {
  79. position: fixed;
  80. margin-left: -70px;
  81. width: 60px;
  82. bottom: 20%;
  83. .floor-bar-item {
  84. margin-bottom: 1px;
  85. text-align: center;
  86. a {
  87. display: block;
  88. width: 60px;
  89. height: 45px;
  90. padding-top: 5px;
  91. background-color: #b7dfff;
  92. color: #fff;
  93. overflow: hidden;
  94. .floor-item-name {
  95. font-size: 12px;
  96. display: inline-block;
  97. }
  98. }
  99. }
  100. }
  101. </style>