【问题标题】:Disable superfish on resize event在调整大小事件时禁用超级鱼
【发布时间】:2011-10-08 13:32:23
【问题描述】:

我正在尝试将 Superfish jQuery 插件与 Nathan Smith 的 adapt.js sn-p 结合起来,它会根据浏览器宽度动态加载不同的 CSS 文件。我想在移动模式下禁用/替换/某些 Superfish 菜单,因为下拉菜单在那里没有任何意义。我试图检测更改并禁用菜单,但是当窗口再次调整宽度时我需要重新启用它。

这是我所拥有的:

function htmlId(i, width) {
    document.documentElement.id = 'pagesize_' + i;
}

var ADAPT_CONFIG = {
  path: '/css/',
  dynamic: true,
  callback: htmlId,
  range: [
    '0px    to 760px  = mobile.css',
    '760px  = 960_12.css'
  ]
};

function sfMenu() {
    $("#pagesize_1 ul.sf-menu").superfish({ 
        delay:       800,
        animation:   {opacity:'show'},
        speed:       'fast',
        autoArrows:  true,
        dropShadows: true
    }); 
}

$(document).ready(function(){
    sfMenu();
});

基本原理是更改resize 上的html 元素的id(在pagesize_0pagesize_1 之间——可行)并在CSS 中使用后代选择器来禁用菜单,但这不起作用。我尝试在resize 上重新运行sfMenu()(代码未在上面显示),但它似乎没有检查更改后的DOM,意识到pagesize_1 不再存在,然后优雅地失败(我认为这会达到我的效果)米之后)。

有什么想法吗?理想情况下,我想销毁 resize-to-mobile 上的superfish 功能,然后在屏幕再次变大时重新启用它。

【问题讨论】:

  • 我尝试过使用 detach() 和 append() 但我没有运气 - 我无法让 appen() 正常工作。有人有什么想法吗?

标签: javascript jquery responsive-design superfish


【解决方案1】:

我一直在玩同样的事情,从水平导航栏样式(窗口比子导航宽)到垂直下拉样式(子导航比窗口宽)到纯 ol-list(主导航更宽比窗口)。

不确定它有多优雅,但最后 unbind() 和 removeAttr('style') 为我禁用了下拉菜单:

$(window).resize(function() {
    if ($(this).width() < maxNavigationWidth) {
        $('#neck .navigation').removeClass('sf-menu');
        $('.navigation li').unbind();
        $('.navigation li ul').removeAttr('style');
    } else {
        $('#neck .navigation').addClass('sf-menu').addClass('sf-js-enabled');
        applySuperfish();
    }
});

【讨论】:

  • 嗨@JonZa,我有同样的问题。你的代码很好。但我有一些小问题。它仍在鼠标悬停事件中打开菜单。我也想禁用它。可能吗。谢谢。
【解决方案2】:

SuperFish 有一个 'destroy' 方法(肯定在最新的 1.7.3 版本中),您可以根据屏幕大小调用它来禁用它,然后使用 CSS 媒体查询重新设置导航样式。当你想再次启用它时,你也可以调用 SuperFish 的“init”方法:

var sf, body;
var breakpoint = 600;
jQuery(document).ready(function($) {
    body = $('body');
    sf = $('ul.sf-menu');
    if(body.width() >= breakpoint) {
      // enable superfish when the page first loads if we're on desktop
      sf.superfish();
    }
    $(window).resize(function() {
        if(body.width() >= breakpoint && !sf.hasClass('sf-js-enabled')) {
            // you only want SuperFish to be re-enabled once (sf.hasClass)
            sf.superfish('init');
        } else if(body.width() < breakpoint) {
            // smaller screen, disable SuperFish
            sf.superfish('destroy');
        }
    });
});

这应该有望解释我在说什么:)

http://cdpn.io/jFBtw

【讨论】:

  • 我有类似的任务在特定屏幕尺寸上禁用 sf 菜单并在其他屏幕尺寸上启用,这个答案有助于实现正确的结果..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2011-03-18
  • 1970-01-01
  • 2011-01-13
  • 2019-02-01
  • 2022-10-01
相关资源
最近更新 更多