Удивительно продвинутый макет в CSS - PullRequest
1 голос
/ 28 июня 2010

У меня следующая структура HTML:

<div class="container">
   <div class="sidebar"></div>
   <div class="content"></div>
   <div class="subscript"></div>
</div>

Мне нужен следующий макет:

┌─────────┬───────────────────────┐
│         │                       │
│ sidebar │       content         │
│         │                       │
│         │                       │ 
├─────────┤                       │
│         │                       │
│    w    ├─────────┬─────────────┤
│         │subscript│      w      │
└─────────┴─────────┴─────────────┘

w - это пробел

Контейнер должен иметь фиксированную ширину игибкая высота (должна расширяться, чтобы соответствовать ее содержимому)

Боковая панель должна иметь фиксированную ширину и высоту и быть выровненной по верху.

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

Подстрочный индекс должен располагаться прямо под содержимым и выравниваться по нему по левому краю.Кроме того, он должен быть развернут по горизонтали, чтобы соответствовать его тексту (подписка)

Как это можно сделать, используя чистый CSS?

Ответы [ 4 ]

2 голосов
/ 28 июня 2010

Advanced?Едва.Проще говоря:

/* Fix page width. As per requirements, but questionable IMO. Why not liquid? */
.container { width: 750px; margin: 0 auto; }

/* Sidebar on left, other elements moved to the right */
.sidebar { float: left; width: 150px; }
.content, .subscript { margin-left: 150px; }

/* Make subscript shrink its width to fit its content */
.subscript { display: inline; }

Это немного обманывает, делая нижний индекс встроенным, чтобы его размеры «сжимались» по размеру текста.Это может или не может быть приемлемо в зависимости от того, что на самом деле .subscript.

Есть несколько других способов сделать это, если вы хотите, чтобы .subscript оставался элементом блочного отображения.Например, float: left без явного width для .subscript.Тогда вам понадобится либо явный clear: left для нового элемента непосредственно перед концом контейнера, либо, если вы вообще не хотите изменять разметку, самоочищающийся хак на .container (такой как overflow: hidden взломать, как указано в dhabersack; проверьте исправления hasLayout, если вам нужна поддержка IE6).

0 голосов
/ 28 июня 2010

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

<style type="text/css">
    #container { width: 800px; overflow: hidden; } 
    #sidebar { width: 200px; float: left; }
    #content { width: 600px; float: right; }
    #subscript { display: inline; }
</style>

<div id="container">
    <div id="sidebar">
        <p>Left</p>
    </div>
    <div id="content">
        <p>Right</p>
        <div id="subscript">
            <p>Bottom</p>
        </div>
    </div>
 </div>
0 голосов
/ 28 июня 2010

Я не согласен с Домиником Роджером: фреймворк был бы огромным излишним для чего-то такого простого.Конечно, у вас должна быть какая-то базовая сетка, но вам не нужны все 960.gs, план или любая другая «структура», которая просто загрязняет вашу разметку ненужными классами.

Каркасы требуют использованияпредопределенных имен классов, таких как .grid_2, .grid_12 и т. п., вечно связывающих вас именно с этим макетом.Этот тип побеждает разъединение HTML и CSS: при редизайне вам потребуется изменить как таблицу стилей, так и разметку, которая довольно быстро выходит из-под контроля.Я вообще просто не рекомендовал бы это.

Ваши требования довольно просты и могут прекрасно работать без фреймворков.По сути, все, что вам нужно сделать, это добавить еще один контейнер в вашу разметку (также вы должны использовать id вместо class, если только один из этих элементов может существовать на любой данной странице):

<div id="container">
  <div id="sidebar">
  </div><!-- #sidebar -->

  <div id="main">
    <div id="content">
    </div><!-- #content -->

    <div id="subscript">
    </div><!-- #subscript -->
  </div><!-- #main -->
</div><!-- #container -->

(Я использую эти комментарии, чтобы иметь возможность сопоставлять закрывающие теги с их аналогами, не стесняйтесь их опускать.)

Теперь все, что вам нужно сделать, это разместить элементы в соответствии с вашими потребностями:

#container {
  overflow: hidden; /* don't collapse (floated children) */
  width: 960px; /* fixed width for entire site */
}

#sidebar {
  float: left; /* floating to the left in #container */
  height: 200px; /* fixed height */
  width: 320px; /* fixed width */
}

#main {
  float: right; /* floating to the right of #container */
  overflow: hidden; /* don't collapse (floated children) */
  width: 640px; /* width of #container - width of #sidebar */
}

#content {
  /* you shouldn't even need rules for this one */
}

#subscript {
  float: left; /* floated to be only as wide as needed for content */
}

div s являются блочными элементами, поэтому, если они не являются плавающими или имеют фиксированную ширину, они занимают все доступное пространство (см. #content).

Теперь плавающие элементы с другой стороныне имеет высоты, поэтому их родительский контейнер просто свернется (т.е. вы не сможете заполнить пустые области цветом #container { background: red }. Чтобы предотвратить свертывание #container, требуется overflow: hidden.

По сути, каждый раз, когда вы перемещаете элемент где-то на вашей странице, его родительский контейнер должен иметь overflow: hidden (см. #container и #main).

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

0 голосов
/ 28 июня 2010

Это похоже на то, что можно реализовать без особых проблем, используя 960.gs или другие CSS-сетки без особых проблем.

Вы бесплатно получаете пробелы, поэтому мы их проигнорируем.

Вам нужно зафиксировать ширину боковой панели, и она должна иметь гибкую высоту, поэтому вы просто хотите «ячейку» с шириной (скажем, 9 из 24 столбцов). содержимое затем занимает оставшиеся (например, 15) столбцы.

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

Это может потребовать внесения некоторых изменений в разметку, например:

<div class="container_12">
   <div class="sidebar grid_9"></div>
   <div class="content grid_15"></div>
   <div class="clear"></div>
   <div class="subscript prefix_9 grid_7"></div>
   <div class="clear"></div>
</div>
...