«Наверх» — плавная прокрутка страницы к началу, если пользователь уже прокрутил её более чем на 100px.
«Назад» — возврат на предыдущую страницу (по document.referrer), если прокрутки нет, но пользователь пришёл с другого сайта/страницы.
Кнопка скрыта по умолчанию и появляется только тогда, когда она действительно нужна.
Код
<style>
/*------------- #navbtn ---------------*/
#navbtn{
position: fixed;
right: auto;
bottom: 28px;
left: 28px;
top: auto;
width: 56px;
height: 56px;
display: none;
align-items: center;
justify-content: center;
border-radius: 50%;
background: #444;
box-shadow: 0 4px 14px rgba(45,68,94,0.25), 0 1px 3px rgba(0,0,0,0.08);
cursor: pointer;
z-index: 9999;
transition: transform .25s ease, box-shadow .25s ease, background .25s ease;
user-select: none;
}
#navbtn:hover{
transform: translateY(-3px);
box-shadow: 0 8px 20px rgba(45,68,94,0.3), 0 2px 6px rgba(0,0,0,0.1);
background: #555;
}
#navbtn:hover svg{stroke: #fff;}
#navbtn:hover .navlabel{ color:#fff; }
#navbtn:active{ transform: translateY(0) scale(.96); }
#navbtn.show{
display:flex;
animation: fadeInUp .3s ease;
}
#navbtn svg{
width: 22px;
height: 22px;
stroke: #fff;
stroke-width: 2.4;
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
transition: transform .3s ease, stroke .25s ease;
}
#navbtn.rotate svg{ transform: rotate(180deg); }
.navlabel{
position:absolute;
left:66px;
top:50%;
transform: translateY(-50%);
background:#2c3e50;
color:#fff;
font-size:12px;
font-weight:600;
padding:6px 10px;
border-radius:6px;
white-space:nowrap;
opacity:0;
pointer-events:none;
transition: opacity .2s ease, transform .2s ease;
}
.navlabel::after{
content: "";
position: absolute;
left: -9px;
top: 50%;
transform: translateY(-50%);
border-width: 5px;
border-style: solid;
border-color: transparent #2c3e50 transparent transparent;
}
#navbtn:hover .navlabel{
opacity:1;
transform: translateY(-50%) translateX(-4px);
}
@keyframes fadeInUp{
from{ opacity:0; transform: translateY(12px); }
to{ opacity:1; transform: translateY(0); }
}
@media (max-width:480px){
#navbtn{ right:16px; bottom:16px; width:60px; height:60px; }
.navlabel{ left:70px}
/*.navlabel{ display:none; } на мобильных подсказку прячем */
}</style>
<div id="navbtn" >
<svg id="navicon" viewBox="0 0 24 24"><path d="M12 19V5M5 12l7-7 7 7"/></svg>
<span class="navlabel" id="navlabel">Наверх</span>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const btn = document.getElementById('navbtn');
const label = document.getElementById('navlabel');
const icon = document.getElementById('navicon');
const ref = document.referrer && document.referrer !== location.href ? document.referrer : '';
const ARROW_UP = 'M12 19V5M5 12l7-7 7 7';
const ARROW_LEFT = 'M19 12H5M12 19l-7-7 7-7';
function update() {
const scrolled = window.scrollY > 100;
const shouldShow = scrolled || !!ref;
btn.classList.toggle('show', shouldShow);
if (scrolled) {
label.textContent = 'Наверх';
icon.querySelector('path').setAttribute('d', ARROW_UP);
btn.classList.remove('rotate');
} else if (ref) {
label.textContent = 'Назад';
icon.querySelector('path').setAttribute('d', ARROW_LEFT);
}
}
btn.addEventListener('click', () => {
if (window.scrollY > 100) {
window.scrollTo({ top: 0, behavior: 'smooth' });
} else if (ref) {
location.href = ref;
}
});
window.addEventListener('scroll', update, { passive: true });
update();
});
</script>
/*------------- #navbtn ---------------*/
#navbtn{
position: fixed;
right: auto;
bottom: 28px;
left: 28px;
top: auto;
width: 56px;
height: 56px;
display: none;
align-items: center;
justify-content: center;
border-radius: 50%;
background: #444;
box-shadow: 0 4px 14px rgba(45,68,94,0.25), 0 1px 3px rgba(0,0,0,0.08);
cursor: pointer;
z-index: 9999;
transition: transform .25s ease, box-shadow .25s ease, background .25s ease;
user-select: none;
}
#navbtn:hover{
transform: translateY(-3px);
box-shadow: 0 8px 20px rgba(45,68,94,0.3), 0 2px 6px rgba(0,0,0,0.1);
background: #555;
}
#navbtn:hover svg{stroke: #fff;}
#navbtn:hover .navlabel{ color:#fff; }
#navbtn:active{ transform: translateY(0) scale(.96); }
#navbtn.show{
display:flex;
animation: fadeInUp .3s ease;
}
#navbtn svg{
width: 22px;
height: 22px;
stroke: #fff;
stroke-width: 2.4;
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
transition: transform .3s ease, stroke .25s ease;
}
#navbtn.rotate svg{ transform: rotate(180deg); }
.navlabel{
position:absolute;
left:66px;
top:50%;
transform: translateY(-50%);
background:#2c3e50;
color:#fff;
font-size:12px;
font-weight:600;
padding:6px 10px;
border-radius:6px;
white-space:nowrap;
opacity:0;
pointer-events:none;
transition: opacity .2s ease, transform .2s ease;
}
.navlabel::after{
content: "";
position: absolute;
left: -9px;
top: 50%;
transform: translateY(-50%);
border-width: 5px;
border-style: solid;
border-color: transparent #2c3e50 transparent transparent;
}
#navbtn:hover .navlabel{
opacity:1;
transform: translateY(-50%) translateX(-4px);
}
@keyframes fadeInUp{
from{ opacity:0; transform: translateY(12px); }
to{ opacity:1; transform: translateY(0); }
}
@media (max-width:480px){
#navbtn{ right:16px; bottom:16px; width:60px; height:60px; }
.navlabel{ left:70px}
/*.navlabel{ display:none; } на мобильных подсказку прячем */
}</style>
<div id="navbtn" >
<svg id="navicon" viewBox="0 0 24 24"><path d="M12 19V5M5 12l7-7 7 7"/></svg>
<span class="navlabel" id="navlabel">Наверх</span>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const btn = document.getElementById('navbtn');
const label = document.getElementById('navlabel');
const icon = document.getElementById('navicon');
const ref = document.referrer && document.referrer !== location.href ? document.referrer : '';
const ARROW_UP = 'M12 19V5M5 12l7-7 7 7';
const ARROW_LEFT = 'M19 12H5M12 19l-7-7 7-7';
function update() {
const scrolled = window.scrollY > 100;
const shouldShow = scrolled || !!ref;
btn.classList.toggle('show', shouldShow);
if (scrolled) {
label.textContent = 'Наверх';
icon.querySelector('path').setAttribute('d', ARROW_UP);
btn.classList.remove('rotate');
} else if (ref) {
label.textContent = 'Назад';
icon.querySelector('path').setAttribute('d', ARROW_LEFT);
}
}
btn.addEventListener('click', () => {
if (window.scrollY > 100) {
window.scrollTo({ top: 0, behavior: 'smooth' });
} else if (ref) {
location.href = ref;
}
});
window.addEventListener('scroll', update, { passive: true });
update();
});
</script>

0 комментариев
Присоединиться к обсуждению
Поделитесь мнением об этом материале — комментарий появится в списке слева сразу после отправки.