当用户到达页面上的某个点时,我想更新window.location.hash值。
e.g。如果用户滚动到ID =' about'的div,我希望更新网址。
与点击自动滚动到页面上的锚点的链接一样,它会更新URL中的哈希值。
我设想通过检测元素是否可见来实现这一点,如果是,则更新window.location.hash = elementsID
对其他建议持开放态度。
我正在使用React并试图避免使用JQuery,因此非常感谢vanilla的JS建议。感谢。
编辑:
感谢您的建议。管理以与vanilla JS组合解决方案并在react组件中实现它。代码仍然需要清理,但你得到了要点
class HomeView extends React.Component{
constructor () {
super();
this.state = {
hash: '#'
}
this.elements = {}
}
componentDidMount(){
this.scrollListener();
}
componentDidUpdate(prevProps){
if(this.props.location.hash !== prevProps.location.hash){
this.scrollToHash(this.props.location.hash)
}
}
scrollListener(){
window.addEventListener('scroll', (event) => {
if(window.pageYOffset > 0 && window.pageYOffset < this.elements.about.offsetTop - 200){
const hash = '#';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
} else if(window.pageYOffset > this.elements.about.offsetTop - 200 && window.pageYOffset < this.elements.skills.offsetTop - 200) {
const hash = '#about';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
} else if(window.pageYOffset > this.elements.skills.offsetTop - 200 && window.pageYOffset < this.elements.contact.offsetTop - 200) {
const hash = '#skills';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
}else if(window.pageYOffset > this.elements.skills.offsetTop - 200) {
const hash = '#contact';
this.setState({hash: hash}, () => {
history.pushState('', '', hash);
this.updateHashState(hash);
})
}
})
}
updateHashState(hash) {
switch(hash){
case '#about':
this.setState({
forward: '#skills',
back: '#'
})
break;
case '#skills':
this.setState({
forward: '#contact',
back: '#about'
})
break;
case '#contact':
this.setState({
forward: '',
back: '#skills'
})
break;
default:
this.setState({
forward: '#about',
back: ''
})
break;
}
}
render(){
return(
...
)
}
}
export default HomeView
答案 0 :(得分:5)
正如另一个想法一样,通过获取滚动值来更新哈希更加健壮。可以使用scrollTop()
在jQuery中完成。
$(window).scroll(
fucntion(){
if($(this).scrollTop() > 100 && $(this).scrollTop() < 200){
window.location.hash = "your_hash_name";
}else{
window.location.hash = "";
}
}
);
一旦您在location.hash
像素之间滚动,就会更新(100, 200)
值。
答案 1 :(得分:2)
看看我的主张。 jQuery代码将在加载文档后捕获所有<section>
选择器,并在滚动时从data-hash
属性设置适当的哈希值。
$(document).ready(function(){
var sections = {};
$(".section").each(function(){
var hash = $(this).data("hash"),
topOffset = $(this).offset().top;
sections[topOffset] = hash;
});
$(window).scroll(function(e){
var scrollTop = $(window).scrollTop();
setHash(scrollTop);
});
function setHash(st){
var hash = "";
for(section in sections){
if (section < st + ($(window).height()/2)) hash = sections[section];
}
console.log(`SETTING HASH: ${hash}`);
window.location.hash = hash;
}
});
&#13;
section{
position: relative;
display: block;
width: 100%;
height: 800px;
background: #fff;
border-bottom: 1px solid #000;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<section class="section" data-hash="about">
#about
</section>
<section class="section" data-hash="works">
#works
</section>
<section class="section" data-hash="contact">
#contact
</section>
&#13;
答案 2 :(得分:-1)
检查一下。如果你需要一种方法来获取滚动到的div的id,请告诉我。 Saharsh上面写的内容可以使用,但是如果你调整浏览器的大小并且div中有文本,则下面div的滚动位置会改变。此外,考虑响应式设计,其中智能手机上的div的滚动位置与平板电脑完全不同,而不是桌面。我用一个按钮简化了我的例子,点击进入一个带有id(测试)的位置。如果您需要更多帮助,请通过滚动位置将其付诸实践,请告诉我。
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$(document).ready(function(){
$("button").click(function(){
window.location.href = "#test";
});
});
</script>
</head>
<body>
<div style="background:#aaf;width:100%;height:400px;"><button>Go To Test</button></div>
<div style="background:#afa;width:100%;height:400px;" id="test"></div>
</body>
</html>