Mar*_*ian 10 html javascript css jquery scroll
我在添加和删除类,在滚动上应用样式时遇到问题.
具体来说,当我向下滚动页面时:
is-red仍然在第一.dot__outer组,应该有一个组与is-red该类一起突出显示滚动:
is-red所有div上的类与类dot__outeris-red到下一个dot__outer系列中的用户滚动过去特定面板之后.即如果用户在第二个面板上,则第二个组应突出显示为红色圆点颜色:
dot__outer一类都is-red应该是红色的$(function() {
function updateProgress() {
let dot = $(".dot");
let dotsBottom = $(".dots").offset().top + $(".dots").outerHeight();
let panelHeaderBottom =$(".panel-1").offset().top + $(".panel-1").outerHeight();
let panelRelatedTop = $(".panel-8").offset().top;
// If the `dot__outer` has a class of `is-active` the dot should also be red. By default, the dot and border should be white.
if (dot.parent().hasClass("is-red")) {
$(this).css("background", "red");
} else {
// If the position of the dots is less than the bottom of the header or greater than the top of the related section, the dots are white. Otherwise, the dots are black
if (dotsBottom < panelHeaderBottom || dotsBottom > panelRelatedTop) {
$(this).css("background", "#000");
} else {
$(this).css("background", "#fff");
}
}
$(".panel").each(function(index) {
let currentPosition = $(window).scrollTop();
let panelTop = $(this).offset().top;
let panelBottom = $(this).offset().top + $(this).outerHeight();
if ((currentPosition > panelTop) && (currentPosition < panelBottom)) {
$(".dot__outer").removeClass("is-red");
$(".dot__outer").eq(index).addClass("is-red");
} else {
$(".dot__outer").eq(0).addClass("is-red");
}
});
}
$(window).scroll(function() {
updateProgress();
});
});
Run Code Online (Sandbox Code Playgroud)
<div class="panels">
<div class="panel panel-1">Panel #1</div>
<div class="panel panel-2">Panel #2</div>
<div class="panel panel-3">Panel #3</div>
<div class="panel panel-4">Panel #4</div>
<div class="panel panel-5">Panel #5</div>
<div class="panel panel-6">Panel #6</div>
<div class="panel panel-7">Panel #7</div>
<div class="panel panel-8">Panel #8</div>
</div>
<div class="dots">
<div class="dot__outer is-red">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
https://codepen.io/yacoubian/pen/PBOVKw?editors=1010
UPDATE
滚动问题已修复,codpen已更新.
这是我的解决方案。这会动态检查面板位置并将其与每个点位置进行比较,然后应用 CSS 样式类。
代码笔: https: //codepen.io/tylerfowle/pen/QBaBgO
lightand类。dark.dot__outer元素并查看它们位于哪个面板中,并应用正确的类。我们使用中点来确定大部分点位于哪个面板中。$(function() {
let dotClass = "dark";
function updateProgress() {
let viewportTop = $(window).scrollTop();
let viewportBot = viewportTop + $(window).height();
$(".panel").each(function(index) {
// save the ref to the current panel for use in the dot loop
let $this = $(this);
let panelTop = $(this).offset().top;
let panelBot = panelTop + $(this).outerHeight();
// add class based on panel that is within viewport, remove from siblings
if ((viewportTop > panelTop) && (viewportTop < panelBot)) {
$(".dot__outer").eq(index).addClass("is-red").siblings().removeClass("is-red");
}
$(".dot__outer").each(function(){
let dotTop = $(this).offset().top;
let dotMid = dotTop + $(this).outerHeight()/2;
let dotBot = dotTop + $(this).outerHeight();
if ($this.hasClass("light")) {
dotClass = "light";
} else {
dotClass = "dark";
}
if (panelTop < dotMid && panelBot > dotMid) {
$(this).removeClass("dark light").addClass(dotClass);
}
});
});
}
$(window).scroll(function() {
updateProgress();
});
});Run Code Online (Sandbox Code Playgroud)
body {
margin: 0;
}
.panel {
width: 100vw;
height: 100vh;
border-bottom: 1px solid red;
font-size: 24px;
font-weight: 700;
color: #000;
}
.panel.panel-1, .panel.panel-8 {
background: #000;
color: #fff;
}
.dots {
position: fixed;
bottom: 48px;
right: 48px;
}
.dot {
width: 5px;
height: 5px;
background: white;
border-radius: 50%;
}
.dot__outer {
margin-bottom: 16px;
padding: 8px;
border: 1px solid white;
}
.dot__outer.light {
border-color: black;
}
.dot__outer.light .dot {
background: black;
}
.dot__outer.dark {
border-color: white;
}
.dot__outer.dark .dot {
background: white;
}
.dot__outer.is-red {
border: 1px solid red !important;
}
.dot__outer.is-red .dot {
background: red !important;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="panels">
<div class="panel panel-1 dark">Panel #1</div>
<div class="panel panel-2 light">Panel #2</div>
<div class="panel panel-3 light">Panel #3</div>
<div class="panel panel-4 light">Panel #4</div>
<div class="panel panel-5 light">Panel #5</div>
<div class="panel panel-6 light">Panel #6</div>
<div class="panel panel-7 light">Panel #7</div>
<div class="panel panel-8 dark">Panel #8</div>
</div>
<div class="dots">
<div class="dot__outer is-red">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
<div class="dot__outer">
<div class="dot"></div>
</div>
</div>Run Code Online (Sandbox Code Playgroud)