如何通过响应式菜单阻止页面滚动

6
我正在尝试将响应式菜单插件正确地实现到WordPress主题中。问题出现在推送侧栏菜单打开时,导致body在垂直滚动时移动。
目前,有一个此模板页面的解决方案,效果很好,我很满意。
问题是: 考虑到外包WordPress的答案,可以调整下面的代码以使其在其他模板页面上更通用,例如这里,就像这里已经运行一样吗?
我认为.edge-ils-item-link.edge-ils-content-table是变量,但我不知道如何处理和适应它们,我曾尝试替换这些元素,但没有积极的结果,也许这并不简单,更复杂。我还知道edge-wrapperedge-wrapper-innerwpb_wrapper在每个页面中都可以找到,这些可能是共同的元素,可以改变解决方案,使其适用于每个页面。
另外,根据最新版本,最好准备好jQuery(此时我正在使用jQuery migrate 1.4.1和旧版本的Wordpress,以便至少在设计页面上功能正常)。 .scroll-lock{position:fixed !important;}
$(document).ready(function() {
    var windowTop = 0;
    var menuOpen = 0;
    var offsetContainerList = 0;

    $('#responsive-menu-pro-button').click(function() {
        var offsetScrollList = $('.edge-ils-item-link:first').offset().top; 

        if ($('html').hasClass('scroll-lock')) {
            $('#responsive-menu-pro-container').one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend",
              function(event) {
                  if (menuOpen==0) {
                      menuOpen = 1;
                      $('html').removeClass('scroll-lock');  
                      $('.edge-ils-content-table').css('top', eval(offsetContainerList)-40+'px'); //change image container top position
                      $('html').scrollTop(windowTop); //scroll to original position
                  }
                  else {   
                      menuOpen = 0;             
                  }
            });
        }
        else {                
            windowTop = $(window).scrollTop();
            offsetContainerList = $('.edge-ils-content-table').offset().top;  
            $('html').addClass('scroll-lock');      
            $('.edge-ils-content-table').css('top', -offsetScrollList + 'px'); //change image container top position
        }      
    }); 
}); 

如果有帮助的话,这里是存在问题的视频链接


1
你尝试过使用插入页眉和页脚插件在每个页面上添加代码吗? - Ugene
1
这个问题还没有解决吗?? - Moayad .AlMoghrabi
1
嗨,我肯定可以帮助你解决这个问题,你能提供一下你的网站链接吗? - IndustryDesigns
1
这似乎是一个简单的问题,但您没有提供我们帮助您的工具,请提供一个干净的示例(不包含任何添加的代码)以便我们进行调试,并解释期望的结果。从我理解的情况来看,当菜单打开时,您希望右侧无法滚动,文本保持不变? - Art3mix
1
再次提醒,您想让它工作的页面包含了错误的代码,我们无法在不工作的页面上测试,建立一个新的示例页面,删除您尝试的JS代码,重新开始。 - Art3mix
显示剩余9条评论
5个回答

1
我注意到你页面中名为“scroll-lock”的html元素的类scroll-lock没有添加,但在页面“ilinks-push”上却被添加了。因此,在子页面中,判断html是否具有此类将永远不成立。我重新编写了代码,使其查找所需的类responsive-menu-pro-open
此外,为了使其在子页面中正常工作,您需要理解所提供的代码逻辑。我进行了一些更改并添加了注释,以使其更清晰:
$(document).ready(function() {
    var windowTop = 0;

    $('#responsive-menu-pro-button').click(function() {

        /* check if there is a ils item link */
        if ( $('.edge-ils-item-link')[0] ) {
            /* save space above the element to variable */
            var offsetScrollList = $('.edge-ils-item-link:first').offset().top;
        }

        /****** Menu gets opened ******/

        if ($('html').hasClass('responsive-menu-pro-open')) {

            /* scroll to top of page */
            windowTop = $(window).scrollTop(); 
            /* add the scroll-lock class */
            $('html').addClass('scroll-lock');
            
            /* check if there is a ils item link */
            if ( $('.edge-ils-item-link')[0] ) {
                /* add the saved space again to look like the same scroll position we started with */      
                $('.edge-ils-content-table').css('top', -offsetScrollList + 'px'); 
            }
            
        }

        /****** Menu gets closed ******/

        else { 
            $('html').removeClass('scroll-lock');

            /* check if there is a ils item link */
            if ( $('.edge-ils-item-link')[0] ) {
                /* again use the saved space to make it look like the start position */
                $('.edge-ils-content-table').css('top', -offsetScrollList +'px');
            }

            $('html').scrollTop(windowTop);
        }

    }); 
}); 

你看到了代码中写有检查是否存在ils项目链接的部分吗?

这将是您子页面上不同的部分。

使用.offset().top,我们获取元素上方的空间。只有当实际上有类为.edge-ils-item-link的元素时,它才会起作用,这就是为什么我将代码放在if子句内部的原因。

在代码中,您使用上面的空格来定位元素的正确位置,因此它看起来像滚动被阻止了。

为了针对正确的元素,我们需要知道它们的类。

因此,您必须确保每个页面都在内容区域周围使用相同的类。这样,您就可以在javascript中的每个页面上定位它们,而无需额外的if子句。

或者你可以编写一堆if语句并检查页面中的元素。在名为“scroll-lock”的页面中,可能是info-field元素可用于设置间距。但是在这个页面中,内容是使用固定位置放置的(不知道为什么,你使用了一些花哨的块构建器还是什么?标记看起来很糟),因此当添加scroll-lock类和position:fixed;时会引起问题。
我认为你需要调整其他页面的内容,这样就可以解决这个问题。将每个子页面都制作成两列(使用flexbox)。也许左边的一列总是固定的,右边的一列是静态的,因此可以滚动。根据你提供的信息,我们不知道这一点。

我还要提到,我不是一个编码人员(对js / jquery没有任何了解),我只是试图解决这个问题,找到一种方法使响应式菜单能够与当前的wp主题正常工作。 - typo_
这样就可以涵盖两种情况。我不知道怎么做,但这是策略。另一方面,如果没有办法定义多个变量,只要我认为可以有一种方法来激活插件以针对特定页面,那么我不介意有两个不同的代码,每个页面一个。 - typo_
.edge-ils-item-link.edge-ils-content-table被用于Visual Composer块中,因此这些不是在每个页面中都能找到的通用元素。如果我们使用相同的元素重写代码,也不会影响此页面模板 - typo_
总之,为了更加清晰明了,我对于已经实现在target page上的代码感到满意。我正在尝试调整代码,以便在这个模板页面上也能产生相同的效果,通过改变一些变量来实现。 - typo_
我明白你的意思和问题。但是我无法帮助你的原因是你的另一个模板页面(不是工作页面)的结构。我能够定位的只有info-field,而它可能不存在于其他页面...或者这是您页面的唯一可能的其他结构吗?您需要滚动下去(!)检查元素上方的空间,但由于您的info-field从一开始就被固定了,我们需要图像。但是它们具有奇怪的标记,不知道这个视觉编辑器在做什么...顺便问一下,您在使用什么? - rank
显示剩余6条评论

1

好的,首先让我们谈谈这个问题:

插件在您的主要div上设置了transform: translateX(800px);,但是`transform`会从它所有的子元素中移除`position: fixed`属性,因此所有具有固定位置的内部div基本上都被移动到相对位置,所以它们基本上被移动到顶部。

过于复杂的解决方案:

当然,您可以尝试滚动用户到顶部,并保存他的位置,然后实现一个真正复杂的解决方案来解决此问题,但是,为了一个左侧菜单而进行如此多的工作似乎是太麻烦了。

简单的解决方案: 那么,为什么不省略`transform`,改用`margin-left`呢?

<style>

html.responsive-menu-pro-open {
  overflow-y: hidden !important;
  padding-right: 9px;
} 

#responsive-menu-pro-container {
  position: fixed !important;
}

#responsive-menu-pro-container {
  position: fixed !important;
  transform: none !important;
  margin-left: -800px;

  transition: 2.6s ease; 
  transition-timing-function: cubic-bezier(0.96, 0, 0.13, 1); 
  transition-property: margin-left; 
}

#responsive-menu-pro-button {
  transform: none !important;
  transition: 2.6s ease !important; 
  transition-timing-function: cubic-bezier(0.96, 0, 0.13, 1) !important; 
  transition-property: margin-left !important;
}

.responsive-menu-pro-open #responsive-menu-pro-button {
   margin-left: 800px;
}

#responsive-menu-pro-header {
  transform: none !important;
  transition: 2.6s ease; 
  transition-timing-function: cubic-bezier(0.96, 0, 0.13, 1); 
  transition-property: margin-left; 
}

.responsive-menu-pro-open #responsive-menu-pro-header {
  margin-left: 800px;
}

.responsive-menu-pro-open .edge-wrapper {
  transform: none !important;
}

.responsive-menu-pro-open .edge-wrapper .edge-wrapper-inner {
  margin-left: 800px;
}

.edge-wrapper .edge-wrapper-inner {
  transition: 2.6s ease; 
  transition-timing-function: cubic-bezier(0.96, 0, 0.13, 1); 
  transition-property: margin-left; 
}

.responsive-menu-pro-open .edge-content .edge-ps-navigation {
  margin-left: 800px;
}

.edge-content .edge-ps-navigation {
  transition: 2.6s ease; 
  transition-timing-function: cubic-bezier(0.96, 0, 0.13, 1); 
  transition-property: margin-left; 
}

.responsive-menu-pro-open #responsive-menu-pro-container {
  margin-left: 0;
  transition: 2.6s ease; 
  transition-timing-function: cubic-bezier(0.96, 0, 0.13, 1); 
  transition-property: margin-left; 
}

.responsive-menu-pro-open .edge-back-to-top-text {
  display: none;
}

</style>

通过添加上述片段,您模拟了所需的功能,而不使用margin-left进行转换。
注释-由于页面布局(有点混乱,很多固定位置元素在其他固定位置元素内),您需要将margin-left设置为不同的元素,改变页面布局将使其更容易应用此功能,甚至使用插件的本机转换功能。
此解决方案可能仅适用于您提供给我们的示例页面,您将需要在其他页面上将marign-left设置为正确的元素,但是如果您将所有页面布局放入单个包装器div中,并删除其他固定元素,则可以创建工作页面的单个代码片段。
底线-由于页面布局的问题,插件存在问题,与插件开发人员联系可能会给您更好的答案,他们可能会查看您特定的主题并带来更好的解决方案。没有看到您的代码,这是我在不尝试滚动的情况下找到的最佳解决方法。

0

根据我所理解的所需行为,我认为解决方案很简单,不必复杂:

我研究了页面和脚本行为,并发现类名为 scroll-lock 的类未添加到DOM中,但你可以仅依靠添加到HTML元素后的类名: responsive-menu-pro-open ,因此尝试设置一些CSS属性到这个类上,我认为您就可以继续了。请确认。

.responsive-menu-pro-open{
    position: fixed;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
}

希望这可以帮到你,因为我已经在自己的端上尝试过,并且它完美地工作了 :)

谢谢,这可能是一个开始和方法,但这里有一个视频。当菜单关闭时,滑动面板可以部分滚动(应保持固定),而链接/图像的行为不正确,在打开/关闭菜单序列中返回到顶部。另一个问题是信息字段也在移动。有些不对劲... - typo_
1
@typo_ 好的,我明白了,让我看看该怎么做。 - Moayad .AlMoghrabi

0
在body标签中添加min-height: 100vh;。仅当内容超出视口高度时,它才会显示垂直滚动条。
目前,在您的页面中,文档高度被锁定为相对定位子元素的总高度。请参考以下截图。 enter image description here

enter image description here


我猜应该是这样的 链接?不,它不起作用。无论如何,正如我所说,@OutsourceWordPress编写的上述代码仅适用于特定的页面,而不是每个页面,因此它不能通用。无论如何,还是谢谢你的时间。 - typo_

0

解决这个问题的最佳方式实际上是使用你正在使用的WordPress插件 Responsive Menu,它允许你编辑那些选项。我在我的网站 Couv's Corner中使用它。 以下是一些疑难解答解决方案:

  • 确保插件已更新到最新版本,因为更新后的版本要好得多。
  • 子菜单(嵌套在父类别下的菜单项)是最好的。在管理后台的“菜单”页面中自定义。
  • 检查你的主题。 Kadence WP是一个很好的主题。尝试一些操作,因为你的主题可能存在冲突。
  • 如果你使用缓存/CDN,请尝试运行网站数据库/文件优化并清除缓存/CDN。这可能会帮助你解决问题。
  • 希望这些帮助了您。请确保查看插件以及我在我的网站上的设置,看看您的想法如何。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接