jQuery Mobile导航栏中每行超过5个项目

时间:2011-05-28 11:34:11

标签: jquery mobile jquery-mobile navbar

我未成功查找变量以更改导航栏中单行中的最大项目数。

我刚开始使用jQuery Mobile,试图创建一个包含大约7个单字母项目的导航栏。当存在超过5个项目时,导航栏会自动换行,这对我的项目来说是不受欢迎的。

有人能指出我在代码或css中控制这种行为吗?

8 个答案:

答案 0 :(得分:18)

你是对的,jQM将列限制为5.查看代码,这似乎是函数:

/*
* jQuery Mobile Framework : plugin for creating CSS grids
* Copyright (c) jQuery Project
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*/ 
(function($, undefined ) {
$.fn.grid = function(options){
    return this.each(function(){
        var o = $.extend({
            grid: null
        },options);


        var $kids = $(this).children(),
            gridCols = {solo:1, a:2, b:3, c:4, d:5},
            grid = o.grid,
            iterator;

            if( !grid ){
                if( $kids.length <= 5 ){
                    for(var letter in gridCols){
                        if(gridCols[letter] == $kids.length){ grid = letter; }
                    }
                }
                else{
                    grid = 'a';
                }
            }
            iterator = gridCols[grid];

        $(this).addClass('ui-grid-' + grid);

        $kids.filter(':nth-child(' + iterator + 'n+1)').addClass('ui-block-a');
        if(iterator > 1){   
            $kids.filter(':nth-child(' + iterator + 'n+2)').addClass('ui-block-b');
        }   
        if(iterator > 2){   
            $kids.filter(':nth-child(3n+3)').addClass('ui-block-c');
        }   
        if(iterator > 3){   
            $kids.filter(':nth-child(4n+4)').addClass('ui-block-d');
        }   
        if(iterator > 4){   
            $kids.filter(':nth-child(5n+5)').addClass('ui-block-e');
        }

    }); 
};

这需要一些工作,但您可以将其扩展到所需的7列布局。 您还需要添加自定义CSS来处理新列,因此您的新函数看起来像这样

/*
* jQuery Mobile Framework : plugin for creating CSS grids
* Copyright (c) jQuery Project
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*/ 
(function($, undefined ) {
$.fn.grid = function(options){
    return this.each(function(){
        var o = $.extend({
            grid: null
        },options);


        var $kids = $(this).children(),
            gridCols = {solo:1, a:2, b:3, c:4, d:5, e:6, f:7},
            grid = o.grid,
            iterator;

            if( !grid ){
                if( $kids.length <= 7 ){
                    for(var letter in gridCols){
                        if(gridCols[letter] == $kids.length){ grid = letter; }
                    }
                }
                else{
                    grid = 'a';
                }
            }
            iterator = gridCols[grid];

        $(this).addClass('ui-grid-' + grid);

        $kids.filter(':nth-child(' + iterator + 'n+1)').addClass('ui-block-a');
        if(iterator > 1){   
            $kids.filter(':nth-child(' + iterator + 'n+2)').addClass('ui-block-b');
        }   
        if(iterator > 2){   
            $kids.filter(':nth-child(3n+3)').addClass('ui-block-c');
        }   
        if(iterator > 3){   
            $kids.filter(':nth-child(4n+4)').addClass('ui-block-d');
        }   
        if(iterator > 4){   
            $kids.filter(':nth-child(5n+5)').addClass('ui-block-e');
        }
            if(iterator > 5){   
            $kids.filter(':nth-child(6n+6)').addClass('ui-block-f');
        }
            if(iterator > 6){   
            $kids.filter(':nth-child(7n+7)').addClass('ui-block-g');
        }

        }); 
    };
}); // end

在CSS中:

改变这个:

.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;}

到此:

.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e, .ui-block-f, .ui-block-g { margin: 0; padding: 0; border: 0; float: left; min-height:1px;}

并添加以下内容:

/* grid e: 16/16/16/16/16/16 */
.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e .ui-block-f { width: 16%; }
.ui-grid-d .ui-block-a { clear: left; }

/* grid f: 14/14/14/14/14/14/14 */
.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e .ui-block-f .ui-block-g { width: 14%; }
.ui-grid-d .ui-block-a { clear: left; }

也可能有其他变化,但这些变化在目前很突出。

失败尝试使用导航栏的按钮,但它们也相互堆叠:Live Link

答案 1 :(得分:14)

使用jQuery mobile 1.4.0,我所要做的就是创建自己的CSS类:

.mytab {
    width: 12.5% !important;  /* 12.5% for 8 tabs wide */
    clear: none !important;  /* Prevent line break caused by ui-block-a */
}

..并将其列入我的列表:

<ul id='tabsList'>
  <li class="mytab"><a href="#tab1" data-ajax="false">One</a></li>
  <li class="mytab"><a href="#tab2" data-ajax="false">Two</a></li>
  <li class="mytab"><a href="#tab3" data-ajax="false">Three</a></li>
  <li class="mytab"><a href="#tab4" data-ajax="false">Four</a></li>
  <li class="mytab"><a href="#tab5" data-ajax="false">Five</a></li>
  <li class="mytab"><a href="#tab6" data-ajax="false">Six</a></li>
  <li class="mytab"><a href="#tab7" data-ajax="false">Seven</a></li>
  <li class="mytab"><a href="#tab8" data-ajax="false">Eight</a></li>
</ul>

(原来答案有jQuery手机版错了)

答案 2 :(得分:5)

来自Phill Pafford

“并添加以下内容:......” {    css代码 }

请更改为....(注意:宽度更改为16.65%。此注释已添加,因为StackOverflow不允许进行单字母编辑。)

/* grid e: 16/16/16/16/16/16 */
.ui-grid-e .ui-block-a, .ui-grid-e .ui-block-b, .ui-grid-e .ui-block-c, .ui-grid-e .ui-block-d, .ui-grid-e .ui-block-e, .ui-grid-e .ui-block-f { width: 16.65%; }
.ui-grid-e .ui-block-a { clear: left; }

/* grid f: 14/14/14/14/14/14/14 */
.ui-grid-f .ui-block-a, .ui-grid-f .ui-block-b, .ui-grid-f .ui-block-c, .ui-grid-f .ui-block-d, .ui-grid-f .ui-block-e, .ui-grid-f .ui-block-f, .ui-grid-f .ui-block-g { width: 14.2857%; }
.ui-grid-f .ui-block-a { clear: left; }

答案 3 :(得分:4)

您可以尝试其他方式在导航栏中添加所需数量的项目。让我解释一下。

导航栏的HTML就像是休闲。

<div data-role="navbar" id="my-navbar">
<ul>
    <li><a href="a.html">One</a></li>
    <li><a href="b.html">Two</a></li>
    <li><a href="a.html">Three</a></li>
    <li><a href="b.html">Four</a></li>
    <li><a href="a.html">Five</a></li>
    <li><a href="b.html">Seven</a></li>
</ul>

添加此Jquery函数以从<ul>中删除类ui-grid-a,以限制导航栏上的项目数。

$(document).ready(function() {

    $("#my-navbar > ul").removeClass("ui-grid-a");

});

现在您必须计算每个导航栏项的宽度,或者您可以手动设置它。在此示例中,我们在导航栏上显示了7个项目,我们希望将空间平均分配给每个项目。

对于PHP页面,我们将执行此操作。

<?php

/// calculating width of each navbar ///

$width = 100/7; /// dividing 100% space among 7 items. If data is coming form DB then use mysql_num_rows($resource) instead of static number "7"
?>

<style>

.ui-block-a {
width:<?php echo $width;?>% !important;
}
.ui-block-b {
width:<?php echo $width;?>% !important;
}

</style>

<?php

/// end calculating ///
?>

对于静态HTML页面,您可以手动设置每个项目的宽度

<style>

.ui-block-a {
width:14.28% !important;
}
.ui-block-b {
width:14.28% !important;
}

</style>

多数民众赞成:)

我已经将它用于我,它运作正常。

答案 4 :(得分:2)

<强>后:

/ * grid d:20/20/20/20/20 * / .ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block- d,.ui-grid-d .ui-block-e {width:19.925%; } .ui-grid-d&gt; :nth-​​child(n){width:20%; } .ui-grid-d .ui-block-a {clear:left; }

CSS中的

,ADD

/ * grid e:16/16/16/16/16/16 * / .ui-grid-e .ui-block-a,.ui-grid-e .ui-block-b,.ui-grid-e .ui-block-c,.ui-grid-e .ui-block- d,.ui-grid-e .ui-block-e,.ui-grid-e .ui-block-f {width:16.66%; } .ui-grid-e&gt; :nth-​​child(n){宽度:16.6%; } .ui-grid-e .ui-block-a {clear:left; }

/ * grid f:14/14/14/14/14/14/14 * / .ui-grid-f .ui-block-a,.ui-grid -f .ui-block-b,.ui-grid -f .ui-block-c,.ui-grid-f .ui-block- d,.ui-grid-f .ui-block-e,.ui-grid-f .ui-block-f,.ui-grid -f .ui-block-g {width:14.28%; } .ui-grid-f&gt; :nth-​​child(n){width:14.28%; } .ui-grid-f .ui-block-a {clear:left; }

在js中进行一些修改:

(function( $, undefined ) {
$.fn.grid = function( options ) {
    return this.each(function() {

        var $this = $( this ),
            o = $.extend({
                grid: null
            }, options ),
            $kids = $this.children(),
            gridCols = { solo:1, a:2, b:3, c:4, d:5, e:6, f:7 },
            grid = o.grid,
            iterator;

            if ( !grid ) {
                if ( $kids.length <= 7 ) {
                    for ( var letter in gridCols ) {
                        if ( gridCols[ letter ] === $kids.length ) {
                            grid = letter;
                        }
                    }
                } else {
                    grid = "a";
                    $this.addClass( "ui-grid-duo" );
                }
            }
            iterator = gridCols[grid];
            //alert(iterator);

        $this.addClass( "ui-grid-" + grid );

        $kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" );

        if ( iterator > 1 ) {
            $kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" );
        }
        if ( iterator > 2 ) {
            $kids.filter( ":nth-child(" + iterator + "n+3)" ).addClass( "ui-block-c" );
        }
        if ( iterator > 3 ) {
            $kids.filter( ":nth-child(" + iterator + "n+4)" ).addClass( "ui-block-d" );
        }
        if ( iterator > 4 ) {
            $kids.filter( ":nth-child(" + iterator + "n+5)" ).addClass( "ui-block-e" );
        }
        if ( iterator > 5 ) {
            $kids.filter( ":nth-child(" + iterator + "n+6)" ).addClass( "ui-block-f" );
        }
        if ( iterator > 6 ) {
            $kids.filter( ":nth-child(" + iterator + "n+7)" ).addClass( "ui-block-g" );
        }
    });
};
})( jQuery );

您最多可以使用7个网格。 在html代码中,对于6格,使用data-grid =“e”,对于7格,使用data-grid =“f”。

答案 5 :(得分:2)

OP没有明确表示有5个以上的奇数项。对于偶数,我们可以将jQuery的响应网格与navbar一起使用。

e.g。

<div data-role="navbar">
    <div class="ui-grid-a center">
        <div class="ui-block-a">
            <ul>
                <li><a href="#" data-icon="camera">camera</a></li>
                <li><a href="#" data-icon="edit">edit</a></li>
                <li><a href="#" data-icon="gear">settings</a></li>
            </ul>
        </div>
        <div class="ui-block-b">
            <ul>
                <li><a href="#" data-icon="grid">grid</a></li>
                <li><a href="#" data-icon="info">about</a></li>
                <li><a href="#" data-icon="mail">mail</a></li>
            </ul>
        </div>
    </div>
</div>

答案 6 :(得分:0)

white-space属性指定如何处理元素内的空白区域。

nowrap:空格的序列将折叠为单个空格。文本永远不会换行到下一行。文本继续在同一行,直到遇到<br />标记

还有CSS自动换行属性

break-word:必要时,内容将换行到下一行,如果需要,也会发生分词。

这个答案的来源:W3C

我也查看了jQuery移动代码并找到了这一部分:

.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width:20%; }

因此,通过减少此金额,您应该可以在列表中挤出更多项目。 (从它的外观来看,你还需要定义f和g,因为这个只能达到e)

答案 7 :(得分:0)

我会看一个不同的ui模式。这对于小型iphone 4,甚至是iphone 5设备来说都是一个非常棘手的导航栏。仅仅因为你能做到这一点并不意味着你应该这样做。