【问题标题】:Show or hide button text responsively in jQuery Mobile在 jQuery Mobile 中显示或隐藏响应式按钮文本
【发布时间】:2013-02-07 12:19:57
【问题描述】:

我有一个带有一些按钮的 jQuery Mobile 网站。如果视口为 640 像素或更宽,我想在按钮右侧显示一些文本,否则隐藏文本。

我知道 iconpos option/data-attribute 是为此目的而设计的,并且可以将其设置为 left 以在我需要时显示文本,而在我不需要时则设置为 notext。我可能会想出一些 Javascript 来更改属性并在页面加载、方向更改和窗口调整大小事件时刷新按钮,但这可能会变得很麻烦,而且我不确定我是否忘记了一些可能导致视口的事件宽度要改变。

编辑 2: 我在几个浏览器和设备上测试了我的网站,它似乎改变了方向、调整窗口大小以及显示和隐藏屏幕键盘(在这些东西是可能)总是导致在window 对象上触发resize 事件。当然,我不确定这是否会在所有浏览器中总是发生。

我考虑过使用某种媒体查询将文本上的 display CSS 属性设置为 inlinenone,具体取决于视口宽度,但在查看 jQuery Mobile 的代码后,似乎iconpos 选项不仅影响文本的可见性:它影响尺寸、标题属性、图标位置和其他一些东西,因此仅使用 CSS 可能无法实现。

编辑:我忘了提到该按钮位于标题中,因此它是内联按钮之一。简单地通过 CSS 隐藏文本会让它看起来很有趣。

这里有人知道根据视口宽度显示或隐藏文本的简单实用方法吗?或者作为一个更普遍的问题,这里有没有人知道如何根据视口宽度更改数据属性并让 jQuery Mobile 在视口宽度发生变化时确认更改?我找到了一个 similar question 关于更改数据属性,它没有任何合理的答案。

【问题讨论】:

  • 我不确定这是否会对您有所帮助,但有一个网站可以很好地显示文本。 adnbutton.com
  • 你能发布任何相关代码或创建jsfiddle吗?
  • jquery 的好答案 >=1.4 stackoverflow.com/questions/21741088/…

标签: javascript jquery html css jquery-mobile


【解决方案1】:

这是一个纯 css 解决方案,适用于 IE8+ 和所有其他浏览器。请注意,代码来自 Twitter-Bootstrap,只是稍作修改。

DEMO

<button type="submit" class="btn btn-primary" value="Submit">
    <i id="versturen" class="fa fa-check"></i>
    <span class="sr-only-xs"> Versturen</span>
</button>

@media (max-width: 767px) {
  .sr-only-xs {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0,0,0,0);
    border: 0;
  }
}

【讨论】:

    【解决方案2】:

    在转到仅限类的按钮声明之后,这在 jQuery Mobile 1.4 beta 1 中非常适合我。

    $(window).on("throttledresize", function() {
      var smallButtons = $(window).width() <= 480;
      $('#article_nav a').toggleClass('ui-btn-icon-notext', smallButtons);
      $('#article_nav a').toggleClass('ui-btn-icon-left', !smallButtons);
    });
    

    【讨论】:

    • 放入一个自己的函数,添加一个准备好的文档,就像一个魅力!
    【解决方案3】:

    适用于data-icon类型的a和button标签,在html中默认设置data-iconpos="notext",然后绑定pagebeforecreate orientationchange事件根据屏幕宽度添加或删除属性:

    $(document).on('pagebeforecreate orientationchange', updateIcons);
    
    function updateIcons () {
        if ($(window).width() > 480) {
            $('a[data-icon], button[data-icon]').removeAttr('data-iconpos');
        } else {
            $('a[data-icon], button[data-icon]').attr('data-iconpos', 'notext');
        }
    }
    

    编辑:看起来它只适用于页面创建,而不适用于方向更改。

    信用:Aurelio@buildmobile.com

    【讨论】:

    • 当用户调整窗口大小时,这是否适用于非移动设备?我认为这也需要绑定到resize 事件。
    • 我在工作,我可以对此进行测试,但它似乎根本不起作用。简单地更改data-iconpos 属性不会使文本出现或消失。按钮需要刷新。看我的回答。
    • 它适用于页面创建,但似乎不适用于方向更改(我已经测试过,您可以通过下载[这个应用程序[(dropbox.com/s/95qmzdyvms924gg/WhereIparkedmycar-debug.apk?m)例如)来做同样的事情。也许为了让它在方向改变或调整大小上起作用,需要一些额外的代码来触发 jquery-mobile 页面创建事件,但我现在不需要研究这个。
    【解决方案4】:

    这是一个纯 CSS 解决方案,它需要一个 HTML5 浏览器,但 jQuery Mobile 也需要一个:

    /* Less then 620 px -------------------*/ 
    @media all and (max-width: 620px){  
        #custom-button span span { visibility:hidden;} 
    }       
    
    /* More then 640 px -------------------*/ 
    @media only screen and (min-width: 640px) {
        #custom-button span span { visibility:visible;} 
    }  
    

    可见性是比显示更好的解决方案,因为按钮高度将保持不变。

    这是一个有效的 jsFiddle 示例:http://jsfiddle.net/Gajotres/adGTK/,只需拉伸结果区域即可查看差异。

    编辑:

    这样就可以了,例子也一样:http://jsfiddle.net/Gajotres/adGTK/

    /* Less then 639 px -------------------*/ 
    @media all and (max-width: 639px){  
        #custom-button span span.ui-btn-text 
        { 
            left: -9999px !important;
            position: absolute !important;
        } 
    
        #custom-button span span.ui-icon 
        { 
            float: left !important;
            margin: 2px 1px 2px 3px !important;
            display: block !important;
            z-index: 0 !important;   
            position: relative;
            left: 0 !important;
        } 
    
        #custom-button span.ui-btn-inner
        { 
            padding: 0 !important;
        } 
    
        #custom-button
        { 
            height: 24px !important;
            width: 24px !important;
            margin-top: 5px;
        }     
    }       
    

    此示例仅适用于使用 标记创建的按钮。

    【讨论】:

    • 我忘了提到我正在使用内联按钮。这种按钮应该比没有文字的按钮小得多。无论如何,我尝试了你的想法,它只是保持按钮大小相同,但隐藏了图标和文本。
    • 另外,我不知道span span是否是一个可靠的选择器,用于定位按钮上的文本,或者按钮内部的结构是否会在未来的jQuery Mobile版本中发生变化。
    • 您可以看到当我在 jsfiddle.net/7mvdc 的内联按钮上尝试您的想法时会发生什么的示例。
    • 无论您使用哪种按钮类型,此解决方案都将有效。如果按钮结构发生变化,您的代码也会发生变化,无论您在这种情况下使用 javascript 还是 css 解决方案。 jQuery Mobile 没有按钮文本更改功能(如图标更改),因此如果您不想使用纯 CSS,则需要使用 javascript/jQuery 解决方案。 CSS 解决方案更好,因为您不会再做任何不必要的 javascript 处理,而且祝您在 100 多种不同设备中找到真正的屏幕宽度,并且视口计算一直在变化(这里指的是 iOS 平台)。
    • 显然我没有全面阅读您的问题,您所说的“我想在按钮的右侧显示一些文字”是什么意思?
    【解决方案5】:

    这是迄今为止我想出的最好的东西:

    $(window).resize(function() {
        $(".ui-btn-left, .ui-btn-right, .ui-btn-inline").filter("[data-icon]")
            .buttonMarkup({iconpos: window.innerWidth >= 640 ? "left" : "notext"})
            .buttonMarkup("refresh");
    });
    
    $(document).delegate("[data-role=page]", "pageinit", function() {
        $(window).resize();
    });
    

    【讨论】:

    • 与使用 JS 相比,媒体查询在解决此类问题方面要好得多。那是因为移动浏览器始终支持 MQ。
    • 我应该在媒体查询中加入什么规则?我看了 Gajotres 的回答,看起来有点脆弱。
    • 如果您不发布用例,我们应该如何知道所需的代码!?
    • 手机浏览器一直支持MQ是什么意思?我敢肯定,有一些不是,尽管它们可能越来越不常见。无论如何,我认为任何支持 Javascript 的浏览器都支持 window.innerWidth,或者如果不支持,我可能可以使用 jQuery 的 width 函数获得宽度。
    • 我想我在问题中描述了我的用例。你有什么理解困难的地方吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多