FloorBar.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. let barOffset2 = 0
  33. this.visible = (barOffset >= floors[0].offsetTop - scrolled &&
  34. barOffset2 <= floors[floors.length - 1].offsetTop - scrolled + floors[floors.length - 1].clientHeight)
  35. if (this.visible) {
  36. for (let i = 0; i < floors.length; i++) {
  37. if (barOffset >= floors[i].offsetTop - scrolled + 60) {
  38. this.activeFloor = i
  39. }
  40. }
  41. }
  42. console.log(barOffset)
  43. },
  44. jumpFloor (index) {
  45. if (this.visible) {
  46. scrollTo(document.querySelectorAll('.floor').item(index), 300, { offset: -60 })
  47. }
  48. }
  49. },
  50. mounted: function () {
  51. this.$nextTick(function () {
  52. window.addEventListener('scroll', this.onScroll)
  53. })
  54. }
  55. }
  56. </script>
  57. <style lang="scss" scoped>
  58. .floor-bar {
  59. position: fixed;
  60. margin-left: -70px;
  61. width: 60px;
  62. bottom: 20%;
  63. .floor-bar-item {
  64. margin-bottom: 1px;
  65. text-align: center;
  66. a {
  67. display: block;
  68. width: 60px;
  69. height: 45px;
  70. padding-top: 5px;
  71. background-color: #b7dfff;
  72. color: #fff;
  73. overflow: hidden;
  74. .floor-item-name {
  75. font-size: 12px;
  76. display: inline-block;
  77. }
  78. }
  79. }
  80. }
  81. </style>