Такую функцию «наверх» часто можно увидеть в некоторых документах или статьях, и есть два конкретных взаимодействия.
- Он появляется только при прокрутке на определенное расстояние, вернитесь наверх, чтобы снова скрыть
- Нажмите, чтобы вернуться наверх
Например 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;
}
из-за здесьtop0, поэтому кнопка «Назад» застревает вверху во время прокрутки, как показано ниже.
В это время, если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 прост и удобен в использовании, и нет необходимости учитывать проблемы с загрузкой, почти нулевая стоимость. Наконец, если вы считаете, что это хорошо и полезно для вас, пожалуйста, поставьте лайк, добавьте в закладки и перешлите ❤❤❤