FloorBar.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. },
  43. jumpFloor (index) {
  44. if (this.visible) {
  45. scrollTo(document.querySelectorAll('.floor').item(index), 300, { offset: -60 })
  46. }
  47. }
  48. },
  49. mounted: function () {
  50. this.$nextTick(function () {
  51. window.addEventListener('scroll', this.onScroll)
  52. })
  53. }
  54. }
  55. </script>
  56. <style lang="scss" scoped>
  57. .floor-bar {
  58. position: fixed;
  59. margin-left: -70px;
  60. width: 60px;
  61. bottom: 20%;
  62. .floor-bar-item {
  63. margin-bottom: 1px;
  64. text-align: center;
  65. a {
  66. display: block;
  67. width: 60px;
  68. height: 45px;
  69. padding-top: 5px;
  70. background-color: #b7dfff;
  71. color: #fff;
  72. overflow: hidden;
  73. .floor-item-name {
  74. font-size: 12px;
  75. display: inline-block;
  76. }
  77. }
  78. }
  79. }
  80. </style>