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

В конце поста я даю макет вопроса.

У меня есть макет с двумя столбцами, вроде боковой панели навигации, которая не всегда открыта (col0), и основной области (col1), которая всегда открыта. В основной области отображается содержимое. Наконец, у меня есть нижний колонтитул, который находится прямо под самым верхним уровнем страницы.

Внутри основной области или области содержимого находится компонент перехода, который представляет следующий маршрутизируемый компонент с использованием переходов CSS.

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

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

Вот функция react Component render(), в которой для вашего удобства удалено множество вещей:

  <div style={prepareStyles(styles.heightHundred)}>
    <ChromeHelmet />
      <AppBar ... yada .../>
      <div style={prepareStyles(styles.root)}>
        <div style={prepareStyles(styles.content)}>
          <EasyTransition
            path={this.props.location.pathname}
            initialStyle={{opacity: 0, transform: 'translateY(-100%)'}}
            transition="opacity 0.2s ease-in, transform 0.3s ease-in-out 0.3s"
            finalStyle={{opacity: 1, transform: 'translateY(0%)'}}
            leaveStyle={{opacity: 0.9, transform: 'translateY(500%'}}
          >
          { this.props.children }
          </EasyTransition>
        </div>
      </div>
      <AppNavDrawer />
    <Footer
      style={prepareStyles(styles.footer)} />
  </div>

Редактировать

Когда я пытаюсь использовать flex, я могу сказать, что он близок, но это не имеет никакого эффекта, потому что боковая панель отображается с position: fixed; и некоторыми причудливыми элементами CSS внутри компонента React, к которым я боюсь прикоснуться. Но когда я отменяю это position: fixed, нижний колонтитул оказывается там, где он должен быть, но боковая панель явно шаткая ...


person tacos_tacos_tacos    schedule 11.07.2016    source источник
comment
вам следует использовать макет flex-box. display: flex; flex-flow: column: no-wrap; на самом внешнем div решит вашу проблему   -  person John Ruddell    schedule 11.07.2016
comment
дох! Я к этому еще не привык ... То есть еще не подумал, конечно, flexboxc   -  person tacos_tacos_tacos    schedule 11.07.2016
comment
@JohnRuddell не сработал. То есть я сделал это неправильно. Прочтите мою правку   -  person tacos_tacos_tacos    schedule 11.07.2016
comment
нет проблем! Вот для чего нужно переполнение стека: D flexbox потрясающий. вы должны прочитать, что вы можете с ним сделать, больше нет необходимости использовать поплавки и прочее. у него также есть преимущества в том, где вы хотите разместить контент. так, например, в этом случае .. height: 100%; display: flex; flex-flow: column no-wrap; justify-content: space-between; это то, что вы хотите   -  person John Ruddell    schedule 11.07.2016
comment
это только потому, что вы не указали, каким образом вы хотите оправдать содержание ... см. мой другой комментарий   -  person John Ruddell    schedule 11.07.2016
comment
если вы не можете понять это, я могу сделать голосовой чат для демонстрации экрана, чтобы он заработал :)   -  person John Ruddell    schedule 11.07.2016
comment
@JohnRuddell проверяет это сейчас   -  person tacos_tacos_tacos    schedule 11.07.2016
comment
@JohnRuddell, вы были близки - или я был близок к тому, чтобы описать вам правильную ситуацию - это был гибкий конец, который мне нужен не между, а то, что работает!   -  person tacos_tacos_tacos    schedule 11.07.2016
comment
Ницца! space-between работает, когда есть два элемента, первый помещает вверху, а второй внизу. но я неправильно понял, что у вас есть три элемента, так что да. Я могу написать это как ответ, если хочешь.   -  person John Ruddell    schedule 11.07.2016


Ответы (2)


Я бы рекомендовал использовать макет flex-box. он поддерживается большинством браузеров (IE 10 и выше, Edge, Firefox, Chrome, Safari, Opera, iOS Safari, Opera Mini, Android Browser, Chrome для Android).

просто добавьте эти стили в родительский div

display: flex; 
flex-flow: column no-wrap; 
justify-content: space-between;

в нижнем колонтитуле добавить

align-self: flex-end;

вот БОЛЬШОЕ объяснение гибкости и того, как она работает. много действительно полезной информации здесь

person John Ruddell    schedule 11.07.2016
comment
К вашему сведению, я сделал что-то немного другое без использования align из Transmission.vehikl.com/sticky -footer-with-flexbox, потому что я думаю, что мой случай был даже проще - person tacos_tacos_tacos; 11.07.2016
comment
@tacos_tacos_tacos Хорошо, я понимаю, о чем вы говорите. Честно говоря, мне не нравится это решение только потому, что вы полагаетесь на определенную высоту нижнего колонтитула. поэтому на мобильном разрешении нужно менять стили по высоте и все такое. Flexbox не требует определенной высоты для размещения элементов, поэтому его так приятно и легко использовать. Если вас устраивает это решение, тогда отлично :) Я могу попытаться помочь вам получить его, не указывая высоту, если хотите :) - person John Ruddell; 11.07.2016
comment
Я только что это видел. Я попробую ваше решение сейчас на новой странице - person tacos_tacos_tacos; 21.07.2016

Вам нужен CSS Sticky Footer.

HTML:

<div id="wrap">
  <div id="main">
  </div>
</div>

<div id="footer">
</div>

CSS:

* {margin:0;padding:0;} 
html, body {height: 100%;}
#wrap {min-height: 100%;}

#main {
  overflow:auto;
  padding-bottom: 180px; /* must be same height as the footer */
}

#footer {
  position: relative;
  margin-top: -180px; /* negative value of footer height */
  height: 180px;
  clear:both;
} 

/*Opera Fix thanks to Maleika (Kohoutec)*/
body:before {
  content:"";
  height:100%;
  float:left;
  width:0;
  margin-top:-32767px;/* thank you Erik J - negate effect of float*/
}
person Jez    schedule 11.07.2016
comment
Позвольте мне попробовать и вернуться к вам ... Я также пробую flexbox - person tacos_tacos_tacos; 11.07.2016
comment
@tacos_tacos_tacos Хорошо - person Jez; 11.07.2016
comment
Я определенно использовал что-то подобное в прошлом, чтобы два div имели одинаковую высоту, но это не идеально, я знаю по опыту, lol, с прикреплением может произойти пара забавных вещей и т. Д. - person tacos_tacos_tacos; 11.07.2016
comment
похоже, что, вероятно, так и будет, но я хочу сделать Flexbox, но если он сработает, я все равно дам вам pt, чтобы оба пути были подтверждены - person tacos_tacos_tacos; 11.07.2016
comment
это может не работать в зависимости от фиксированной боковой панели. все же следует проверить это перед выдачей ответа (для других прохожих) - person John Ruddell; 11.07.2016
comment
@JohnRuddell, если вы можете ответить на вопрос, я дам вам ответ и голосование, иначе у меня есть этот ответ, чтобы дать обоим, и этот может быть хорош для старых браузеров, не все поддерживают flexbox - person tacos_tacos_tacos; 11.07.2016