gpt4 book ai didi

javascript - 粘性标题 - 使用标签滚动

转载 作者:太空狗 更新时间:2023-10-29 16:09:41 25 4
gpt4 key购买 nike

我的粘性 header 的行为有问题。

Desired behavior:

a) Scrolling to where the bottom of the .nav hits the top of a section adds the active class to the tab and it remains active until the .nav reaches the top of the next section.

b) Clicking a corresponding section's .tab always navigates you to the top of that section and adds the active class to the tab.

因此,通过滚动或单击,active选项卡的状态始终保持到 .nav跨入下section , 在这种情况下 active状态转到该部分的选项卡等。

测试问题:

1) 中途向下滚动 Option Two active那个状态.tab丢失了。

2) scrollTop的使用正在滚动到 .container 的顶部而不是所选 section 的顶部.

class StickyNavigation {
constructor() {
this.currentId = null;
this.currentTab = null;
let self = this;
$(".tab").click(function() {
self.onTabClick(event, $(this));
});
$(".container").scroll(() => {
this.onScroll();
});
$(".container").resize(() => {
this.onResize();
});
}
/*Scrolls down to Tab selection*/
onTabClick(event, element) {
event.preventDefault();
let scrollTop = $(element.attr("href")).offset().top;
if (!$(".nav").hasClass("nav--top")) {
scrollTop = scrollTop;
}
$(".container").animate({
scrollTop: scrollTop
}, 600);
}
onScroll() {
this.navPosition();
this.tabAnimation();
}
navPosition() {
let offset = $(".sticky").offset().top + $(".sticky").height();
if ($(".container").scrollTop() > offset) {
$(".nav").addClass("nav--top");
} else {
$(".nav").removeClass("nav--top");
}
}
tabAnimation() {
$("section").each(function() {
var actual = $(this),
actualHeight = actual.height(),
actualAnchor = $(".sticky").find('a[href="#' + actual.attr("id") + '"]');
if (
actual.offset().top <= $(".container").scrollTop() &&
actual.offset().top + actualHeight > $(".container").scrollTop()
) {
actualAnchor.addClass("active");
} else {
actualAnchor.removeClass("active");
}
});
}
}
new StickyNavigation();
body {
position: fixed;
display: flex;
flex-direction: column;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: hidden;
}

section {
height: 600px;
border: 2px solid white;
background: blue;
}

section:nth-child(2) {
background: red;
}

.container {
flex: 1;
display: flex;
position: relative;
flex-direction: column;
overflow: auto;
}

.long {
height: 1200px;
}

.header {
height: 75px;
background: green;
}

.hero {
background: silver;
flex: 0;
border: 1px solid;
}

.nav {
background: white;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
position: relative;
}

.nav--top {
position: fixed;
top: 75px;
}

.sticky {
background: white;
display: flex;
flex-direction: row;
flex-wrap: wrap;
position: relative;
}

.tab {
padding: 30px 45px;
position: relative;
}

.tab.active {
background: #6567c5;
color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="header">
<h1>Header</h1>
</div>
<div class="container">
<div class="hero">
<h1>Hero</h1>
</div>
<div class="sticky">
<nav role="navigation" class="nav">
<a class="tab" href="#One">Option One</a>
<a class="tab" href="#Two">Option Two</a>
</nav>
</div>
<div class="main">
<section id="One">
</section>
<section class="long" id="Two">
</section>
</div>
</div>
</div>

最佳答案

您的部分滚动到顶部的原因是由于添加和去除粘性元素。使用 wrapper 代替 sticky 以始终占据高度粘性元素是否存在。

class StickyNavigation {
constructor() {
this.currentId = null;
this.currentTab = null;
this.setup();
this.onResize();
let self = this;
$(".tab").click(function(event) {
self.onTabClick(event, $(this));
});
$(".container").scroll(() => {
this.onScroll();
});
$(window).resize(() => {
this.onResize();
});
}
setup() {
this.$sticky = $('.sticky');
window.stk = this.$sticky;
this.$stickyWrap = $('<div>').insertAfter(this.$sticky);
this.$sticky.appendTo(this.$stickyWrap);
}
/*Scrolls down to Tab selection*/
onTabClick(event, element) {
event.preventDefault();
let $targetElement = $(element.attr("href"));
let positionTop = $targetElement.position().top;
let scrollTop = $('.container').scrollTop();
$(".container").animate({
scrollTop: scrollTop - this.stickyOuterHeight + positionTop
}, 600);
}
onScroll() {
this.navPosition();
this.tabAnimation();
}
onResize() {
this.stickyOuterHeight = this.$sticky.outerHeight();
this.$sticky.width(this.$stickyWrap.width());
this.$stickyWrap.css('minHeight', this.stickyOuterHeight);
}
navPosition() {
if (this.$stickyWrap.position().top < 0) {
this.$sticky.addClass("fixed");
} else {
this.$sticky.removeClass("fixed");
}
}
tabAnimation() {
let desiredSpace = this.stickyOuterHeight + 10;
$("section").each(function() {
let actual = $(this),
actualHeight = actual.height(),
actualAnchor = $(".sticky").find('a[href="#' + actual.attr("id") + '"]');
let actualTop = actual.position().top;
let actualBottom = actualTop + actualHeight;
if (actualTop < desiredSpace && actualBottom > desiredSpace) {
actualAnchor.addClass("active");
} else {
actualAnchor.removeClass("active");
}
});
}
}
$(function() {
new StickyNavigation();
});
body {
position: fixed;
display: flex;
flex-direction: column;
top: 0;
bottom: 0;
left: 0;
right: 0;
overflow: hidden;
}

section {
height: 600px;
border: 2px solid white;
background: blue;
}

section:nth-child(2) {
background: red;
}

.container {
flex: 1;
display: flex;
position: relative;
flex-direction: column;
overflow: auto;
}

.long {
height: 1200px;
}

.header {
height: 75px;
background: green;
}

.hero {
background: silver;
flex: 0;
border: 1px solid;
}

.nav {
background: white;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
position: relative;
}

.sticky {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}

.sticky.fixed {
position: fixed;
top: 83px;
}

.tab {
padding: 30px 45px;
position: relative;
}

.tab.active {
background: #6567c5;
color: white;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="header">
<h1>Header</h1>
</div>
<div class="container">
<div class="hero">
<h1>Hero</h1>
</div>
<div class="sticky">
<nav role="navigation" class="nav">
<a class="tab" href="#One">Option One</a>
<a class="tab" href="#Two">Option Two</a>
</nav>
</div>
<div class="main">
<section id="One">
Content One
</section>
<section class="long" id="Two">
Content Two
</section>
</div>
</div>

关于javascript - 粘性标题 - 使用标签滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55017921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com