防止fancybox返回页面顶部

Posted

技术标签:

【中文标题】防止fancybox返回页面顶部【英文标题】:Preventing fancybox returning to top of page 【发布时间】:2014-08-26 10:28:22 【问题描述】:

在我的网站中,我使用的是 fancybox 2.1.5。当我打开图像并关闭它时,我无意中返回到页面顶部。问题可以在以下最小示例中看到

<!DOCTYPE html>
<head>
    <style media="screen" type="text/css">
        body 
            height: 100%;
        
        html 
            height: 100%;
        
    </style>
    <link rel="stylesheet" type="text/css" href="css/jquery.fancybox.css?v=2.1.5" media="screen" />
</head>
<body>
    <a href=#>
        <img src="http://placehold.it/1000x600">
    </a>
    <a class="fancybox" href="img/Gallery/500x600.gif">
        <img src="http://placehold.it/500x600">
    </a>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script type="text/javascript" src="js/jquery.fancybox.js?v=2.1.5"></script>
    <script>
        $(document).ready(function() 
            $('.fancybox').fancybox();
        );
    </script>
</body>
</html>

您会看到,如果您打开和关闭第二张图片,您会发现自己位于页面顶部。

看来如果我删除头部的初始样式

<style media="screen" type="text/css">
    body 
        height: 100%;
    
    html 
        height: 100%;
    
</style>

问题消失了。如果我只删除 body 样式或 html 样式,问题也会消失。为了让问题出现,body 和 html 的高度必须为 100%

很遗憾,我不明白为什么会这样。谁能解释一下?

注意:我已找到解决此问题的方法和技巧,但我想了解为什么会发生这种情况

【问题讨论】:

下载latest master,已修复该错误参考:github.com/fancyapps/fancyBox/issues/860 谢谢,我下载了最新的master,现在可以用了到原来的地方。这有点奇怪。让我觉得这个错误是通过黑客修复的。可能和我的body和html样式定义有关,但我不知道 fancybox2 / fancybox causes page to to jump to the top的可能重复 【参考方案1】:

您可以使用花式框的原生助手来解决返回页首问题。

$('.fancybox').fancybox(
  padding: 0,
  helpers: 
    overlay: 
      locked: false
    
  
);

参考:http://davekiss.com/prevent-fancybox-from-jumping-to-the-top-of-the-page/

【讨论】:

感谢您的破解,但我仍然不明白为什么会发生这种情况,现在我遇到了在查看图像时可以滚动的问题。宁可不要!但非常感谢您的快速回答 您有两个选项可以在 fancybox 打开时禁用覆盖滚动 1)。升级到 v2.1.0 ...它会自动将 class="fancybox-lock" 添加到 标记,因此您无法滚动fancybox 后面的页面 - 或 - 2)。添加这些回调: beforeShow: function() $("body").css('overflow-y':'hidden'); , afterClose: function() $("body").css('overflow-y':'visible'); onStart 和 onClosed 不是 fancybox v2.x 但 1.3.x 的有效回调选项 谢谢,不过我以为我用的是2.1.5 这是一个临时解决方法,可能会在某些情况下创建另一个问题(许多人可能不喜欢滚动fancybox 后面的内容,如果将locked 设置为false 会发生这种情况。 ) 这是一个错误,已在您可以从此处下载的最新版主中得到纠正github.com/fancyapps/fancyBox/archive/master.zip @Farshad 请说明您的代码的作用以及它如何回答问题。如果您得到一个代码 sn-p 作为答案,您可能不知道如何处理它。答案应该为 OP 和未来的访问者提供有关如何调试和解决问题的指导。指出您的代码背后的想法是什么,极大地有助于理解问题并应用或修改您的解决方案。也请考虑在答案中包含您的评论。【参考方案2】:

更新:如果您在指向带有 ID 的标签(例如,“https://example.com/#currentsection”)的 URL 上触发 Fancybox,似乎不起作用。当您退出 Fancybox 时,它不会转到页面顶部,但会滚动到带有 ID 的标签顶部,即使您已将 autoFocusplaceFocusBack 选项设置为 false。奇怪的是,如果您的 URL 指向 #top,它仍然有效。

原答案

我发现在 Next.js 中使用 Fancybox 时,使用 autoFocus set to false 绑定或配置 Fancybox 修复了这个问题。然后似乎placeFocusBack property(默认值:true)将适用。像这样设置它:

npm install --save @fancyapps/ui

components/fancybox-wrapper.js:

// Fancybox UI wrapper for lightbox
// Thanks to https://fancyapps.com/docs/ui/fancybox/react
import React,  useEffect  from "react";

import  Fancybox as NativeFancybox  from "@fancyapps/ui/dist/fancybox.esm.js";

function Fancybox(props) 
  const delegate = props.delegate || "[data-fancybox]";

  useEffect(() => 
    const opts = props.options || ;

    NativeFancybox.bind(delegate, opts);

    return () => 
      NativeFancybox.destroy();
    ;
  , []);

  return <>props.children</>;


export default Fancybox;

pages/_app.js:

import Fancybox from "../components/fancybox-wrapper";
import "@fancyapps/ui/dist/fancybox.css";
import  s-s-rProvider  from "@react-aria/s-s-r";

function MyApp( Component, pageProps ) 
  return (
    <s-s-rProvider>
      <Fancybox options= infinite: false, autoFocus: false >
        <Component ...pageProps />
      </Fancybox>
    </s-s-rProvider>
  );


export default MyApp;

【讨论】:

以上是关于防止fancybox返回页面顶部的主要内容,如果未能解决你的问题,请参考以下文章

[Fancybox 2.1加载AJAX模板,顶部留有很大的空白,但是当我以其他方式使用Fancybox时,不会发生此问题

单击 Fancybox Overlay div 时如何防止默认设置?

fancybox关闭弹出窗体parent.$.fancybox.close();

FancyBox 从 iframe 中关闭并将父页面带到链接

fancybox 图片库未显示在实时页面上

同一页面上的两个 iframe fancybox