12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- <template>
- <transition name="fade">
- <svg
- v-if="show"
- class="go-to-top"
- xmlns="http://www.w3.org/2000/svg"
- viewBox="0 0 49.484 28.284"
- @click="scrollToTop"
- >
- <g transform="translate(-229 -126.358)">
- <rect
- fill="currentColor"
- width="35"
- height="5"
- rx="2"
- transform="translate(229 151.107) rotate(-45)"
- />
- <rect
- fill="currentColor"
- width="35"
- height="5"
- rx="2"
- transform="translate(274.949 154.642) rotate(-135)"
- />
- </g>
- </svg>
- </transition>
- </template>
- <script>
- import debounce from 'lodash.debounce'
- export default {
- name: 'BackToTop',
- props: {
- threshold: {
- type: Number,
- default: 300
- }
- },
- data () {
- return {
- scrollTop: null
- }
- },
- computed: {
- show () {
- return this.scrollTop > this.threshold
- }
- },
- mounted () {
- this.scrollTop = this.getScrollTop()
- window.addEventListener('scroll', debounce(() => {
- this.scrollTop = this.getScrollTop()
- }, 100))
- },
- methods: {
- getScrollTop () {
- return window.pageYOffset
- || document.documentElement.scrollTop
- || document.body.scrollTop || 0
- },
- scrollToTop () {
- window.scrollTo({ top: 0, behavior: 'smooth' })
- this.scrollTop = 0
- }
- }
- }
- </script>
- <style lang='stylus' scoped>
- .go-to-top {
- cursor: pointer;
- position: fixed;
- bottom: 1rem;
- right: .8rem;
- width: 2rem;
- color: #808080;
- z-index: 3;
- }
- .go-to-top:hover {
- color: lighten(#808080, 30%);
- }
- @media (max-width: 959px) {
- .go-to-top {
- display: none;
- }
- }
- .fade-enter-active, .fade-leave-active {
- transition: opacity 0.3s;
- }
- .fade-enter, .fade-leave-to {
- opacity: 0;
- }
- </style>
|