mirror of
				https://gitee.com/vant-contrib/vant.git
				synced 2025-11-04 12:52:08 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			273 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			273 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <div class="van-doc-header">
 | 
						|
    <div class="van-doc-row">
 | 
						|
      <div class="van-doc-header__top">
 | 
						|
        <a class="van-doc-header__logo">
 | 
						|
          <img :src="config.logo" />
 | 
						|
          <span>{{ config.title }}</span>
 | 
						|
        </a>
 | 
						|
 | 
						|
        <search-input
 | 
						|
          v-if="searchConfig"
 | 
						|
          :lang="lang"
 | 
						|
          :search-config="searchConfig"
 | 
						|
        />
 | 
						|
 | 
						|
        <ul class="van-doc-header__top-nav">
 | 
						|
          <li v-for="item in config.links" class="van-doc-header__top-nav-item">
 | 
						|
            <a
 | 
						|
              class="van-doc-header__logo-link"
 | 
						|
              target="_blank"
 | 
						|
              :href="item.url"
 | 
						|
            >
 | 
						|
              <img :src="item.logo" />
 | 
						|
            </a>
 | 
						|
          </li>
 | 
						|
 | 
						|
          <li
 | 
						|
            ref="version"
 | 
						|
            v-if="versions"
 | 
						|
            class="van-doc-header__top-nav-item"
 | 
						|
          >
 | 
						|
            <span
 | 
						|
              class="van-doc-header__cube van-doc-header__version"
 | 
						|
              @click="toggleVersionPop"
 | 
						|
            >
 | 
						|
              {{ versions[0].label }}
 | 
						|
              <transition name="van-doc-dropdown">
 | 
						|
                <div v-if="showVersionPop" class="van-doc-header__version-pop">
 | 
						|
                  <div
 | 
						|
                    v-for="item in versions"
 | 
						|
                    class="van-doc-header__version-pop-item"
 | 
						|
                    @click="onSwitchVersion(item)"
 | 
						|
                  >
 | 
						|
                    {{ item.label }}
 | 
						|
                  </div>
 | 
						|
                </div>
 | 
						|
              </transition>
 | 
						|
            </span>
 | 
						|
          </li>
 | 
						|
 | 
						|
          <li v-if="langLabel && langLink" class="van-doc-header__top-nav-item">
 | 
						|
            <a class="van-doc-header__cube" :href="langLink">{{ langLabel }}</a>
 | 
						|
          </li>
 | 
						|
        </ul>
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import SearchInput from './SearchInput';
 | 
						|
 | 
						|
export default {
 | 
						|
  name: 'van-doc-header',
 | 
						|
 | 
						|
  components: {
 | 
						|
    SearchInput,
 | 
						|
  },
 | 
						|
 | 
						|
  props: {
 | 
						|
    lang: String,
 | 
						|
    config: Object,
 | 
						|
    versions: Array,
 | 
						|
    langConfigs: Array,
 | 
						|
  },
 | 
						|
 | 
						|
  data() {
 | 
						|
    return {
 | 
						|
      showVersionPop: false,
 | 
						|
    };
 | 
						|
  },
 | 
						|
 | 
						|
  computed: {
 | 
						|
    langLink() {
 | 
						|
      return `#${this.$route.path.replace(this.lang, this.anotherLang.lang)}`;
 | 
						|
    },
 | 
						|
 | 
						|
    langLabel() {
 | 
						|
      return this.anotherLang.label;
 | 
						|
    },
 | 
						|
 | 
						|
    anotherLang() {
 | 
						|
      const items = this.langConfigs.filter(item => item.lang !== this.lang);
 | 
						|
      if (items.length) {
 | 
						|
        return items[0];
 | 
						|
      }
 | 
						|
 | 
						|
      return {};
 | 
						|
    },
 | 
						|
 | 
						|
    searchConfig() {
 | 
						|
      return this.config.searchConfig;
 | 
						|
    },
 | 
						|
  },
 | 
						|
 | 
						|
  methods: {
 | 
						|
    toggleVersionPop() {
 | 
						|
      const val = !this.showVersionPop;
 | 
						|
 | 
						|
      const action = val ? 'add' : 'remove';
 | 
						|
      document.body[`${action}EventListener`](
 | 
						|
        'click',
 | 
						|
        this.checkHideVersionPop
 | 
						|
      );
 | 
						|
 | 
						|
      this.showVersionPop = val;
 | 
						|
    },
 | 
						|
 | 
						|
    checkHideVersionPop(event) {
 | 
						|
      if (!this.$refs.version.contains(event.target)) {
 | 
						|
        this.showVersionPop = false;
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    onSwitchLang(lang) {
 | 
						|
      this.$router.push(this.$route.path.replace(lang.from, lang.to));
 | 
						|
    },
 | 
						|
 | 
						|
    onSwitchVersion(version) {
 | 
						|
      if (version.link) {
 | 
						|
        location.href = version.link;
 | 
						|
      }
 | 
						|
    },
 | 
						|
  },
 | 
						|
};
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="less">
 | 
						|
@import '../../common/style/var';
 | 
						|
 | 
						|
.van-doc-header {
 | 
						|
  width: 100%;
 | 
						|
  background-color: #001938;
 | 
						|
  user-select: none;
 | 
						|
 | 
						|
  &__top {
 | 
						|
    display: flex;
 | 
						|
    align-items: center;
 | 
						|
    height: @van-doc-header-top-height;
 | 
						|
    padding: 0 @van-doc-padding;
 | 
						|
    line-height: @van-doc-header-top-height;
 | 
						|
 | 
						|
    &-nav {
 | 
						|
      flex: 1;
 | 
						|
      font-size: 0;
 | 
						|
      text-align: right;
 | 
						|
 | 
						|
      > li {
 | 
						|
        position: relative;
 | 
						|
        display: inline-block;
 | 
						|
        vertical-align: middle;
 | 
						|
      }
 | 
						|
 | 
						|
      &-item {
 | 
						|
        margin-left: 20px;
 | 
						|
      }
 | 
						|
 | 
						|
      &-title {
 | 
						|
        display: block;
 | 
						|
        font-size: 15px;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  &__cube {
 | 
						|
    position: relative;
 | 
						|
    display: block;
 | 
						|
    padding: 0 12px;
 | 
						|
    color: #fff;
 | 
						|
    font-size: 14px;
 | 
						|
    line-height: 24px;
 | 
						|
    text-align: center;
 | 
						|
    border: 1px solid rgba(255, 255, 255, 0.7);
 | 
						|
    border-radius: 20px;
 | 
						|
    cursor: pointer;
 | 
						|
    transition: 0.3s ease-in-out;
 | 
						|
  }
 | 
						|
 | 
						|
  &__version {
 | 
						|
    padding-right: 20px;
 | 
						|
 | 
						|
    &::after {
 | 
						|
      position: absolute;
 | 
						|
      top: 7px;
 | 
						|
      right: 7px;
 | 
						|
      width: 5px;
 | 
						|
      height: 5px;
 | 
						|
      color: rgba(255, 255, 255, 0.9);
 | 
						|
      border: 1px solid;
 | 
						|
      border-color: transparent transparent currentColor currentColor;
 | 
						|
      transform: rotate(-45deg);
 | 
						|
      content: '';
 | 
						|
    }
 | 
						|
 | 
						|
    &-pop {
 | 
						|
      position: absolute;
 | 
						|
      top: 30px;
 | 
						|
      right: 0;
 | 
						|
      left: 0;
 | 
						|
      z-index: 99;
 | 
						|
      color: #333;
 | 
						|
      line-height: 36px;
 | 
						|
      text-align: left;
 | 
						|
      background-color: #fff;
 | 
						|
      border-radius: @van-doc-border-radius;
 | 
						|
      box-shadow: 0 4px 12px #ebedf0;
 | 
						|
      transform-origin: top;
 | 
						|
      transition: 0.2s cubic-bezier(0.215, 0.61, 0.355, 1);
 | 
						|
 | 
						|
      &-item {
 | 
						|
        padding-left: 12px;
 | 
						|
        transition: 0.2s;
 | 
						|
 | 
						|
        &:hover {
 | 
						|
          color: @van-doc-blue;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  &__logo {
 | 
						|
    display: block;
 | 
						|
 | 
						|
    img,
 | 
						|
    span {
 | 
						|
      display: inline-block;
 | 
						|
      vertical-align: middle;
 | 
						|
    }
 | 
						|
 | 
						|
    img {
 | 
						|
      width: 24px;
 | 
						|
      margin-right: 10px;
 | 
						|
    }
 | 
						|
 | 
						|
    span {
 | 
						|
      color: #fff;
 | 
						|
      font-size: 22px;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  &__logo-link {
 | 
						|
    img {
 | 
						|
      display: block;
 | 
						|
      width: 26px;
 | 
						|
      height: 26px;
 | 
						|
      transition: 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
 | 
						|
 | 
						|
      &:hover {
 | 
						|
        transform: scale(1.2);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
.van-doc-dropdown {
 | 
						|
  &-enter,
 | 
						|
  &-leave-active {
 | 
						|
    transform: scaleY(0);
 | 
						|
    opacity: 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
</style>
 |