css - относительный заголовок и липкий нижний колонтитул, динамический контент, неизвестная высота, все в контейнере с адаптивной шириной?

Я работаю над относительным заголовком и липким нижним колонтитулом с динамически загружаемым контентом (иногда пустой div (неизвестная высота), следовательно, height: 100vh;), все в пределах адаптивного контейнера, который подстраивается под ширину устройства (width: 100vw;) вверх до максимальной ширины 350 пикселей.

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

Пробовали всевозможные комбинации (относительные и абсолютные) ... вот самая близкая, например: http://jsfiddle.net/9U2CU/5/ .. но эта комбинация предполагает процентную высоту динамического содержимого, а отображаемое содержимое неправильно отформатировано в области и не выталкивает динамическое содержимое из-за абсолютного позиционирование !?

Какие корректировки необходимо внести в CSS, чтобы учесть спецификации?

HTML

<div id="view">

    <div id="appear" style="display:none;">Content that appears</div>

    <div id="header">Some Buttons</div>
    <div id="dynamic-content"></div>
    <div id="footer">Some Buttons</div>

</div>

CSS

#view {
  position: relative;
  height: 100%;
  width: 100vw;
  max-width: 350px;
  overflow-y: auto;
  height: 100vh;
  display: block;
  margin: 0 auto;
  background-color: #fff;
}
#header {
  position: relative;
  height: 44px;
  width: 100%;
  background-color: rgba(255, 255, 255, .5);
}
#dynamic-content {
  position: relative;
  height: 100%;
  width: 100%;
  background-color: #999;
}
#footer {
  position: absolute;
  bottom: 0;
  width: 100%;
  height: 36px;
  background-color: rgba(255, 255, 255, .5);
}

jQuery

$(document).on("click", "#header", function () {
    $('#appear').slideToggle();
});

person StackThis    schedule 14.06.2014    source источник
comment
какой был вопрос?   -  person Roko C. Buljan    schedule 14.06.2014
comment
@ RokoC.Buljan какой css будет держать все на месте? заголовок, который перемещается только при переключении #appear, динамическое содержимое, которое прокручивается за заголовком и нижним колонтитулом, все в контейнере, который соответствует ширине устройства до 350 пикселей и занимает всю высоту устройства .. (исправлено Детали)   -  person StackThis    schedule 14.06.2014
comment
Я пару раз читал ваш вопрос и, откровенно говоря, понятия не имею, что вам нужно ... сначала вы указываете в своем заголовке css - относительный заголовок и липкий нижний колонтитул, а затем внезапно Работаю над фиксированным верхним и нижним колонтитулами ... fixed? Также какая страница должна иметь максимальную ширину 350 пикселей? Это виджет боковой панели? (спрашивает просто из любопытства.)   -  person Roko C. Buljan    schedule 14.06.2014
comment
@ RokoC.Buljan Простите за несоответствия .. Вот более подробный пример: jsfiddle.net/9U2CU/5, но эта комбинация предполагает процентную высоту динамического содержимого, а отображаемое содержимое неправильно отформатировано в области видимости и не выталкивает динамическое содержимое из-за абсолютного позиционирования   -  person StackThis    schedule 14.06.2014
comment
@ RokoC.Buljan большое спасибо, что взглянули на это   -  person StackThis    schedule 14.06.2014
comment
@ RokoC.Buljan Все точно .. контент прокручивается за фиксированным нижним колонтитулом и стационарным заголовком, который перемещается только тогда, когда панель скользит вниз сверху (при нажатии кнопки в заголовке)   -  person StackThis    schedule 14.06.2014
comment
@ RokoC.Buljan, и все это содержится в панели, которая занимает всю ширину устройства до 350 пикселей и составляет полную высоту устройства / страницы.   -  person StackThis    schedule 14.06.2014
comment
Посмотрите липкий нижний колонтитул Twitter Bootstrap для некоторого вдохновения, он работает за счет того, что содержимое тела помещается в обертку: getbootstrap.com/2.3.2/examples/sticky-footer-navbar.html   -  person Brian Ogden    schedule 14.06.2014
comment
позиция: исправлено, не то, что вы его используете, нельзя доверять IOS, IPAD будет работать неожиданно, по крайней мере, при увеличении   -  person Brian Ogden    schedule 14.06.2014
comment
@BrianOgden почти на каждом другом мобильном телефоне есть проблемы с ФИКСИРОВАННЫМИ элементами. ;) В любом случае предоставленная вами демонстрация кажется прямо противоположной тому, что хочет OP :) Нижний колонтитул AFAIHU должен быть fixed и header .. не знаю, честно говоря :)   -  person Roko C. Buljan    schedule 14.06.2014
comment
@BrianOgden да, предпочел бы избегать position: fixed по указанным причинам ... и похоже, что здесь есть творческое решение для стационарных элементов, работающих с динамическими элементами ..   -  person StackThis    schedule 14.06.2014


Ответы (1)


демонстрация jsBin

HTML:

<div id="view">
  <div id="appear"> Content that appears </div>
  <div id="header"> Header </div>
  <div id="content"> <h1>Content</h1> <p>Lorem ipsum...</p> </div>
  <div id="footer"> Footer </div>
</div>

CSS3:
с использованием calc(), который в настоящее время имеет очень хорошую поддержку xBrowser: http://caniuse.com/#search=calc

#view {
  overflow: hidden;           /* NO SCROLLBARS */
  margin: 0 auto;
  background-color: #000;
  color:#fff;

  width: 100vw;
  max-width: 350px;
  height: 100vh;
}
#appear{
  display:none;
}
#header,
#footer {
  height: 44px;               /* note this */
  background-color: #555;
}
#content {
  overflow-y: scroll;         /* SCROLLBARS !!!*/
  height: calc(100% - 88px);  /* 44+44 = 88px */
}

и, наконец,
jQuery:

$("#view").on("click", "#header", function () {
  var $appear = $('#appear');
  var io = this.io ^= 1; // Toggler

  $appear.show();               // Temporarily show
  var animH = $appear.height(); // Get height and
  if(io) $appear.hide();        // fast hide.
  $appear.slideToggle();        // Now do it with animation

  $('#content').animate({       // Animate content height
      height: (io?"-=":"+=")+animH
    },{
      step: function() {
        $(this).css("overflow-y", "scroll");
      },
      complete : function(){
        var h = 88 + (io?animH:0); // header+footer = 88px
        $(this).css({height: "calc(100% - "+ h +"px)"});
      }
   });
});

Чтобы объяснить красоту выше:
трюк состоит в том, чтобы установить фиксированную высоту для верхнего и нижнего колонтитула, чем, используя calc(100% - 88px) для прокручиваемого содержимого, вы получите необходимое пространство.

В jQuery animate вы просто быстро получаете высоту содержимого Appearing Top и применяете ее к магии calc() в jQuery.

person Roko C. Buljan    schedule 14.06.2014
comment
действительно благодарен, действительно невероятен - person StackThis; 14.06.2014
comment
@StackThis спасибо! :) пожалуйста! Единственная возможная проблема с приведенным выше кодом заключается в том, что в настоящее время (как и сейчас) верхний и нижний колонтитулы нуждаются в фиксированной высоте, но для мобильного дизайна я надеюсь, что это не имеет большого значения, потому что обычно верхний и нижний колонтитулы не меняются по высоте (большинство времени: D). - person Roko C. Buljan; 14.06.2014
comment
Это потрясающе! Верхний и нижний колонтитулы имеют заданную высоту .. Очень вдохновляющий код !! - person StackThis; 14.06.2014
comment
@StackThis Я тестировал это на двух устройствах Android (4,3 и 2.2), работает только в мобильных браузерах Chrome и Firefox ... У стандартных браузеров есть некоторые проблемы, которые, вероятно, можно исправить, если вы используете meta для устройства и приложите некоторые дополнительные усилия. Я имею в виду, что проблема в том, что вся страница прокручивается. Ничего такого плохого. Firefox и Chrome в порядке - person Roko C. Buljan; 14.06.2014
comment
@StackThis Исправлена ​​небольшая ошибка в мобильном Firefox. Отредактировал мой код jQuery. - person Roko C. Buljan; 14.06.2014
comment
Привет, Роко, еще раз спасибо за это ... Он творит чудеса в firefox и chrome, и это действительно здорово ... Один вопрос, однако, в Safari (iOS тоже) контент не прокручивается, а нижний колонтитул, кажется, прилипает к нижней части содержание, делая его недоступным .. Есть предложения, как это исправить? - person StackThis; 12.07.2014
comment
Разместил здесь специальный вопрос: stackoverflow.com/questions/24712743/ еще раз спасибо - person StackThis; 13.07.2014
comment
Открыта награда stackoverflow.com/questions/24712743/ .. был бы очень признателен за любые идеи, спасибо - person StackThis; 22.07.2014