javascript - JS滚动效果有问题
问题描述
我希望有人可以帮助我解决我遇到的问题。不幸的是,我对 JS 不是很有经验,所以我遇到了一些麻烦。
我有一个具有整页背景图片的网站。当用户滚动时,背景图像会发生变化。不久前,我从 Stack Overflow 上的另一篇文章中得到了这个解决方案,但我似乎无法在任何地方找到该帖子来挽救我的生命,否则我将在此发布。
无论如何,下面有一个代码片段。我遇到的三个问题是:
- 目前,当它到达最后一张图像时,它会停止,除非用户向上滚动。我想做的是当这个人到达最后一张图片时,我希望它从头开始重新启动,这样它就会在用户不断向下滚动时循环播放。
- 在 Firefox 上,当它到达最后一张图片时,用户甚至无法向上滚动以返回到上一张图片。它只是到达最后一个并停止,期间。
- 它不适用于 iPhone。显然,我知道那是因为 iPhone 是触控的,而这个 JS 正在寻找鼠标滚轮,但是我可以使用特定的 JS 代码来定位触控吗?
非常感谢您的帮助!
PS 在 Windows 上,它会将全轮滚动识别为一个滚动,这很棒,但在 Mac 上,全滚动将一次循环浏览所有图像。那只是Mac的东西,因为它很烦人吗?
$(document).ready(function() {
var index = 1;
var maxIndex = $('.content').length;
var endAnim = true;
$('body').on('mousewheel DOMMouseScroll', function(e) {
if (endAnim) {
if (e.originalEvent.wheelDelta / 90 > 0) {
if (index > 1) {
endAnim = false;
index--;
$('.content-' + (index)).addClass('main-content').fadeIn(500);
$('.content-' + (index + 1)).fadeOut(500, function() {
$(this).removeClass('main-content');
endAnim = true;
});
}
} else {
if (index < maxIndex) {
endAnim = false;
index++;
$('.content-' + (index)).addClass('main-content').fadeIn(500);
$('.content-' + (index - 1)).fadeOut(500, function() {
$(this).removeClass('main-content');
endAnim = true;
});
}
}
}
});
});
.main-content {
top: 0 !important;
z-index: 100 !important;
}
.pageContainer {
width: 100%;
height: 100%;
overflow-y: hidden;
background: white;
}
.content {
position: fixed;
top: 100%;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
display: flex;
align-items: center;
text-align: center;
}
.content-1 {
background-image: url('https://preview.ibb.co/f88WDy/test_image_1.jpg');
background-size: cover;
}
.content-2 {
background-image: url('https://preview.ibb.co/fbVNLd/test_image_2.jpg');
background-size: cover;
}
.content-3 {
background-image: url('https://preview.ibb.co/i79Gfd/test_image_3.jpg');
background-size: cover;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="pageContainer">
<div class="content content-1 main-content">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum One</h1>
</div>
</div>
</div>
</div>
<div class="content content-2">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum Two</h1>
</div>
</div>
</div>
</div>
<div class="content content-3">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum Three</h1>
</div>
</div>
</div>
</div>
</div>
解决方案
你可以使用模运算。这是一个例子:
$(document).ready(function() {
var index = 1;
$('body').on('mousewheel DOMMouseScroll', function(e) {
$('.content-' + index).removeClass('main-content');
index = index%3 + 1;
$('.content-' + index).addClass('main-content');
});
});
.main-content {
top: 0 !important;
z-index: 100 !important;
}
.pageContainer {
width: 100%;
height: 100%;
overflow-y: hidden;
background: white;
}
.content {
position: fixed;
top: 100%;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
display: flex;
align-items: center;
text-align: center;
}
.content-1 {
background-image: url('https://preview.ibb.co/f88WDy/test_image_1.jpg');
background-size: cover;
}
.content-2 {
background-image: url('https://preview.ibb.co/fbVNLd/test_image_2.jpg');
background-size: cover;
}
.content-3 {
background-image: url('https://preview.ibb.co/i79Gfd/test_image_3.jpg');
background-size: cover;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="pageContainer">
<div class="content content-1 main-content">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum One</h1>
</div>
</div>
</div>
</div>
<div class="content content-2">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum Two</h1>
</div>
</div>
</div>
</div>
<div class="content content-3">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum Three</h1>
</div>
</div>
</div>
</div>
</div>
扩展答案 我现在在大学,所以稍后我将对此进行全面解释。我创建了一个 hiddenScroll ,其中包含一个大小为屏幕大小 3 倍的元素。然后我将 hiddenScroll 的滚动位置更改为屏幕大小的 1 倍,以便当 scrollTop 变为 0 时,滚动事件触发第二个 if 或者当 scrollTop 变为屏幕大小的 3 倍时触发第一个 if。
您实际上是从透明 div(因此隐藏 div)滚动滚动条。
$(document).ready(function() {
var index = 1;
$(".hiddenScroll").scrollTop($( document ).height())
$('body').on('mousewheel DOMMouseScroll', function(e) {
var hiddenScrollbar = $(".hiddenScroll");
if(hiddenScrollbar.scrollTop() == 2*$( document ).height()){
$('.content-' + index).removeClass('main-content');
index = index%3 + 1;
$('.content-' + index).addClass('main-content');
hiddenScrollbar.scrollTop($( document ).height());
}else if($(".hiddenScroll").scrollTop() == 0){
$('.content-' + index).removeClass('main-content');
index = index == 1 ? 3 : index - 1;
$('.content-' + index).addClass('main-content');
hiddenScrollbar.scrollTop($( document ).height());
}
});
});
.main-content {
top: 0 !important;
z-index: 100 !important;
}
.pageContainer {
width: 100%;
height: 100%;
overflow-y: hidden;
background: white;
}
.content {
position: fixed;
top: 100%;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
display: flex;
align-items: center;
text-align: center;
}
.content-1 {
background-image: url('https://preview.ibb.co/f88WDy/test_image_1.jpg');
background-size: cover;
}
.content-2 {
background-image: url('https://preview.ibb.co/fbVNLd/test_image_2.jpg');
background-size: cover;
}
.content-3 {
background-image: url('https://preview.ibb.co/i79Gfd/test_image_3.jpg');
background-size: cover;
}
.hiddenScroll {
width: 100%;
height: 100%;
overflow-y: scroll;
position: fixed;
display: block;
filter: opacity(0);
z-index: 101;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="pageContainer">
<div class="content content-1 main-content">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum One</h1>
</div>
</div>
</div>
</div>
<div class="content content-2">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum Two</h1>
</div>
</div>
</div>
</div>
<div class="content content-3">
<div class="container">
<div class="row">
<div class="col-md-12">
<h1>Lorem Ipsum Three</h1>
</div>
</div>
</div>
</div>
<div class="hiddenScroll">
<div style="height: 300vh;"></div>
</div>
</div>
推荐阅读
- javascript - 关于 React.memo 和性能优化的问题
- oracle - 是否可以为数据库优先项目自定义 Oracle.EntityFrameworkCore 中的默认映射?
- reactjs - React useContext + TS 错误:“'{}' 上不存在属性”
- docker - 有没有办法知道从 docker 容器中发布了哪个端口?
- typescript - rxjs bindCallback Subscription on mqtt-client message-event 只触发一次,不触发DataQueryResponsesubscriber.next()
- node.js - Mongoose 模式在更新时跳过验证
- pytorch - Xavier 权重 pytorch 实现之间的区别
- javascript - 角加载错误 ExpressionChangedAfterItHasBeenCheckedError
- python - 如何编写干净的 pytest 链 api 测试
- excel - VBA - 从硬盘打开所有excel文件