Базовый CSS (Positioning vs Float), что я не могу понять - PullRequest
3 голосов
/ 13 августа 2011

Я ищу решение.У меня есть страница в стиле CSS.Страница генерируется с помощью Rails.Макет содержит div id="wrapper для фиксированной ширины сайта и margin: 0 auto.

Подробная информация о моей проблеме:


Есть раздел заголовка, раздел навигации и контейнер (и ок. Нижний колонтитул).Контейнер имеет две колонки.Содержание и правая сторона бара.

Хорошо, я начинаю генерировать динамические вещи в области содержимого.Эта страница о прогнозах.У меня есть карты Таро в спреде, после чего каждая карта зацикливается снова, чтобы получить объяснение значения карт.

Распространение в верхней части области содержимого:

div#spread_box {
 width:620px; 
 background-color:#392b3f; 
 margin: 15px 15px 10px 10px; 
 display:block; 
 overflow:auto;  
 position:relative; 
 clear:both;}

У меня есть изображения, которые я хочу разместить в одном месте, поэтому я использую абсолютное позиционирование.

div#spread_box img  {border: 1px solid #000000; display: block; height: 120px; position: absolute; width: 71px;}

div#spread_box #kelta1  {left: 115px; top:168px;-webkit-transform: rotate(-90deg);-moz-transform: rotate(-90deg); filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); z-index: 500;}
div#spread_box #kelta2  {left: 115px; top:168px;}
div#spread_box #kelta3  {left: 115px; top:45px;}
div#spread_box #kelta4  {left: 115px; top:291px;}
div#spread_box #kelta5  {left: 20px; top:168px;}
div#spread_box #kelta6  {left: 210px; top:168px;}
div#spread_box #kelta7  {left: 310px; top:395px;}
div#spread_box #kelta8  {left: 310px; top:270px;}
div#spread_box #kelta9  {left: 310px; top:145px;}
div#spread_box #kelta10 {left: 310px; top:20px;}

Это поле распространения. Как вы можете видеть, я использовал технику позиционирования, чтобы получить это в нужном месте. Чем идет сгенерированный Rails контентный контент.Каждый блок имеет class="card_detail".В этом есть 3 вещи: короткий текст в <p>, который детализирует позицию.Под этим в двух столбцах изображение карты и пояснения к ней.

Поскольку это контент, сгенерированный базой данных, я использовал технику float.

div.explanation_box     { width:600px; background-color:#392b3f; border: 1px solid #000; margin: 15px 15px 10px 10px; text-align:justify; padding: 10px; overflow:auto;}
div.explanation_box p   { width:475px; }
div.explanation_pos     { margin:5px; display:block;}
div.explanation_pos p   { width:575px; }
div.explanation_card    { width:100px; float:left;}
div.explanation_img     { margin:5px; width:100px; float:left;}
div.explanation_pos img { width:100px; }

Существует контейнерный ящик объяснения_box с фиксированными width и overflow:auto собственность.Поле объяснения находится в обычном рабочем процессе, включая элементы с плавающей точкой.

Симптомы моей проблемы


  1. Если я даю точное значение height:600px; в spread_box (элемент контейнера), чем все в порядке.Однако, если я покажу одну и только одну карту, тогда будет огромная неиспользованная область.enter image description here

  2. Если я уберу параметр высоты распределительной коробки, то все это исчезнет!enter image description here

  3. И Если селектор overflow:auto удален, то плавающие элементы поднимаются вверх, под элементы с абсолютным позиционированием.

    enter image description here

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

Вопрос наконец-то


Итак, как мне сделать, чтобы spread_box имел динамическую высоту, включающую фиксированный позиционный спред?

Содержимое spread_box зависит от ФОРМЫ, которая отправляет данные.Таким образом, может быть все от одной карты до действительно сложного спреда.Вот почему мне это нужно!

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Во-первых, измените overflow: auto на overflow: hidden, чтобы исключить вероятность появления полос прокрутки.

Из-за того, что ваши карты расположены абсолютно, и высотой всех картвместе переменная , вам нужно , чтобы определить суммарную высоту карт.Затем вам нужно установить эту вычисленную высоту на #spread_box.

Вы можете рассчитать высоту в любом из двух мест:

  • В вашем коде Ruby.Вы знаете, какие карты вы выводите, а высота каждой карты и значения top вам известны.Это может быть трудно понять правильно, но имеет то преимущество, что оно будет работать, если JavaScript отключен, что подводит меня к следующему варианту ..
  • Использование JavaScript.Это самый чистый способ решить вашу проблему.Некоторый JavaScript или даже несколько строк jQuery могут вычислить высоту карт.
0 голосов
/ 13 августа 2011

Первое, что приходит на ум при просмотре последнего изображения, это то, что, похоже, у вас нет «clearfix», другими словами, следующий элемент после всех ваших поплавков (желательно в конце каждого большие упаковочные контейнеры :

<div style="clear: both; height: 1px;"></div>

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

...