3-х колоночная резиновая верстка (контент должен грузится первым, потом сайдбары)

211
20 апреля 2017, 14:41

Здравствуйте. Мне нужна 3-х колоночная резиновая верстка: Левый и правый сайдбар фиксированной ширины, контент - резиновый. Внизу футер.

Обязательно, нужно чтобы сначала контент загружался, потом сайдбары, т.е. если брать нумерацию Left sidebar - 1, Content - 2, Right sidebar - 3, то желаемый порядок блоков 2-1-3 (ниже приведен HTML) или 2-3-1, в крайнем случае 1-2-3 (обычно используется 1-3-2, мне такой вариант не подходит, так как нужно чтобы правый сайдбар на мобильной версии шёл после контента).

<main> 
  <header>Header</header> 
  <section class="middle clr"> 
    <section id="block-2" class="content">Content</section> 
    <aside id="block-1" class="left">Left sidebar</aside> 
    <aside  id="block-3" class="right">Right sidebar</aside> 
  </section> 
  <footer>Footer</footer> 
</main>

Желательна поддержка старых браузеров.

Вариант с абсолютным позиционированием рассматривал, но там проблема с футером - нужно постоянно находить высоту наибольшего блока и устанавливать высоту контейнера... но если js отключен (понятно что таких очень редко), то всё на куче...., иногда проблемы с вычислением высоты блоков, особенно если на странице js анимированные/подгружаемые элементы...

Answer 1

Так?

* { 
  box-sizing: border-box; 
} 
 
body { 
  margin: 0; 
  padding: 0; 
} 
 
.clr:after { 
  content: ''; 
  display: table; 
  clear: both; 
} 
 
main { 
  max-width: 800px; 
  width: 100%; 
  margin: 0 auto; 
} 
 
header, 
footer { 
  background: #eee; 
} 
 
aside { 
  position: relative; 
  /* Чтоб z-index сработал */ 
  width: 200px; 
  background: #ccc; 
  z-index: 2; 
  /* Чтоб было выделение текста, так как aside будет прятаться под .content, размещенный перед ним */ 
} 
 
.middle { 
  white-space: nowrap; 
  /* Не дает колонкам уходить друг под друга. Однако, работая с меди запросами, нужно будет убрать данный стиль для более низких разрешений, где нужно будет сайдбары переместить вниз. */ 
} 
 
.middle>aside, 
.middle>section { 
  white-space: normal; 
  /* Нормализует перенос строк текста. Без него, весь текст пойдет одной сплошной строкой */ 
} 
 
.content { 
  padding: 0 230px; 
  display: inline-block; 
  /* Задается, чтоб блок расположился между 2 float-ами */ 
  background: #00CC334D; 
} 
 
.left { 
  float: left; 
  margin-right: -200px; 
} 
 
.right { 
  float: right; 
  margin-left: -200px; 
} 
 
@media screen and (max-width:600px) { 
  .middle { 
    white-space: normal; 
  } 
  .content { 
    padding: 0; 
    margin: 0; 
  } 
  aside { 
    width: 50%; 
    margin: 0 !important; 
  } 
} 
 
@media screen and (max-width:420px) { 
  aside { 
    width: 100%; 
    float: none !important; 
  } 
}
<main> 
  <header>Header</header> 
  <section class="middle clr"> 
    <section class="content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</section> 
    <aside class="left">Left sidebar</aside> 
    <aside class="right">Right sidebar</aside> 
  </section> 
  <footer>Footer</footer> 
</main>

По цифрам не очень то и понятно, но, вроде правильно. Верстка через float будет работать во всех браузерах. Можно и flexbox использовать, но, это на любителя.

READ ALSO
Красивая загрузка сайта

Красивая загрузка сайта

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

167
Как создать прозрачный градиент маски с использованием фильтра SVG

Как создать прозрачный градиент маски с использованием фильтра SVG

В настоящее время я использую градиент SVG, чтобы применить эффект fade-out для патчейЭто позволяет начать путь с непрозрачностью 100% в точке x0 и постепенно...

183
jQuery добавить класс только видимым блокам по их индексу в выборке

jQuery добавить класс только видимым блокам по их индексу в выборке

Проблема заключается в следующем, есть HTML, к примеру:

188