Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Вёрстка веб-сайтов > Простой макет в 2 колонки на дивах


Автор: nns2009 15.10.2011, 19:16
Недавно начал верстать сайт, решил верстать на блоках, так как в интернете их все расхваливают, но сейчас я стал сомневаться в этих похвалах...
И тому есть причины:
1) Свойство vertical-align не работает ни в одном браузере (и вообще не понятно как делать выравнивание по вертикали)
2) Если есть 2 колонки, совершенно непонятно, как сделать их высоту одинаковой
3) Отступ padding не включается в указанную ширину
4) Непонятно, как при фиксированной ширине левой колонки, сделать так, чтобы правая колонка заполняла всё оставшееся пространство справа и при этом не сползала налево, когда заканчивается левая колонка
5) Неинтуитивность в использовании многих свойств.

Сейчас мне нужно написать стандартный макет(заголовок, левая колонка, правая колонка(содержимое), подвал) в 2 колонки фиксированной ширины с некоторыми особенностями:
1) Содержимое "Заголовка" верикально выровнено по середине и выглядит примерно так:
Код

НазваниеСайта.Ру                                                  -Уже другим стилем-   Кнопка 1 | Кнопка 2 | Кнопка 3 | Кнопка 4

2) Левая колонка не подстраивается под ширину правой (но как сделать подстраиваемость тоже хотелось бы узнать) и имеет фиксированную ширину
3) Правая колонка занимает остаток места
4) Есть отступы padding
5) Желательно, чтобы для изменения какой-либо характеристики(ширина макета, ширина левой колонки, ширина отступов и т.п.) достаточно было бы изменить как можно меньше чисел(в идеале - одно)

Скажите, являются ли мои причины объективными, или я что-то не так делаю?
И помогите пожалуйста сверстать данный макет  smile  (в интернете не нашёл ничего, удовлетворяющего условиям).

Автор: $дмитрий 15.10.2011, 20:41
Цитата

1) Свойство vertical-align не работает ни в одном браузере (и вообще не понятно как делать выравнивание по вертикали)
2) Если есть 2 колонки, совершенно непонятно, как сделать их высоту одинаковой
3) Отступ padding не включается в указанную ширину
4) Непонятно, как при фиксированной ширине левой колонки, сделать так, чтобы правая колонка заполняла всё оставшееся пространство справа и при этом не сползала налево, когда заканчивается левая колонка
5) Неинтуитивность в использовании многих свойств.

1. А так?
Код

display:table-cell;
vertical-align:middle;

2.
Код

height:100%;
min-height:100%;

3. В разных браузерах по разному
5. Есть такое дело, не хватает к примеру vertical-align:center;

Цитата

так как в интернете их все расхваливают

Если время не терпит для проблемных мест сам использую таблицы

Автор: SelenIT 16.10.2011, 00:47
5-я причина объективная, логику создателей CSS порой понять очень трудно. Блочная модель, считающаяся "изнутри наружу" (ширина задает ширину контента, а паддинги и бордеры плюсуются к ней сверх) — лишь одно из таких мест (хотя, пожалуй, самое заметное). Есть еще одна объективная причина — в современном CSS нет механизма специально для компоновки блоков, в основном он "заточен" под оформление текста, и для типовых задач верстки приходится использовать инструменты не по назначению (напр. делать колонки "как бы врезками"). Ну и вечная проблема старых браузеров, само собой (впрочем, с таблицами в них тоже хватает своих "приколов").

Выравнивание высоты колонок — проблема известная, теме "equal height columns" (кое-где именуемой ни много ни мало "Граалем вёрстки") посвящены гигабайты статей. В простых случаях однородного фона часто довольствуются имитацией равной высоты с помощью фоновой картинки для контейнера (метод "ложных колонок" — "faux columns") или с помощью бордеров, http://jsfiddle.net/6KE6M/. Для более сложных случаев — http://chikuyonok.ru/2009/06/float-columns/.

Vertical-align работает, но по-разному в разных ситуациях. В ячейках таблиц оно выравнивает содержимое относительно ячейки (как атрибут valign), а для строковых элементов — http://usabili.ru/news/2010/02/20/vertical-align.html (по умолчанию картинки, элементы форм и инлайн-блоки выравниваются по базовой линии текста, а с помощью vertical-align можно выровнять их по центру, верху или низу строки, а также поднять/опустить относительно базовой линии на заданную величину).

Цитата(nns2009 @  15.10.2011,  19:16 Найти цитируемый пост)
1) Содержимое "Заголовка" верикально выровнено по середине и выглядит примерно так:

Как вариант: text-align: right (для меню) + float: left либо position: absolute с подходящими координатами (для логотипа) + достаточно большой line-height (для вертикального центрирования).

Цитата(nns2009 @  15.10.2011,  19:16 Найти цитируемый пост)
2) Левая колонка не подстраивается под ширину правой (но как сделать подстраиваемость тоже хотелось бы узнать) и имеет фиксированную ширину
3) Правая колонка занимает остаток места

Как вариант — см. http://jsfiddle.net/6KE6M/2/. Для "подстраиваемости" нужно задавать ширину в процентах, правда, тогда не получится имитировать колонку бордером, но это решаемая проблема.

Цитата(nns2009 @  15.10.2011,  19:16 Найти цитируемый пост)
Есть отступы padding

Универсальный вариант — вложить в каждую колонку еще один оберточный div и задать отступы ему. Современный, но, увы, еще не достаточно кроссбраузерный подход — http://cssing.org.ua/2008/11/14/css3-box-model-progress/#more-206. Еще можно (и нужно;) использовать тот факт, что без явного указания ширины блок вписывается в предка (сумма ширины контента, паддингов, бордеров и маргинов равна внутренней ширине родительского элемента).

Цитата(nns2009 @  15.10.2011,  19:16 Найти цитируемый пост)
Желательно, чтобы для изменения какой-либо характеристики... достаточно было бы изменить как можно меньше чисел

А вот здесь почти всегда придется искать компромиссы. Часто "идеологически чистые" и предельно гибкие в теории решения оказываются недостаточно кроссбраузерными и т.п. Но всегда есть возможность приблизиться к совершенству еще хоть на пиксель! smile

Автор: nns2009 17.10.2011, 22:34
Цитата($дмитрий @  15.10.2011,  20:41 Найти цитируемый пост)
1. А так?

В простых случаях - помогло! Но не во всех... Например, в случае, когда поначалу идёт текст, а потом див. (Моя текущая проблема)

Цитата(SelenIT @  16.10.2011,  00:47 Найти цитируемый пост)
или с помощью бордеров, например, так

border-left: 200px solid #cfc;
Оригинально!

Цитата(SelenIT @  16.10.2011,  00:47 Найти цитируемый пост)
Для более сложных случаев — см. здесь.

Вот это я запомню (если пойму)

Цитата(SelenIT @  16.10.2011,  00:47 Найти цитируемый пост)
Для "подстраиваемости" нужно задавать ширину в процентах, правда, тогда не получится имитировать колонку бордером, но это решаемая проблема.

Я опечатался. Имелось в виду, что высоты колонок не объзательно равны (в моём случае не надо).

Цитата(SelenIT @  16.10.2011,  00:47 Найти цитируемый пост)
Современный, но, увы, еще не достаточно кроссбраузерный подход — использовать CSS3

Попробовал - у меня заработало во всех браузерах. Это хорошо smile 

Сейчас у меня такая основная проблема:
Код

<div>
     <span> Название сайта.ру
     </span>
     <div>
          <div style="display: inline">Кнопка 1</div><div ...>Кнопка 2</div>...
     </div>
</div>


Вертикально выровнять всё содержимое внешнего дива. Название сайта - поместить слева, а все кнопочки поместить справа.

Автор: SelenIT 17.10.2011, 23:49
Маленький http://jsfiddle.net/FYx6D/ на тему
Цитата(SelenIT @  16.10.2011,  00:47 Найти цитируемый пост)
 text-align: right (для меню) + float: left ... (для логотипа) + достаточно большой line-height

smile

Автор: nns2009 18.10.2011, 22:42
Цитата(SelenIT @  17.10.2011,  23:49 Найти цитируемый пост)
Маленький пример на тему

Не просто спасибо, а супер спаибо smile 

А как сделать всё так-же, но фон (и только фон) каждой кнопки полупрозрачен.
Пробовал: opacity: 0.5; Но это затрагивает не только фон, но и текст.

Автор: SelenIT 18.10.2011, 23:28
Современный и, на мой взгляд, самый правильный подход — http://www.xiper.net/collect/html-and-css-tricks/css-tricks/rgba.html. Альтернативы — полупрозрачная однотонная png-шка для фона (минус: лишний запрос к серверу) и игры с наложением слоев (сложно и негибко).

Автор: nns2009 20.10.2011, 20:56
Цитата(SelenIT @  17.10.2011,  23:49 Найти цитируемый пост)
Маленький пример на тему

По мотивам вашего примера, переделал свой. Получил: http://jsfiddle.net/nns2009/kTeGZ/2/
Через данный сервер страница отображается полностью правильно, но, сохранённая на мой компьютер, она же ужасно отображается через Оперу (и только) - а это ведь мой любимый(как у пользователя интернета) браузер.....
Вот код:
Код

<html>
<head><style>
#divHeader {
    border-radius: 15px;
    padding-left: 12px;
    padding-right: 12px;
    background-color: #A7CD45;
    text-align: right;
}

#spanHeaderTitle {
    float: left;
    font-size: x-large;
    line-height: 55px;
}
#spanHeaderTitle a {
    color: Black;
    font-family: "Arial";
}
#spanHeaderTitle a span {
    color: Red;
}

#spanHeaderButtons {
    display: inline-block;
    line-height: 55px;
}
#spanHeaderButtons a {
    display: inline-block;
    font-size: larger;
    border: solid 2px black;
    border-radius: 9px;
    padding: 7px;
    line-height: 1;
}
#spanHeaderButtons a:hover {
    background: rgba(255, 255, 255, 0.5);
}

#divFooter {
    background: #ff0000;
    border-radius: 15px;
    line-height: 30px;
    text-align: center;
    vertical-align: middle;
}
</style></head>
<body>
<div id="divHeader">
    <span id="spanHeaderTitle">
        <a href="#"><span>М</span>ой<span>С</span>айт</a>
        <span id="spanHeaderLabel">- лучший сайт</span>
    </span>
    
    <span id="spanHeaderButtons">
        <a href="#">Кнопка 1</a>
        <a href="#">Кнопка 2</a>
        <a href="#">Кнопка 3</a>
    </span>
</div>
<div id="divFooter">
    My footer
</div>
</body></html>


Что надо переделать?

Автор: SelenIT 20.10.2011, 22:12
Как минимум, доктайп <!DOCTYPE html> добавить, без него страница валится в Quirks mode. Подробнее про доктайпы и режимы браузеров http://htmlbook.ru/metki/rezhimy и http://hsivonen.iki.fi/doctype/.

Автор: nns2009 20.10.2011, 22:32
Цитата(SelenIT @  20.10.2011,  22:12 Найти цитируемый пост)
Как минимум, доктайп <!DOCTYPE html> добавить

Помогло! Хотя, на основной странице моего шаблона стоял доктайп(я посылал сокращённую), он почему-то не работал, как и половина доктайпов с вашей ссылки.
В вашем шаблоне было указано: display: inline-block - чем это отличается от просто инлайн?
Продолжаю искать ошибки.....

Автор: SelenIT 20.10.2011, 22:40
Цитата(nns2009 @  20.10.2011,  22:32 Найти цитируемый пост)
он почему-то не работал, как и половина доктайпов с вашей ссылки

Там в табличке как раз помечено, грубо говоря, какие доктайпы в каких браузерах "работают" (включают стандартный режим), а какие — нет. Этот самый надежный, т.к. самый простой и короткий.

Цитата(nns2009 @  20.10.2011,  22:32 Найти цитируемый пост)
 display: inline-block - чем это отличается от просто инлайн?

"Снаружи" он инлайновый (вписывается в строку, как обычное слово или картинка), а "внутри" — блочный (может иметь полноценные паддинги и фон, не разрывается при переносе строки и т.п.). Правда, не работает в FF2 (уже года 3 как неактуально) и есть приколы в IE6-7 (только для изначально строчных элементов, но для изначально блочных тот же эффект дает display:inline + http://www.xiper.net/collect/html-and-css-tricks/glyuki-brauzerov/ie6/haslayout.html).

Автор: nns2009 26.10.2011, 18:36
Проблемы обнаружились  smile 
Теперь в IE. Проблема, полностью совпадающая с моей, видна тут: http://jsfiddle.net/nns2009/QYQqv/2/
Эта проблема видна при просмотре данной странице через IE - левое меню сезжает вправо.
Почему?

Автор: nns2009 26.10.2011, 20:57
Ещё задача: нужно сделать приблизительно так - http://jsfiddle.net/nns2009/ewz2p/, но чтобы ширина заголовка подгонялась под ширину содержащегося текста и сам заголовок(вместе с фоном) наехал наполовину на колонки(съехал чуть чуть вниз).

Автор: SelenIT 27.10.2011, 09:58
Цитата(nns2009 @  26.10.2011,  18:36 Найти цитируемый пост)
левое меню сезжает вправо.
Почему? 

Похоже, из-за какого-то глюка левая колонка умудряется "зацепиться" за логотип, clear:left (или both) для нее решает проблему.

Цитата(nns2009 @  26.10.2011,  20:57 Найти цитируемый пост)
чтобы ширина заголовка подгонялась под ширину содержащегося текста и сам заголовок(вместе с фоном) ... съехал чуть чуть вниз

Как http://jsfiddle.net/ewz2p/7/. Вместо display:table можно поставить inline-block, только центрировать придется иначе (через text-align предка). Под IE7 придется чуть "допилить", но это можно и "на закуску" оставить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)