Как использовать метод прокрутки вверх
Заголовок в прокрутке должен скользить/подниматься вниз, как указано в jQuery. Однако в мобильном iOS это не происходит, и заголовок сужается в верхней части экрана?
Это работает на Chrome, Mozilla Firefox, Internet Explorer и Safari - на больших браузерах.
Это происходит из-за неправильного использования метода прокрутки вверх? Как это исправить?
jQuery(document).ready(function ($) {
var lastScrollTop = 0;
$(window).scrollTop(0);
$(window).on('scroll', function() {
var header = $('header');
var content = $('content');
var headerBg = $('.header-bg');
var headerCnt = $('.header-content');
var scrollTop = $(window).scrollTop();
var dynHeaderVisible = false;
if (lastScrollTop > scrollTop) {
if (scrollTop <= 400) {
headerBg.css("height", 0);
headerCnt.css('color', 'white');
} else {
headerBg.css("height", 80);
headerCnt.css("height", 80);
headerCnt.css('color', 'black');
}
} else {
// Down
if (scrollTop > 350) {
console.log ("hi");
headerCnt.css("height", 0);
headerBg.css("height", 0);
}
}
lastScrollTop = scrollTop;
});
$.fn.isOnScreen = function(){
var element = this.get(0);
var bounds = element.getBoundingClientRect();
return bounds.top < window.innerHeight && bounds.bottom > 0;
}
});
* {
margin: 0;
padding: 0;
box-sizing: border-box;
width: 100%;
margin: 0;
list-style: none;
text-decoration: none;
font-size:1em;
font-family: Helvetica Neue, Helvetica, Arial, Sans-serif;
}
a {
background:transparent;
border:none;
letter-spacing:0.15em;
text-transform:uppercase;
transition: .3s color;
transition: .3s height;
}
header {
display: block;
position: fixed;
height: 80px;
width: 100%;
}
header ul {
z-index: 20;
}
.header-wrapper {
position: relative;
width: 100%;
height: 100%;
background-color: transparent;
}
.header-bg,
.header-content {
position: fixed;
top: 0;
left: 0;
width: 100%;
text-align: center;
}
.header-bg {
z-index: 100;
color: gray;
background-color: white;
border-bottom: 1px solid black;
transition: .3s height;
height: 0;
}
.header-content {
z-index: 200;
transition: .3s color;
color: white;
background-color: transparent;
height: 80px;
transition: .3s height;
overflow: hidden;
list-style: none;
}
.logo {
position: absolute;
left: 47%;
color: inherit;
display: inline-block;
width: 15px;
height: 15px;
padding: 18px;
cursor: pointer;
font-size:.8em;
letter-spacing:0.05em;
transition: .3s color;
}
</style>
<style>
content {
display: block;
height: 2000px;
background-color: orange;
}
.stage {
color: #fff;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
height: 100vh;
background-color: white;
border-bottom: 1px solid black;
font-size: 48px;
height: 200px;
width: 100%;
}
.stage-0 {
background: grey;
height: 400px;
}
<script src= "//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<header>
<div class="header-wrapper">
<div class="header-bg"></div>
<div class="header-content">
<ul>
<li>
<a href="" class="logo">Logo </a>
</li>
</ul>
</div>
</div>
</header>
<content>
<div class="stage stage-0">1</div>
<div class="stage stage-2">3</div>
<div class="stage stage-4">5</div>
<div class="stage stage-6">7</div>
<div class="stage stage-8">9</div>
<div class="stage stage-10">11</div>
<div class="stage stage-12">13</div>
<div class="stage stage-14">15</div>
<div class="stage stage-16">17</div>
<div class="stage stage-18">19</div>
<div class="stage stage-20">21</div>
<div class="stage stage-22">23</div>
</content>
Ответы
Ответ 1
Попробуйте этот код
$(window).scroll(function() {
var scrollTop = $(this).scrollTop(), //Get the current vertical position of the scroll bar for the first element in the set of matched elements
header = $('.header-content'); // Target Element
if(scrollTop > header.offset().top) {
header.addClass('navbar-fixed-top');
}
}
Ответ 2
Фиксированные элементы могут иметь довольно эффектные эффекты на мобильных устройствах из-за того, что они не работают должным образом с событиями касания (в данном случае прокрутка, я думаю).
Я не 100%, если эта проблема здесь, но я думаю, что там есть хорошая возможность.
Там что-то называется Modernizr (https://modernizr.com/), который помогает вам обнаруживать все виды связанных с браузером материалов, в том числе, если он работает на сенсорном экране или нет, Я не думаю, что в настоящее время существует реальное решение плохой работы между событиями касания и фиксированными элементами, но с помощью Modernizr вы можете попытаться найти какое-то обходное решение.
Гудлак!
Ответ 3
Возможно, это связано с тем, что у вас есть некоторые вложенные элементы position:fixed
внутри других элементов position: fixed
. По моему опыту это иногда может вызвать странные ошибки на мобильных телефонах.
Итак, попробуйте заменить строку position:fixed
на это правило:
.header-bg,
.header-content {
position: fixed;
top: 0;
left: 0;
width: 100%;
text-align: center;
}
с position: absolute
.header-bg,
.header-content {
position: absolute;
top: 0;
left: 0;
width: 100%;
text-align: center;
}
Ответ 4
Ничего не выполняется во время прокрутки на мобильном сафари. Вы можете просто поместить gif на свою страницу, и вы увидите, что даже это изображение gif перестало анимацию во время прокрутки.
В мобильном сафари событие "прокрутка" запускается только один раз после остановки прокрутки окна. Если вам действительно нужно отслеживать событие прокрутки и выполнять определенные действия в соответствии с scrolltop в режиме реального времени. Вам нужна сторонняя библиотека, например IScroll в github.
Он использовал "translate" для имитации эффекта "прокрутки".