Navbar.vue 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <nav class="navbar navbar-expand-lg fixed-top navbar-light navbar-dync">
  3. <div class="container">
  4. <RouterLink class="navbar-brand" :to="$localePath">
  5. <img
  6. v-if="$site.themeConfig.logo"
  7. class="logo"
  8. :src="$withBase($site.themeConfig.logo)"
  9. :alt="$siteTitle"
  10. >
  11. <span
  12. v-if="$siteTitle && !$site.themeConfig.logo"
  13. ref="siteName"
  14. >{{ $siteTitle }}</span>
  15. </RouterLink>
  16. <template v-if="links.length">
  17. <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  18. <span class="navbar-toggler-icon"></span>
  19. </button>
  20. <div class="collapse navbar-collapse" id="navbarSupportedContent">
  21. <ul class="navbar-nav ml-md-auto">
  22. <li class="nav-item mx-3" v-for="item in links" :key="item.link">
  23. <RouterLink
  24. v-if="!isExternal(item.link)"
  25. class="nav-link"
  26. :to="item.link"
  27. >
  28. {{item.text}}
  29. </RouterLink>
  30. <a v-else class="nav-link" :href="item.link" target="_blank">
  31. {{item.text}}
  32. <OutboundLink />
  33. </a>
  34. </li>
  35. </ul>
  36. </div>
  37. </template>
  38. </div>
  39. </nav>
  40. </template>
  41. <script>
  42. import { isExternal } from '@theme/utils'
  43. export default {
  44. name: 'Navbar',
  45. computed: {
  46. links() {
  47. const navs = this.$site.themeConfig.nav || []
  48. return navs
  49. }
  50. },
  51. mounted() {
  52. this.$themeScroll.listen((evt) => {
  53. const d = window.pageYOffset
  54. const actCls = 'navbar-dync-act'
  55. if (d > 10) {
  56. if (!this.$el.classList.contains(actCls)) {
  57. this.$el.classList.add(actCls)
  58. }
  59. } else {
  60. if (this.$el.classList.contains(actCls)) {
  61. this.$el.classList.remove(actCls)
  62. }
  63. }
  64. })
  65. },
  66. methods: {
  67. isExternal
  68. }
  69. }
  70. </script>
  71. <style lang="scss">
  72. .navbar {
  73. &.navbar-dync {
  74. transition: all 0.5s ease;
  75. background: transparent;
  76. .navbar-nav .nav-link {
  77. color: #333;
  78. }
  79. &-act {
  80. background-color: rgba(255, 255, 255, 0.75);
  81. }
  82. @media (max-width: 991.98px) {
  83. #navbarSupportedContent {
  84. background-color: rgba(255, 255, 255, 0.75);
  85. }
  86. }
  87. .navbar-toggler {
  88. border: none;
  89. outline: none;
  90. }
  91. }
  92. }
  93. </style>