blob: f8d8b88fbf3c6f3aaa76d6eaface0a9fd9166538 [file] [log] [blame] [edit]
<template>
<b-button
id="scrollToTopBtn"
class="btn-top btn-icon-only"
:class="{ 'show-btn': showButton }"
variant="secondary"
:title="$t('global.ariaLabel.scrollToTop')"
@click="scrollToTop"
>
<icon-up-to-top />
<span class="sr-only">{{ $t('global.ariaLabel.scrollToTop') }}</span>
</b-button>
</template>
<script>
import UpToTop24 from '@carbon/icons-vue/es/up-to-top/24';
import { debounce } from 'lodash';
import { useI18n } from 'vue-i18n';
export default {
name: 'BackToTop',
components: { IconUpToTop: UpToTop24 },
data() {
return {
$t: useI18n().t,
showButton: false,
};
},
created() {
window.addEventListener('scroll', debounce(this.handleScroll, 200));
},
methods: {
handleScroll() {
document.documentElement.scrollTop > 500
? (this.showButton = true)
: (this.showButton = false);
},
scrollToTop() {
document.documentElement.scrollTo({
top: 0,
behavior: 'smooth',
});
},
},
};
</script>
<style lang="scss" scoped>
@import '@/assets/styles/bmc/helpers/_index.scss';
@import '@/assets/styles/bootstrap/_helpers.scss';
.btn-top {
position: fixed;
bottom: 24px;
right: 24px;
box-shadow: $box-shadow;
visibility: hidden;
opacity: 0;
transition: $transition-base;
z-index: $zindex-fixed;
@media (min-width: 1600px) {
left: 1485px;
right: auto;
}
}
.show-btn {
visibility: visible;
opacity: 1;
}
</style>