Область содержимого JQuery-Mobile 100% высоты между головой и ногой - PullRequest
18 голосов
/ 16 сентября 2011

Множество тем на эту тему ... но я не понимаю, как это сделать.

У меня есть JQM Header и Footer.Я хочу, чтобы область содержимого занимала 100% высоты между головой и ногой.

Это мой код, как это возможно?

<body>
        <div data-role="page" id="entryPage" data-theme="d">

        <div data-role="header" id="header" data-position="fixed" data-theme="d">
            <h1>Page Title</h1>
        </div><!-- /header -->

        <div data-role="content" id="content" data-theme="d">

             <div id="columnwrapper">
                <div id="leftcolumn">
                    <div class="innertube">
                        Point 1
                    </div>
                    <div class="innertube">
                        Point 1
                    </div>
                </div>
            </div>

            <div id="rightcolumn">
                <div class="innertube">
                    <div id="switch1">
                        test
                    </div>
                </div>
                <div class="innertube">
                    test2
                </div>

            </div>

            <div id="contentcolumn">
                <div class="innertube">Content</div>
                <div class="innertube">Content</div>
            </div>

        </div><!-- /content -->
        <div data-role="footer"  id="footer" data-position="fixed" data-theme="d">

            <div id="switch2">
                <a href="#foo" data-role="button" data-icon="arrow-u">Expand main menu</a>
            </div>

        </div><!-- /footer -->
    </div><!-- /page -->
</body>

CSS:

#columnwrapper{
    float: left;
    width: 100%;
    margin-left: -75%; /*Set left margin to -(contentcolumnWidth)*/
    background-color: #C8FC98;

}

#leftcolumn{
    margin: 0 40px 0 75%; /*Set margin to 0 (rightcolumnWidth) 0 (contentcolumnWidth)*/
    background: #C8FC98;
}

#rightcolumn{
    float: left;
    width: 40px; /*Width of right column*/
    margin-left: -40px; /*Set left margin to -(RightColumnWidth)*/
    background: yellowgreen;
}

#contentcolumn{
    float: left;
    width: 75%; /*Width of content column*/
    background-color: blue;
}

.innertube{
    margin: 0px; /*Margins for inner DIV inside each column (to provide padding)*/
    margin-top: 0;

}

На самом деле внутренняя область заполняет только высоту в зависимости от содержимого ...означает 2 деления 2 строки, но не 100% ..

Спасибо

Ответы [ 3 ]

10 голосов
/ 16 сентября 2011

CSS position: fixed не работает правильно в мобильных браузерах. Мой опыт работы с браузерами для Android и iOS, и ни один из них не подразумевает position: fixed должным образом (за исключением браузера iOS 5, но он все еще находится в бета-версии).

Вместо того, чтобы прикреплять элемент к экрану и не перемещать его, когда пользователь выполняет прокрутку в мобильных браузерах, он обычно обрабатывается как position: absolute и перемещается при прокрутке страницы.

Также использование свойства CSS overflow не позволяет прокручивать на большинстве мобильных устройств (iOS поддерживает его, но пользователь должен знать, что нужно использовать два пальца при прокрутке в scrollable-div).

Однако вы можете использовать CSS, но помните, что вам нужно будет использовать position: absolute или вы можете использовать JavaScript для установки высоты элементов.

Вот решение jQuery Mobile, использующее JavaScript для установки высоты элементов псевдостраницы:

$(document).delegate('#page_name', 'pageshow', function () {
    var the_height = ($(window).height() - $(this).find('[data-role="header"]').height() - $(this).find('[data-role="footer"]').height());
    $(this).height($(window).height()).find('[data-role="content"]').height(the_height);
});

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

3 голосов
/ 05 февраля 2012

Спасибо, Джаспер! Это мне очень помогло.

Мне пришлось много возиться, чтобы заставить его работать с несколькими колонтитулами и учитывать строку URL в ios. Я думал, что поделюсь своим решением для всех, кто имеет эту проблему Пока это работает для меня в симуляторе ios, но я бы хотел услышать, как это работает на других устройствах.

/* detect device */
var ua = navigator.userAgent,
    iphone = ~ua.indexOf('iPhone') || ~ua.indexOf('iPod'),
    ipad = ~ua.indexOf('iPad'),
    ios = iphone || ipad,
    android = ~ua.indexOf('Android');


$(document).delegate('#the_page', 'pageshow', function () {
    var $page = $(this),
        $target = $(this).find('.fullHeight'),
        t_padding = parseInt($target.css('padding-top'))
                    + parseInt($target.css('padding-bottom')),
        w_height = (ios)? screen.height-65: $(window).height();     // "-65" is to compensate for url bar. Any better ideas?
        headFootHeight = 0;

    // Get total height for all headers and footers on page
    $page.find('[data-role="footer"], [data-role="header"]').each(function() {
        var myTotalHeight = $(this).height()
                            + parseInt( $(this).css('padding-top') )
                            + parseInt( $(this).css('padding-bottom') );
        headFootHeight += myTotalHeight;
    });

    var the_height = (w_height - headFootHeight);           

    $page
     .height(w_height)
     .find('.fullHeight')
     .height(the_height - t_padding);
}); 

Этот скрипт устанавливает высоту 100% для '.fullHeight' вместо [data-role = content], чтобы обеспечить большую гибкость, но вы можете просто добавить класс fullHeight к своему элементу [data-role = content].

Одна проблема, с которой я до сих пор сталкиваюсь, - это компенсация строки URL в ios и поиск высоты окна, которая работает на разных устройствах. Есть идеи на этот счет?

1 голос
/ 16 сентября 2011

CSS:

footer {
            display: block;
            position: fixed;
            left: 0;
            bottom: 0;
            right: 0;
            height: 50px;
            background-color: #333;
            overflow: hidden;
            z-index:1000;
            -webkit-transform: translateZ(0);
            opacity:.9;
        }

    header{
        display:block;
        position: fixed;
        left:0;
        right:0;
        top:0;
        height:50px;
        overflow: hidden;
    }

    section{
        display:block;
        position:fixed;
        left:0;
        top:50px;
        bottom:50px;
        right:0;
        overflow-y: auto;
    }

    nav{
        display:block;
        height:100%;
        -webkit-backface-visibility: hidden;
    }

    .body{
        overflow-y: hidden;
    }
    .bar {
border: 1px solid       #2A2A2A;
background:             #111111;
color:                  #ffffff;
font-weight: bold;
text-shadow: 0 -1px 1px #000000;
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#111)); /* Saf4+, Chrome */
background-image: -webkit-linear-gradient(top, #3c3c3c, #111); /* Chrome 10+, Saf5.1+ */
background-image:    -moz-linear-gradient(top, #3c3c3c, #111); /* FF3.6 */
background-image:     -ms-linear-gradient(top, #3c3c3c, #111); /* IE10 */
background-image:      -o-linear-gradient(top, #3c3c3c, #111); /* Opera 11.10+ */
background-image:         linear-gradient(top, #3c3c3c, #111);
  }

единственный необходимый html:

  <header class="bar" id="AllHead"></header>

  <div data-role="content" class="content" id="home"><section><nav></nav></section></div><!-- /content -->

  <footer class="bar" id="allFoot"></footer>

 </div><!-- /page -->

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

...