html - 当用户将锚链接滚动到视图中时突出显示它们
问题描述
我知道有类似的例子涵盖了我的问题。但我相信我的问题是独一无二的,原因如下:
- anchornav 中的菜单项
<a href
不像大多数其他示例那样由标签组成。相反,它们由DIVs
每个组成data-href
。 - 目标锚点包含
DIV
一个基于GUID
我们 CMS 的 ID。
<div class="something">
<div class="somethingelse">
<div class="">
<div class="flickity-wrapper">
<ul class="list-unstyled flickity-enabled is-draggable" role="tablist" tabindex="0">
<div class="flickity-viewport" style="height: 79px; touch-action: none;">
<div class="flickity-slider" style="left: 0px; transform: translateX(29.99%);">
<li class="carousel-cell is-selected" style="position: absolute; left: 0%;">
<div class="anchor" data-href="#85eeb28d-3964-443a-8c29-cda37f131f47">Login</div>
</li>
<li class="carousel-cell" style="position: absolute; left: 8.16%;">
<div class="anchor" data-href="#8ba0442a-0621-41e1-8449-3f71e18af8d2">Success</div>
</li>
<li class="carousel-cell" style="position: absolute; left: 16.67%;">
<div class="anchor" data-href="#61cb9468-60e8-4ac6-a272-4b659fb27400">Contact</div>
</li>
</div>
</div>
</ul>
</div>
</div>
</div>
</div>
</nav>
<div id="85eeb28d-3964-443a-8c29-cda37f131f47">Login</div>
<div id="8ba0442a-0621-41e1-8449-3f71e18af8d2">Success</div>
<div id="61cb9468-60e8-4ac6-a272-4b659fb27400">Contact</div>
我试图将以下代码放在一起,希望突出显示锚导航项,但没有任何效果:
var lastID;
var anchorMenu = $("#anchorNav");
var anchorMenuHeight = anchorMenu.outerHeight+100;
var anchorMenuItems = anchorMenu.find(".anchor");
var anchorMenuItemsTarget = anchorMenuItems.map(function(){
var item = $($(this).attr("data-href"));
if (item.length) { return item; }
});
// Bind to scroll
$(window).scroll(function(){
// Get container scroll position
var fromTop = $(this).scrollTop()+anchorMenuHeight+300;
// Get id of current scroll item
var cur = anchorMenuItemsTarget.map(function(){
if ($(this).offset().top < fromTop)
return this;
});
// Get the id of the current element
cur = cur[cur.length-1];
var id = cur && cur.length ? cur[0].id : "";
if (lastID !== id) {
lastID = id;
// Set/remove active class
anchorMenuItems
.parent().removeClass("active")
.end().filter("[data-href='"+id+"']").parent().addClass("active");
}
});
我的示例 CSS:
body {
height: 6000px;
font-family: Helvetica, Arial;
}
#anchorNav {
position: fixed;
z-index: 1;
background: white;
left: 0;
right: 0;
top: 0;
}
#anchorNav li.active {
border-top: 3px solid #333;
color: #333;
}
[id='85eeb28d-3964-443a-8c29-cda37f131f47'] {
position: absolute;
top: 500px;
}
[id='8ba0442a-0621-41e1-8449-3f71e18af8d2'] {
position: absolute;
top: 800px;
}
[id='61cb9468-60e8-4ac6-a272-4b659fb27400'] {
position: absolute;
top: 1200px;
}
演示 JS 小提琴:https ://jsfiddle.net/vyrhnmt1/1/
我正在尝试模拟这个 JS Fiddle 并将其转换为我的用例:http: //jsfiddle.net/mekwall/up4nu/
任何帮助或提示将不胜感激。
解决方案
这段代码完成了这项工作:我添加了一些 css 行并修改了一些 js 行
var lastID;
var anchorMenu = $("#anchorNav");
var anchorMenuHeight = anchorMenu.outerHeight()+100;
var anchorMenuItems = anchorMenu.find(".anchor");
var anchorMenuItemsTarget = anchorMenuItems.map(function(){
var item = $($(this).attr("data-href"));
if (item.length) { return item; }
});
// Bind to scroll
$(window).scroll(function(){
// Get container scroll position
var fromTop = $(this).scrollTop()+anchorMenuHeight+300;
// Get id of current scroll item
var cur = anchorMenuItemsTarget.map(function(){
if ($(this).offset().top < fromTop)
return this;
});
// Get the id of the current element
cur = cur[cur.length-1];
var id = cur && cur.length ? cur[0].id : "";
if (lastID !== id) {
lastID = id;
// Set/remove active class
anchorMenuItems.removeClass("active")
anchorMenuItems.filter("[data-href='#"+id+"']").addClass("active");
}
});
body {
height: 6000px;
font-family: Helvetica, Arial;
}
#anchorNav {
position: fixed;
z-index: 1;
background: white;
left: 0;
right: 0;
top: 0;
}
.anchor{
color: #aaa;
}
.anchor.active{
color: #333;
}
[id='85eeb28d-3964-443a-8c29-cda37f131f47'] {
position: absolute;
top: 500px;
}
[id='8ba0442a-0621-41e1-8449-3f71e18af8d2'] {
position: absolute;
top: 800px;
}
[id='61cb9468-60e8-4ac6-a272-4b659fb27400'] {
position: absolute;
top: 1200px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<nav id="anchorNav" class="anchornav bg-light">
<div class="container">
<div class="row">
<div class="col-md-3 col-sm-4 col-sm-push-8 col-md-push-9 text-right">
</div>
<div class="col-md-9 col-sm-8 col-sm-pull-4 col-md-pull-3 col-xs-12">
<div class="flickity-wrapper">
<ul class="list-unstyled flickity-enabled is-draggable" role="tablist" tabindex="0">
<div class="flickity-viewport" style="height: 79px; touch-action: none;">
<div class="flickity-slider" style="left: 0px; transform: translateX(29.99%);">
<li class="carousel-cell is-selected" style="position: absolute; left: 0%;">
<div class="active anchor" data-href="#85eeb28d-3964-443a-8c29-cda37f131f47">Login</div>
</li>
<li class="carousel-cell" style="position: absolute; left: 8.16%;">
<div class="anchor" data-href="#8ba0442a-0621-41e1-8449-3f71e18af8d2">Erfolg</div>
</li>
<li class="carousel-cell" style="position: absolute; left: 16.67%;">
<div class="anchor" data-href="#61cb9468-60e8-4ac6-a272-4b659fb27400">Kontakt</div>
</li>
</div>
</div>
</ul>
</div>
</div>
</div>
</div>
</nav>
<div id="85eeb28d-3964-443a-8c29-cda37f131f47">Login</div>
<div id="8ba0442a-0621-41e1-8449-3f71e18af8d2">Erfolg</div>
<div id="61cb9468-60e8-4ac6-a272-4b659fb27400">Kontakt</div>