Жидкий дизайн создает неровные столбцы

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

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

Моя проблема заключается в заголовках, таких как в <h4>{{video.title}}</h4> разной длины, поэтому при изменении размера браузера он выталкивает другой контент вниз, что приводит к увеличению высоты прямого родительского элемента div, что приводит к увеличению высоты элемента верхнего уровня, в котором он содержится, с помощью ng-repeat (который повторяет div только через массив JS - это директива AngularJS и не имеет отношения к вопросу). В результате он выталкивает любой элемент div ниже его вправо, и в результате получается пустое место, которое немного меньше, чем для элемента div, разрушая то, что в противном случае представляло бы собой чистый макет столбца.

HTML

<div id="VideoContent" class="span9">
    <h3>Browse {{languageSelected}} Videos<span ng-hide="hasDifficulty(difficultySelected)"> ({{difficultySelected}})</span></h3>
    <div class="row-fluid">
        <div class="VideoSummary span4" ng-repeat="(videoIndex, video) in videos | filter: filterResults">
            <div class="VideoInfo">
                <div>
                    <div class="pull-left">
                        <img alt="Video Preview Image" src="./images/video1.png" />
                    </div>
                    <div>
                        <h4>{{video.title}}</h4>
                        <p>Language:  {{video.language}}</p>
                        <p>Difficulty Level:  {{video.difficulty}}</p>
                        <p>Topics:  <span ng-repeat="(topicIndex, topic) in video.topics">{{topic}}<span ng-hide="isLastTopic(topicIndex, video.topics)">, </span></span></p>
                        <p>Contributor:  {{video.origin.creator}}</p>
                    </div>
                </div>
                <p>{{video.description}}</p>
            </div>
            <div class="MiscInfo">
                <div>
                    <p class="pull-right label">{{video.views}} views</p>
                </div>
                <div>
                    <p class="pull-right label" ng-show="hasTranslation(video)">Translate</p>
                    <p class="pull-right label" ng-show="hasCaption(video)">Caption</p>
                </div>
            </div>
        </div>
    </div>
</div>

CSS (SASS)

> div#VideoContent
  > div
    > div.VideoSummary
      display: inline-block
      margin-top: 20px
      &:first-child
        margin-left: 2.5%
      > div.VideoInfo
        > div
          > div
            display: inline-block
          > div:last-child
            margin-left: 30px
            > p
              line-height: 10px
        > p
          margin-top: 20px
      > div.MiscInfo
        border-top-width: 1px
        border-top-color: $Blue
        border-top-style: dotted
        padding-top: 10px
        > div
          display: inline
        > div:first-child
          margin-right: 10%
          > p
            float: left
        > div:last-child
          > p:last-child
            margin-right: 10px

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

1 ответ

Решение

О, это очень грязный код!

Контейнер проблемного h4 (с вашим ужасным кодом я могу ссылаться на него как на "div, который является дочерним элементом пятого уровня от #VideoContent") display установлен в inline-block,

Встроенный блок становится таким же широким, как его содержимое.

Чтобы его ширина отличалась от ширины содержимого, вы должны объявить ширину явно:

...
          > div
            display: inline-block
            width:   15em
...

Если вы хотите сохранить свой макет жидкости, то вы не должны использовать inline-block на первом месте. Оставаться с block как для всех контейнеров, так и для детей. Установите ширину контейнера явно. Чтобы создать два столбца, поместите первый столбец и добавьте левое поле ко второму столбцу.

Ваш код полностью разрушен, поэтому я написал для вас чистый пример: http://jsfiddle.net/z6Gsh/2/

PS Ваше единственное оправдание может заключаться в том, что HTML и CSS предоставляются CMS, вам не разрешено изменять его, и вы вынуждены отвергать большую часть CSS. Если вы написали этот HTML самостоятельно, тогда...Ваш код плох, и вы должны чувствовать себя плохо

UPD 2013-03-28

О, так вам нужно, чтобы изделие не росло вертикально?

Вот и все, поддерживая свою дрянную структуру кода:

$img-width: 200px
$Blue: blue

div#VideoContent
  width: 580px // You won't need this
  outline: 1px solid red
  > div
    > div.VideoSummary
      margin-top: 20px
      &:first-child
        margin-left: 2.5%
      > div.VideoInfo
        > div
          > div
            h4, p
              white-space: nowrap // Forcing the paragraphs be one line
              overflow-x: hidden // Trimming the lines 
              text-overflow: ellipsis // Adding three dots
              line-height: 1em // Fixing ridiculous line height
              margin: 0.5em // Fixing margins
          .pull-left
            float: left // The image is pulled to the left
          > div:last-child
            margin-left: $img-width + 30px // The text is pushed to the right
        > p
          margin-top: 20px
          clear: both // The text below the image should not start to the right of it
      > div.MiscInfo
        border-top-width: 1px
        border-top-color: $Blue
        border-top-style: dotted
        padding-top: 10px
        > div
          display: inline
        > div:first-child
          margin-right: 10%
          > p
            float: left
        > div:last-child
          > p:last-child
            margin-right: 10px

// This is for example
.pull-left
  width: $img-width
  height: 130px
  background-color: pink

Идея проста. использование white-space: nowrap чтобы заставить текст однострочным, используйте oveflow-x: hidden обрезать его и использовать text-overflow: ellipsis добавить три точки.

И вот эти исправления для вашего уродливого выравнивания двух столбцов:

  1. Ради бога, удали все display: inline-block декларации, они совершенно не нужны и ломают макет.
  2. Применять float-left к изображению (.pull-left).
  3. Применять margin-left: $img-width + 30px к описанию (> div:last-child), где $img-width ширина изображения.

Ура! Это работает как шарм:

http://d.pr/i/9Ma3+

Вы можете поиграть с этим здесь: http://fiddlesalad.com/sass/example-for-stack/

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

Другие вопросы по тегам