Javascript - 页面加载后滚动到元素

莱夫

我有一个包含部分和侧边栏的子页面,其中包含指向每个页面上每个部分的链接。我像这样滚动到他们每个人:

function scrollToElement(element) {
  if($(element) && $(element).offset()) {

    $('html,body').animate({
      scrollTop: $(element).offset().top - 80
    });
  }
}

$('.anchor-links').click(function() {
  var element = $(this).attr('id').split('-');

  if (element[0] == 'download') {
    $("html, body").animate({
      scrollTop: 0
    });
  } else {
    scrollToElement('#' + element[0]);
  }
});

这是每个页面侧边栏中的链接:

<div class="slideout-menu">
  <ul>
    <li>
      <a href="/subpage#download" class="anchor-links" id="download-link">Last ned</a>
    </li>
    <li>
      <a href="/subpage#about" class="anchor-links" id="about-link">Om oss</a>
    </li>
    <li>
      <a href="/subpage#faq" class="anchor-links" id="faq-link">Spørsmål og svar</a>
    </li>
    <li>
      <a href="/subpage#contact" class="anchor-links" id="contact-link">Kontakt</a>
    </li>
    <li>
      <a href="/all">Se alle magasiner</a>
    </li>
  </ul>
</div>

这是我的子页面:

<div class="background-container show-for-medium" id="download">
  <img src="/uploads/{{ $subpage->cover }}" alt="" />
</div>

@section('topBar')
  @include('customer.layouts.partials.top-bar')
@show

<div class="panel">
  @section('alexBox')
    @include('customer.layouts.partials.alex-box')
  @show

  @section('availability')
    @include('customer.layouts.partials.availability-info')
  @show
</div>
<section class="row faq">
  <div class="small-12 medium-10">
    <div class="subpage-section" id="about">
      {!! $subpage->about !!}
    </div>
    <div class="subpage-section" id="faq">
      {!! $subpage->faq !!}
    </div>
    <div class="subpage-section" id="contact">
      {!! $subpage->contact !!}
    </div>
  </div>
</section>

因为,在navbar拥有height80px,我已经在脚本中设置它滚动到navbar上导航到比其他下载每个部分是最上面的部分。当我在小屏幕上从另一个页面导航到某个部分时,它不会一直滚动到导航栏的底部,因此我可以看到上述部分的内容。这只发生在小屏幕上,并且只发生在从另一个页面导航到某个部分时,如果我在同一页面上或从大屏幕上的另一个页面导航,那么它工作正常。当我console.log($(element).offset().top);从另一个页面导航到部分时,我会得到不同的值,然后是:

983.46875

当我已经在子页面上时,它是:

1151.46875

这是我记录的地方:

function scrollToElement(element) {
  if($(element) && $(element).offset()) {
    console.log($(element).offset().top);
    $('html,body').animate({
      scrollTop: $(element).offset().top - 80
    });
  }
}

因为,我在子页面上动态创建和隐藏一些元素,我认为错误的偏移量来自于此,因为我猜它在创建所有元素之前获得了偏移量。这是执行此操作的脚本:

//switch app and google store buttons
function shopButtons () {
  if (navigator.userAgent.match(/Android/i)) {
    $('.js-store-link').attr('href', 'https://play.google.com/store/apps/details?id=myapp.areader');
    $('.js-store-img').attr('src', '/img/google-store.svg');
  }

  if (navigator.userAgent.match(/iPhone|iPod/i)) {
    $('.js-store-link').attr('href', 'https://itunes.apple.com/no/app/myapp+/id777109367?mt=8');
    $('.js-store-img').attr('src', '/img/app-store.svg');
  }

}

$(document).ready(function(){
shopButtons();

  $.ajax({
    url: 'https://apiEndpoint/13/salesposter.json' ,
    data : { search: 'test' },
    dataType: 'json',

    success : function(json) {
      var partner = json.partner;
      var posterName = json.name;
      $('#posterName').text(posterName);
      var metaArray = json.metadata;
      $('.meta3').attr('href', metaArray[0].value);
      $('.spid-login').attr('href', 'https://payment.schibsted.no/flow/login/');

      metaArray.forEach(function(item, index, array){
        $('.meta'+item.prio).html(item.value);
      });
    }
  });

  //hide store buttons in alex box on subpages
  if (window.location.pathname.includes('/subpage')) {
    var element = $('#' + window.location.hash.substr(1));
    scrollToElement(element);
    $('.js-alex-box-store-buttons').hide();
  }
});

但不知道如何解决这个问题?我试过用函数包装scrollElement()来自这个脚本的window.onload调用,以便它在页面完全加载后执行,但这没有帮助,当时根本没有调用函数。我也尝试将整个函数放在调用success方法中ajax,但是它一直滚动到顶部。

圆顶音乐

正如您在评论中提到的,您需要 javascript 来固定导航栏。您需要等到element is defined. 否则你会得到他的null-pointer-exception所以你只能scrollToElement()document.ready函数中或以后执行

metaArray.forEach(function(item, index, array) {     
    $('.meta'+item.prio).html(item.value); 
});

是异步的。我认为当您使用 滚动到您的元素时,您.meta-elements没有高度尝试将函数添加到函数中。document.readyscrollToElement(...)success:

jQuery 示例:

var isSubpage = window.location.pathname.indexOf("subpage") >= 0;
$(document).ready(function() {
  var element = window.location.hash;
  scrollToElement(element);

  $('.anchor-links').click(function(event) {
    if(isSubpage){
      event.preventDefault()
      var element = $(this).attr('id').split('-');

      if (element[0] == 'download') {
        $("html, body").animate({
          scrollTop: 0
        });
      } else {
        scrollToElement('#' + element[0]);
      }
    }
  });
});

function scrollToElement(element) {
  if($(element) && $(element).offset())
  $('html,body').animate({
    scrollTop: $(element).offset().top - 80
  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="slideout-menu">
  <ul>
    <li>
      <a href="/subpage#download" class="anchor-links" id="download-link">Last ned</a>
    </li>
    <li>
      <a href="/subpage#about" class="anchor-links" id="about-link">Om oss</a>
    </li>
    <li>
      <a href="/subpage#faq" class="anchor-links" id="faq-link">Spørsmål og svar</a>
    </li>
    <li>
      <a href="/subpage#contact" class="anchor-links" id="contact-link">Kontakt</a>
    </li>
    <li>
      <a href="/all">Se alle magasiner</a>
    </li>
  </ul>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在单击事件和使用 Vanilla JavaScript 加载新页面后滚动到元素

来自分类Dev

使用javascript将元素正确滚动到页面顶部

来自分类Dev

滚动到onClick JavaScript元素

来自分类Dev

滚动到页面javascript的特定高度

来自分类Dev

Javascript显示/隐藏滚动到页面顶部

来自分类Dev

JavaScript-向下滚动到元素

来自分类Dev

Javascript按ID滚动到特定元素

来自分类Dev

加载元素后滚动到div的底部?

来自分类Dev

加载页面后自动加载javascript函数

来自分类Dev

纯javascript自动滚动到页面底部,然后备份

来自分类Dev

如何使用Javascript检测滚动到页面开头的位置?

来自分类Dev

纯javascript自动滚动到页面底部,然后备份

来自分类Dev

滚动到部分时,JavaScript会加载内容

来自分类Dev

如何通过 url 链接加载页面并滚动到 html 元素?

来自分类Dev

在原始JavaScript中,如何在完全加载页面后选择使用innerHTML属性创建的元素?

来自分类Dev

滚动到特定的div底部后如何触发javascript函数?

来自分类Dev

创建元素后滚动到页面底部

来自分类Dev

加载整个页面后如何使用javascript重新加载页面

来自分类Dev

javascript背景水平/垂直滚动到元素站点:911之后

来自分类Dev

JavaScript-将溢出的列表元素滚动到视图中

来自分类Dev

页面加载完成后执行javascript

来自分类Dev

加载页面后如何获取JavaScript文件?

来自分类Dev

加载页面后,打开javascript菜单

来自分类Dev

页面加载后通过javascript显示图像

来自分类Dev

异步加载清单文件后如何加载页面javascript

来自分类Dev

页面加载后如何加载google maps外部javascript?

来自分类Dev

Rails仅在页面重新加载后才加载我的JavaScript

来自分类Dev

使用JavaScript维护页面加载之间的滚动位置

来自分类Dev

在新页面加载后启动页面平滑滚动到指定位置

Related 相关文章

  1. 1

    如何在单击事件和使用 Vanilla JavaScript 加载新页面后滚动到元素

  2. 2

    使用javascript将元素正确滚动到页面顶部

  3. 3

    滚动到onClick JavaScript元素

  4. 4

    滚动到页面javascript的特定高度

  5. 5

    Javascript显示/隐藏滚动到页面顶部

  6. 6

    JavaScript-向下滚动到元素

  7. 7

    Javascript按ID滚动到特定元素

  8. 8

    加载元素后滚动到div的底部?

  9. 9

    加载页面后自动加载javascript函数

  10. 10

    纯javascript自动滚动到页面底部,然后备份

  11. 11

    如何使用Javascript检测滚动到页面开头的位置?

  12. 12

    纯javascript自动滚动到页面底部,然后备份

  13. 13

    滚动到部分时,JavaScript会加载内容

  14. 14

    如何通过 url 链接加载页面并滚动到 html 元素?

  15. 15

    在原始JavaScript中,如何在完全加载页面后选择使用innerHTML属性创建的元素?

  16. 16

    滚动到特定的div底部后如何触发javascript函数?

  17. 17

    创建元素后滚动到页面底部

  18. 18

    加载整个页面后如何使用javascript重新加载页面

  19. 19

    javascript背景水平/垂直滚动到元素站点:911之后

  20. 20

    JavaScript-将溢出的列表元素滚动到视图中

  21. 21

    页面加载完成后执行javascript

  22. 22

    加载页面后如何获取JavaScript文件?

  23. 23

    加载页面后,打开javascript菜单

  24. 24

    页面加载后通过javascript显示图像

  25. 25

    异步加载清单文件后如何加载页面javascript

  26. 26

    页面加载后如何加载google maps外部javascript?

  27. 27

    Rails仅在页面重新加载后才加载我的JavaScript

  28. 28

    使用JavaScript维护页面加载之间的滚动位置

  29. 29

    在新页面加载后启动页面平滑滚动到指定位置

热门标签

归档