component.tpl 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <style>
  2. .page-component {
  3. box-sizing: border-box;
  4. height: 100%;
  5. &.page-container {
  6. padding: 0;
  7. }
  8. .page-component__nav {
  9. width: 240px;
  10. position: fixed;
  11. top: 0;
  12. bottom: 0;
  13. overflow: auto;
  14. padding-top: 80px;
  15. transition: padding-top .3s;
  16. &.is-extended {
  17. padding-top: 0;
  18. }
  19. }
  20. .side-nav {
  21. height: 100%;
  22. padding-top: 50px;
  23. padding-bottom: 50px;
  24. padding-right: 0;
  25. & > ul {
  26. padding-bottom: 50px;
  27. }
  28. }
  29. .page-component__content {
  30. padding-left: 270px;
  31. }
  32. .content {
  33. padding-top: 130px;
  34. > {
  35. h3 {
  36. margin: 45px 0 20px;
  37. }
  38. table {
  39. border-collapse: collapse;
  40. width: 100%;
  41. background-color: #fff;
  42. font-size: 14px;
  43. margin-bottom: 45px;
  44. line-height: 1.5em;
  45. strong {
  46. font-weight: normal;
  47. }
  48. td, th {
  49. border-bottom: 1px solid #eaeefb;
  50. padding: 15px;
  51. max-width: 250px;
  52. }
  53. th {
  54. text-align: left;
  55. white-space: nowrap;
  56. color: #666;
  57. font-weight: normal;
  58. }
  59. td {
  60. color: #333;
  61. }
  62. th:first-child, td:first-child {
  63. padding-left: 10px;
  64. }
  65. }
  66. ul:not(.timeline) {
  67. margin: 10px 0;
  68. padding: 0 0 0 20px;
  69. font-size: 14px;
  70. color: #5e6d82;
  71. line-height: 2em;
  72. }
  73. }
  74. }
  75. .page-component-up {
  76. background-color: #58b7ff;
  77. position: fixed;
  78. right: 100px;
  79. bottom: 150px;
  80. size: 50px;
  81. border-radius: 25px;
  82. cursor: pointer;
  83. opacity: 0.4;
  84. transition: .3s;
  85. i {
  86. color: #fff;
  87. display: block;
  88. line-height: 50px;
  89. text-align: center;
  90. font-size: 22px;
  91. }
  92. &.hover {
  93. opacity: 1;
  94. }
  95. }
  96. .back-top-fade-enter,
  97. .back-top-fade-leave-active {
  98. transform: translateY(-30px);
  99. opacity: 0;
  100. }
  101. }
  102. </style>
  103. <template>
  104. <div class="page-container page-component">
  105. <div
  106. class="page-component__nav"
  107. :class="{ 'is-extended': !showHeader }">
  108. <side-nav :data="navsData[lang]" :base="`/${ lang }/component`"></side-nav>
  109. </div>
  110. <div class="page-component__content">
  111. <router-view class="content"></router-view>
  112. <footer-nav></footer-nav>
  113. </div>
  114. <transition name="back-top-fade">
  115. <div
  116. class="page-component-up"
  117. :class="{ 'hover': hover }"
  118. v-show="showBackToTop"
  119. @mouseenter="hover = true"
  120. @mouseleave="hover = false"
  121. @click="toTop">
  122. <i class="el-icon-caret-top"></i>
  123. </div>
  124. </transition>
  125. </div>
  126. </template>
  127. <script>
  128. import bus from '../../bus';
  129. import navsData from '../../nav.config.json';
  130. import throttle from 'throttle-debounce/throttle';
  131. export default {
  132. data() {
  133. return {
  134. lang: this.$route.meta.lang,
  135. navsData,
  136. hover: false,
  137. showBackToTop: false,
  138. scrollTop: 0,
  139. showHeader: true
  140. };
  141. },
  142. methods: {
  143. toTop() {
  144. this.hover = false;
  145. this.showBackToTop = false;
  146. document.body.scrollTop = 0;
  147. document.documentElement.scrollTop = 0;
  148. },
  149. handleScroll() {
  150. const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
  151. this.showBackToTop = scrollTop >= 0.5 * document.body.clientHeight;
  152. if (this.showHeader !== this.scrollTop > scrollTop) {
  153. this.showHeader = this.scrollTop > scrollTop;
  154. bus.$emit('toggleHeader', this.showHeader);
  155. }
  156. if (scrollTop === 0) {
  157. this.showHeader = true;
  158. bus.$emit('toggleHeader', this.showHeader);
  159. }
  160. this.scrollTop = scrollTop;
  161. }
  162. },
  163. mounted() {
  164. this.throttledScrollHandler = throttle(300, this.handleScroll);
  165. document.addEventListener('scroll', this.throttledScrollHandler);
  166. },
  167. beforeDestroy() {
  168. document.removeEventListener('scroll', this.throttledScrollHandler);
  169. }
  170. };
  171. </script>