在某个滚动点开始页面

Posted

技术标签:

【中文标题】在某个滚动点开始页面【英文标题】:Starting a page at a certain scroll point 【发布时间】:2012-06-26 09:16:00 【问题描述】:

有没有办法(使用 CSS3、JS 或介于两者之间的任何东西)让页面从向下滚动的某个点开始?

我希望我的页面在加载时最初不显示标题(这意味着它在用户的实际视口之上)。

有没有简单/容易的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

jquery 中有一个名为 .scroll() 的函数。您可以使用该函数使您的标题仅在用户滚动站点时可见..

【讨论】:

【参考方案2】:

您可以使用标准 javascriptwindow.scroll(x, y)

考虑到您将在onload 执行此操作,这应该工作得很好,即窗口应该从 (0, 0) 开始。玩弄(x, y),直到你把标题放到你满意的位置。当然,您需要在标题移动时随时更改它。

例子:

<body onLoad="window.scroll(0, 150)">

【讨论】:

在 Chrome 版本 80.x 中,我无法让它与 onload 事件一起使用。它仅在我将行为分配给用户单击的按钮时才有效。是安全问题吗? 我一直在寻找。谢谢好心的先生/女士:) @MatthewSzurkowski 很高兴这有帮助,但请注意,如今可能有更好的方法来做到这一点,而不是像我的回答中的示例那样依赖潜在的硬编码像素值。这取决于您的需求,但是 a) 如果您使用特定的现代前端框架,该框架可能有更好的方法来做到这一点; b) 在任何情况下,我都建议使用已知 DOM 元素(页面上的其他内容)相对于您要显示的内容的位置,而不是硬编码的像素值。【参考方案3】:

html/DOM 解决方案

如果您将id 分配给div,并在标题之后包含您的内容,那么您可能可以使用http://website.com/page#id 这种类型的URL 加载页面。

这会将您带到 div 所在的位置。

Javascript 解决方案

您可以在页面加载时使用window.scroll(x,y)

【讨论】:

这帮助了我。谢谢! 您的第一个解决方案是 HTML 或 DOM 解决方案。它与 CSS 无关。 @David 接受的答案是 JS 解决方案,并且问题没有为此指定仅 CSS 的解决方案。 你误会了。也许我应该编辑你的答案,但我所做的只是批评你给第一个解决方案的标题——而不是解决方案本身。您将其命名为“CSS 解决方案”,但它应该命名为“HTML 解决方案”或“HTML/DOM 解决方案”,因为它不涉及 CSS。它使用 id 的事实意味着它使用 DOM,但您不必具有与 id 关联的样式才能使其工作。【参考方案4】:

使用 javascript scrollBy。要使此方法起作用,必须将窗口滚动条的可见属性设置为 true。因此,请确保您的页面足够长,以便垂直滚动条出现。

<html>
<head>
</head>
<body onLoad="window.scrollBy(0,100)">
     <div style="height:300px;"> Some text </div>
     <div style="height:900px;"> Some text 2 </div>
</body>
</html>

【讨论】:

【参考方案5】:

HTML - 命名锚点

您也可以使用好的旧锚。 使用

定义命名锚点
     <a id="start">any text</a>

这应该在必须看到的地方定义。由于即使在屏幕底部也可以看到它,您可能需要将锚点设置在比要求低一点的位置。这样,我们将确保顶部不需要显示的内容被很好地隐藏。 一旦定义为在页面加载时向下滚动,URL 应该是 page.aspx#start 而不是 page.aspx

<a href="#start">access within the same page</a>

<a href="page.aspx#start">access from outside the page</a>

【讨论】:

【参考方案6】:

使用Javascriptwindow.scroll:

$(window).scroll(function() 
  if ($(this).scrollTop() > 100) 
    $('something').hide();
   
  else
      $j('something').show();

  
);​

【讨论】:

【参考方案7】:

这些都是非常简单的技巧:

    创建css偏移类并分配给body

    .offset
         margin-top:-500px;
        
    

    因此,body 将加载 500px 偏移距顶部

    然后在正文中添加以下代码

    <body class="offset" onLoad="window.scroll(0, 150)">
    

    然后使用jquery,在页面加载时移除offset类

    $(document).ready(function()
       $(".row").removeClass("offset");
    );
    

【讨论】:

这比其他的效果更好!使用此解决方案用户根本不会注意到滚动,而使用 &lt;body onLoad="window.scroll(0, 150)"&gt; 时页面会在加载完成时滚动,这对用户来说很烦人。 虽然 offset 类可能只应该首先通过 JS 添加 - 否则,当 JS 不可用时,margin-top:-500px 将保持原位并生成前 500 像素的内容无法通过滚动...(并且使用 vanilla JS 和“老派”事件处理进行滚动,但是用于类删除的 jQuery 也不是最有意义的 - 为什么不采用相同的方式?) @CBroe 我想我试过了,但对我没用。 when JS is not available the margin-top:-500px will stay in place and will make the first 500 pixels of content unreachable by scrolling,就是这样。例如,参见 500px 配置文件。【参考方案8】:

当前答案会导致页面明显“跳转”,或者要求您知道要跳转的确切像素数。

我想要一个跳过容器的解决方案,无论容器的大小/内容如何,​​这就是我想出的:

HTML

<div class="skip-me">Skip this content</div>

CSS

// Hide the content initially with display: none.
.skip-me 
  display: none;

.unhide 
  display: block;

JS

// Unhide the content and jump to the right place on the page at the same time
function restoreAndSkipContent() 
  var hidden = document.querySelector('.skip-me');

  hidden.classList.add('unhide');
  window.scroll(0, hidden.offsetHeight);
;
restoreAndSkipContent();

Working Demo Here

【讨论】:

我发现这段代码非常有用,谢谢分享!为什么它在移动设备(Safari/Crome)上不起作用? @bryanbraun 看起来 ios 可能需要 setTimeout 之类的东西才能将滚动指令运行到堆栈顶部。见***.com/a/19929617/1154642 和hackernoon.com/understanding-js-the-event-loop-959beae3ac40 试过了,没用,滚动仍然在页面顶部@bryanbraun【参考方案9】:

这对我有用。

<div class="demo">
        <h2>Demo</h2>
</div>


<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
    <script>
        $(document).ready(function () 
            $('html, body').animate(
                scrollTop: $('.demo').offset().top
            , 'slow');
        );
    </script>

谢谢。

【讨论】:

【参考方案10】:

综合解决方案

每个单一的 JavaScript 优先解决方案都可能(并且通常确实)在 pageLoad 事件之前导致打嗝。正如 Uday 所建议的,实现无缝滚动加载的最佳方法是使用负 CSS 边距。

就我个人而言,我使用类似于 Uday 的代码 sn-p,但稍作调整以使其在没有 JavaScript 的浏览器中也能工作,并且不会重复滚动声明。

<!doctype html>
<html>
<head>
    <style>
        /* Can be in an external stylesheet as well */
        /* This is the ONLY place where you will specify the scroll offset */
        BODY.initialoffset margin-top: -100px; /* Or whatever scroll value you need */
    </style>
    <noscript>
        <!-- Browsers without JavaScript should ignore all this margin/scroll trickery -->
        <style>
            BODY.initialoffset margin-top: initial; /* Or 0, if you wish */
        </style>
    </noscript>
</head>
<body onLoad = "(function()var B=document.getElementsByTagName('body')[0],S=B.currentStyle||window.getComputedStyle(B),Y=parseInt(S.marginTop);B.className=B.className.replace(/\binitialoffset\b/g,'');window.scroll(0,-Y);)()">
</body>
</html>

onLoad属性中的短自调用函数可以展开如下:

(function()
    /* Read the marginTop property of the BODY element */
    var body=document.getElementsByTagName('body')[0],
        style=body.currentStyle||window.getComputedStyle(body),
        offsetY=parseInt(style.marginTop);
    /* Remove the initialoffset class from the BODY. (This is the ugly, but everywhere-working alternative)... */
    body.className=body.className.replace(/\binitialoffset\b/gi,'');
    /* ...and replace it with the actual scroll */
    window.scroll(0, -offsetY);
    )()

【讨论】:

【参考方案11】:

我发现@bryanbraun 的建议非常有用。我发现删除 window.scroll 对隐藏导航栏产生了很好的效果。我只是将它添加到我的文档的头部:

      <script>
        function restoreSkippedContent() 
          var hidden = document.querySelector('.onScrollHide');

          hidden.classList.add('unhide');
          // window.scroll(0, hidden.offsetHeight);
        ;
      </script>
      <style>
        .onScrollHide 
          display: none;
        
        .unhide 
          display: unset !important;
        
      </style>

然后在我的导航栏周围添加一个包装器和一个 onscroll 触发器而不是 onload:

<body onscroll="restoreSkippedContent()">
  <div class="navBarContainer onScrollHide">
    <nav> .... </nav>
  </div>
  ...
</body>

这是不会对用户造成任何干扰的好效果,但是当他们向上滚动时,他们会看到导航栏:)

目前正在使用中here

【讨论】:

【参考方案12】:

我遇到了问题中提到的完全相同的问题:

“我希望我的页面在加载时不显示标题”

我不是 Javascript 专家,但我认为我找到了一种聪明的方法,因为其他答案对最终结果并不满意。这是我的方式:

CSS:

#header display:none

JS:

window.onscroll = function() document.querySelector('#header').style.display = "block"
window.onload = function () window.scrollTo(top: 1,behavior: 'smooth')   

这是我运行的网站上的video preview。

这对我来说很完美。向下滚动 1 像素真的不是一个交易破坏者恕我直言,几乎不可能注意到,并且允许能够直接滚动顶部。

【讨论】:

【参考方案13】:
    function ScroolPositionButtom() 
    var elment = document.querySelector(".right .chat.active-chat");
    elment.scrollTo(0, elment.scrollHeight);

这对我有用。 我将此函数用于特定的类。

【讨论】:

如果你能在你的答案中添加一个解释,那么它会改进很多。

以上是关于在某个滚动点开始页面的主要内容,如果未能解决你的问题,请参考以下文章

在某个点停止固定位置滚动?

当滚动到达页面的某个点时,使用其他内容进行位置固定的 div 滚动

从底部开始然后向上滚动

检测访问者是不是滚动到页面中的某个点的最明智的方法是啥?

元素跟随着滚动条运动

如何让导航栏在滚动到设定点后松开?