Такую функцию «наверх» часто можно увидеть в некоторых документах или статьях, и есть два конкретных взаимодействия.
- Он появляется только при прокрутке на определенное расстояние, вернитесь наверх, чтобы снова скрыть
- Нажмите, чтобы вернуться наверх
Например LuLu UI
Нажимается снова, и снова прокручивается, похоже, придется использовать помощьJavaScriptНу, на самом деле, это не обязательно.Поразмыслив, я могу добиться такого интерактивного эффекта с помощью небольшого количества CSS.Давайте посмотрим.
1. Залипающая прокрутка
нужно здесьнемного воображения. Например, появляется только после прокрутки на определенное расстояние, немного похоже?CSS stickyКонцепция чего-либо? Обычно эффект перекатывания липкий, но на определенное расстояние, а затем фиксируется в положении, как объяснил MDN.
Элемент позиционируется в соответствии с обычным потоком документов, затем относительно своего *ближайшего предка по прокрутке* иcontaining block(ближайший предок на уровне блока), включая элементы, связанные с таблицей, на основе
top
,right
,bottom
, а такжеleft
значение для смещения. Значение смещения не влияет на положение любых других элементов.
Хотя есть небольшой выход с нужным нам взаимодействием, его все же можно комбинировать через определенные «навыки», чтобы сначала просто реализовать макет.
<a class="back"></a>
<article>
...很多内容
</article>
Обратите внимание, что.back
Поместите его впереди, иначе он не вызовет липкое позиционирование, а затем дайте.back
плюс липкое позиционирование
.back{
position: sticky;
display: block;
top: 0;
border-radius: 50%;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E %3Cpath fill='%23ffffff' d='M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z'%3E%3C/path%3E %3C/svg%3E") center no-repeat dodgerblue;
background-size: 50%;
width: 50px;
height: 50px;
}
из-за здесьtop
0, поэтому кнопка «Назад» застревает вверху во время прокрутки, как показано ниже.
В это время, еслиtop
Как насчет изменения на отрицательное значение?
.back{
/**/
position: sticky;
top: -30px;
}
Как видите, кнопка выйдет за пределы экрана-30px
Место фиксируется следующим образом
Далее ставим.back
Смещение вниз на всю дистанцию экрана, т.е.100vh
.back{
/**/
position: sticky;
top: -30px;
transform: translateY(100vh);
}
Таким образом, он очень близок к нужному нам эффекту, но только его часть проявляется в конце, как показано ниже.
Принцип следующий
Наконец, поставьтеtop
установить меньше, пока.back
может появиться полностью, например, установка-60px
.back{
/**/
position: sticky;
top: -60px;
transform: translateY(100vh);
}
Это в основном сделано, но есть еще некоторые проблемы, тогда смотрите вниз
Во-вторых, обработка нижнего правого угла
Вышеупомянутая реализация на самом деле имеет две проблемы с макетом, которые необходимо оптимизировать:
- Сама кнопка занимает немного места
- Кнопка обычно находится в правом нижнем углу
Как правило, чтобы элемент не занимал место, можно придумать метод, который заключается в установке абсолютного позиционирования. Но здесь из-за настройкиposition: sticky
, так что определенно больше нельзя устанавливать абсолютное позиционирование. В дополнение к этому мы также можем использовать floatfloat
, который может легко решить две вышеупомянутые проблемы макета
.back{
/***/
float: right
}
Установка правого плавающего положения имеет два преимущества: во-первых, выйти из потока документа, не влияя на высоту, а во-вторых, добиться эффекта смещения вправо. Фактический эффект заключается в следующем.
На самом деле тут еще есть небольшая проблема, когда в шапке много текста, хорошо виден правильный эффект обтекания, вот так
Как с этим бороться?Очень просто,добавьте минусmargin
просто хорошо
.back{
/***/
float: right;
margin-top:-50px;/*自身高度*/
}
Но появилась новая проблема, и кнопка внизу снова подтекает
из-заtop
Былsticky
Занято, теперь изменение положения кнопки может полагаться только наtransform
, здесь вы можете использоватьcalc
рассчитать, покаtop
Также уменьшите свой рост соответственно
.back{
/***/
float: right;
margin-top:-50px;/*自身高度*/
top: -110px; /*60 + 50*/
transform: translateY(calc(100vh + 50px));
}
Идеально!
3. Вернуться к началу
Вернуться наверх легче, обычноhref='#'
Достичь можно, конечно, для плавной прокрутки можно добавитьscroll-behavior: smooth
html, body {
scroll-behavior:smooth;
}
Фактический эффект выглядит следующим образом
Наконец, полный код прилагается, очень мало
html,body{
scroll-behavior: smooth;
}
.back{
position: sticky;
float: right;
top: -110px;
margin-top: -50px;
border-radius: 50%;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'%3E %3Cpath fill='%23ffffff' d='M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z'%3E%3C/path%3E %3C/svg%3E") center no-repeat dodgerblue;
background-size: 50%;
width: 50px;
height: 50px;
transform: translateY(calc(100vh + 50px));
}
HTML нужно только добавить тег в начале
<body>
<a class="back" href="#"></a><!--添加再这里就行了-->
<article>
...很多内容
</article>
</body>
доступный онлайн-кодback-top (codepen.io)
4. Резюме и объяснение
В приведенном выше примере используется липкий CSS для реализации небольшого взаимодействия, которое автоматически отображает кнопку возврата. Сам по себе объем кода не сложен. На самом деле, это немного воображения. Связывание похожих эффектов и попытки большего количества могут привести к различным решениям. Ниже приведены основные моменты реализации:
- CSS sticky может добиться эффекта липкой прокрутки, вы можете установить отрицательные значения
- transformY (100vh) может быть смещен на 1 высоту экрана, не затрагивая заполнитель
- Поплавок может вырваться из потока документов, не влияя на высоту
- Отрицательные поля могут свести на нет эффект плавающего переноса.
- scroll-behavior: smooth может обеспечить плавную прокрутку
- Совместимость зависит от липкого, не совместимого с IE
Это относительно практичная небольшая функция, хотя JS также может ее реализовать, зачем возиться с JS, если ее можно реализовать с помощью CSS? По сравнению с JS, CSS прост и удобен в использовании, и нет необходимости учитывать проблемы с загрузкой, почти нулевая стоимость. Наконец, если вы считаете, что это хорошо и полезно для вас, пожалуйста, поставьте лайк, добавьте в закладки и перешлите ❤❤❤