Более 5 наименований на строку в навигационной панели jQuery Mobile - PullRequest
24 голосов
/ 28 мая 2011

Я безуспешно искал переменную для изменения максимального количества элементов в одной строке в панели навигации.

Я только начинаю с jQuery Mobile, пытаюсь создать панель навигации, содержащую около 7 однобуквенных элементов.Navbar автоматически переносится при наличии более 5 элементов, что нежелательно для моего проекта.

Может кто-нибудь указать мне на фрагмент кода или CSS, который регулирует это поведение?

Ответы [ 8 ]

18 голосов
/ 28 мая 2011

Вы правы. 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

14 голосов
/ 06 января 2014

Используя 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)

5 голосов
/ 15 июня 2011

От Фила Паффорда

"и добавь: ...." { код 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; }
4 голосов
/ 09 марта 2013

Вы можете попробовать другой способ добавить в навигационную панель столько элементов, сколько вам нужно. Позвольте мне объяснить.

HTML-код navbar выглядит как пара.

<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 для удаления класса ui-grid-a из <ul>, который ограничивает количество элементов на панели навигации.

$(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>

Вот так :) 1022 *

Я использовал его для меня, и он отлично работает.

2 голосов
/ 27 июля 2014

В операторе не было явного указания наличия нечетного числа элементов выше 5. Для четных чисел мы можем использовать адаптивные сетки jQuery вместе с navbar.

например

<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>
2 голосов
/ 07 мая 2013

После того, как:

/ * Сетка 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 {ширина: 19,925%; } .ui-grid-d>: nth-child (n) {ширина: 20%; } .ui-grid-d .ui-block-a {clear: left; }

в CSS, ДОБАВИТЬ

/ * сетка 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 {ширина: 16,66%; } .ui-grid-e>: nth-child (n) {ширина: 16,6%; } .ui-grid-e .ui-block-a {clear: left; }

/ * сетка 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 {ширина: 14,28%; } .ui-grid-f>: nth-child (n) {ширина: 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-коде используйте data-grid = "e" для сетки 6, data-grid = "f" для сетки 7

0 голосов
/ 07 января 2014

Я бы посмотрел на другой шаблон пользовательского интерфейса.Это будет очень хитрая навигация на маленьком iphone 4 или даже на iphone 5.То, что вы можете сделать это, не означает, что вы должны это делать.

0 голосов
/ 28 мая 2011

Свойство пробела указывает, как обрабатывается пробел внутри элемента.

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)

...