用户滚动到部分时更新位置哈希

时间:2017-04-09 04:35:08

标签: javascript html css

当用户到达页面上的某个点时,我想更新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

3 个答案:

答案 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属性设置适当的哈希值。

&#13;
&#13;
$(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;
&#13;
&#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>