如何根据Joomla 3中的设备或视口大小禁用模块以优化移动设备的性能?


14

我是自适应Web设计与自适应Web设计(即一种可调整所有设备的显示并根据视口大小提供内容的设计)相结合的支持者,而不是单独的“移动”网站设计。

有一些缺点,例如,在大型显示器上,我想包括一些对较小视口尺寸隐藏的模块。但是,在基于视口大小隐藏模块的情况下,当已知特定模块永远不会以较小的视口大小显示时,加载和执行该模块会导致不必要的性能下降。

如何使用视口大小有效地禁用模块(即,使其停止执行)以提高性能?

Answers:


15

高级模块管理器(http://www.nonumber.nl/extensions/advancedmodulemanager)允许您根据浏览器的TYPE分配模块。因此,您可以选择移动设备,台式机或特定设备。但是,它不允许您按大小选择,因此仅在一定程度上有用。

结合使用php和javascript也可能。我会将这个问题发送给我的好友,他可能有个主意。


真是个好主意,我从未想过以这种方式使用AMM。
jackJoe 2014年

Peter在AMM中加入了许多很棒的功能,这在我看来是必须具备的。
Faye 2014年

我同意这一点。如果我坚持不使用内置主题(例如,warp 7主题内置),那么我会使用AMM。
Brian Peat 2014年

@BrianPeat-您能否提供有关WARP7如何工作的更多详细信息?
NivF007 2014年

3
Warp 7在模板管理中具有一个面板,可让您单击桌面/平板电脑/电话的按钮,并根据这些设置打开和关闭模块。火箭主题在特殊课程中做类似的事情。我不知道的是模块是否已卸载,或者是否已加载所有内容然后又将其隐藏。我怀疑是后者,因为您可以在调整浏览器大小时看到它的变化。如果您完全根据大小卸载内容,那么如果您主动调整窗口大小会怎样?
Brian Peat 2014年

10

我不认为您应该禁用这样的模块,而仍称其为响应式设计。响应的部分原因是它将响应视口的变化,而不仅仅是针对不同的屏幕尺寸打印出不同的布局。

根据示例屏幕尺寸的不同,平板电脑在纵向模式下可能无法加载模块,但同一平板电脑在横向模式下可能需要该内容。


3
虽然这是事实,但实际上并没有真正有效。这意味着iPhone用户将永远不会拥有1440x900的屏幕分辨率,甚至无法调整视口大小。诸如“当我调整浏览器窗口大小时,外观会发生变化”的响应式设计实际上仅对想要炫耀的设计师有效。实际上,采用关闭模块并为不同屏幕尺寸更改输出的方法是完全可以的。
Don Gilbert 2014年

3
@Don抱歉,那时它根本不是响应式设计,而在Windows上工作时,台式机上有很多人会利用调整大小功能。响应式设计不响应视口变化,而不管它是否来自某个设备。
Spunkie 2014年

2
我同意。但是我不同意“响应式设计”的目标。正如我所说,设计师梦dream以求地炫耀。他们忘记了iPhone永远不会有很高的分辨率这一事实。tl; dr-响应式设计在移动设备上无关紧要。我宁愿节省网络带宽,也不愿拥有“纯粹的响应式设计”。
Don Gilbert

2
@DonGilbert和Spunkie-IMO-你们俩都是正确的。响应式Web设计的“严格”定义不包括修改“内容”-我将编辑问题以包括RWD /
AWD-

8

这是我前一段时间制作的JS类,可以使用javascript检测视口,但从未经过严格的测试,但是可以工作。

function ResJS(){
    this.min = 0;
    this.max = 0;
    this.config = config;
    this.width = function(){
        return jQuery(window).width();
    }
    this.breakpoint = function(min,max){
        this.min = min;
        this.max = max;
        this.outside = false;
        this.inside = false;
        this.triggeredOut = false;
        this.triggeredIn = false;
        this.enter = function(callback){
            var context = this;
            jQuery(window).on('resize',function(){
                if(context.min<context.width()&&context.max>context.width()){
                    if(!context.triggeredIn){
                        jQuery(document).ready(function(){callback(context.min,context.max)});
                        context.inside = true; //browser width has entered breakpoint
                        context.outside = false; //browser has left another breakpoint
                        context.triggeredIn = true; //triggered event for breakpoint
                        context.triggeredOut = false; //be ready to trigger leave event
                    }
                }else{
                    context.inside = false; //browser width is not within breakpoint
                    context.outside = true; //brower width is outside of breakpoint
                }
            });
            if(context.min<context.width()&&context.max>context.width()){
                jQuery(document).ready(function(){callback(context.min,context.max)});
                context.inside = true;
                context.outside = false;
                context.triggeredIn = true;
                context.triggeredOut = false;
            }else{
                context.inside = false;
                context.outside = true;
                context.triggeredOut = true;
                context.triggeredIn = false;
            }
            return this;
        }
        this.leave = function(callback){
            var context = this;
            jQuery(window).on('resize',function(){
                if(context.outside&&!context.triggeredOut){
                    jQuery(document).ready(function(){callback(context.min,context.max)});
                    context.triggeredIn = false;
                    context.triggeredOut = true;
                }
            });     
            return this;
        }
        return this;
    }
    return this;
}

基本上你是这样使用的

ResJS()
    .breakpoint(0,600)
    .enter(function(min,max){
        console.log(min,max,'enter');
    })
    .leave(function(min,max){
        console.log(min,max,'leave');
    });

断点具有用于宽度的最小/最大参数,然后是用于输入和离开的链接函数,并带有运行一些JS代码的回调。

我不能像我很久以前那样详细介绍它的工作原理,但是如果有帮助,您可以自由使用它。这可用于基于视口通过ajax加载模块。我相信joomla的com_ajax可以与此结合使用,以制作一些非常酷的功能。


1
这看起来像是一个难题的主要部分,并且具有有趣的可能性-谢谢您的回答,尤其是发布代码。
NivF007 2014年

1
最好的答案是我的同事,这或多或少是我的主意:P
Jordan Ramstad 2014年


3

如果要提高性能,请不要加载不必要的模块。如果在小屏幕上不需要,那么在大屏幕上也不需要。

具有较大设备显示屏的人们还希望拥有一个不会加载不必要内容的快速网站。您错误地假设较大的屏幕具有更多可用带宽。他们没有。

成为一名优秀的设计师,无论您的屏幕大小如何,都为您的所有用户提供最佳的网站体验。


2

我建议浏览器嗅探是错误的方法。如果您确实只想根据屏幕宽度加载模块,则需要运行一些javascript,然后通过AJAX(com_ajax)调用该模块。请记住,针对由AJAX加载的内容进行搜索引擎优化可能会有所收获。


2

我通常使用css @media来实现这一目标。使您可以轻松地根据屏幕大小隐藏事物,并让它们在横向平板电脑足够宽以显示而纵向宽度没有的情况下进行解析。这是一个例子:

@media (max-width:699px) {
    #moduleid, .modulewrapperclass {display:none}
}

我通常使用它来隐藏整个模块位置,因此我将css选择器基于该位置的包装器(或某些模板中的位置)。


感谢您的回答。CSS媒体查询方法的问题在于,您仍在执行模块(即使您选择不显示它)。我要的解决方案除非显示,否则不会执行该模块。
NivF007

正如其他人所说,对于在页面加载后更改视口大小以及横向或纵向平板电脑的人们来说,这并不是最好的主意。服务器解析该模块所花费的百分之几秒将无关紧要,并且由于它是显示的:在较小的设备上,您不会渲染它,因此也不会浪费时间。-但是,如果您真的不想加载它,那么高级模块管理器可能是另一个答案中的链接。
探路者2014年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.