Как заставить элементы течь снизу вверх?

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

  NORMAL         DESIRED
|---------|    |---------|
| A B C D |    | I       |
| E F G H |    | E F G H |
| I       |    | A B C D |
|---------|    |---------|

Пример кода:

<html>
    <head>

      <style>
        .container {
          margin:10px;
          border:1px solid black;
          float:left;
        }

        .tile {
          width:100px;
          height:100px;
          border:1px solid black;
          margin:5px;
          float:left;
          font-size: 50px;
          text-align: center;
          line-height: 100px;
          vertical-align: middle; 
        }

      </style>

    </head>
    <body>
        <div id="container-1" class="container">
          <span class="tile">1</span>
          <span class="tile">2</span>
          <span class="tile">3</span>
          <span class="tile">4</span>
          <span class="tile">5</span>
          <span class="tile">6</span>
          <span class="tile">7</span>
          <span class="tile">8</span>
          <span class="tile">9</span>
        </div>
    </body>
</html>

Ответ 1

Подумайте нестандартно:

.container, .tile {
    transform:rotate(180deg);         /* Moz and IE10+ */
    -ms-transform:rotate(180deg);     /* IE9 */
    -webkit-transform:rotate(180deg); /* Opera/Chrome/Safari */
}

Да, это действительно работает:

.container {
  margin:10px;
  border:1px solid black;
  float:left;
  transform:rotate(180deg);
}
.tile {
  width:100px;
  height:64px;
  border:1px solid black;
  margin:5px;
  float:right;
  font-size: 40px;
  text-align: center;
  line-height: 64px;
  vertical-align: middle; 
  transform:rotate(180deg);
}
<div id="container-1" class="container">
  <span class="tile">1</span>
  <span class="tile">2</span>
  <span class="tile">3</span>
  <span class="tile">4</span>
  <span class="tile">5</span>
  <span class="tile">6</span>
  <span class="tile">7</span>
  <span class="tile">8</span>
  <span class="tile">9</span>
</div>

Ответ 2

Есть еще один способ сделать это. Вы можете использовать свойство CSS3 flex-wrap для достижения нужного результата.

.container{
    display: flex;
    flex-wrap: wrap-reverse;
}

Пример

Обновление до 2015 года

flex-wrap поддерживается в Chrome, Firefox, Opera, IE 10+ и Safari 6.1 +.

Ответ 3

Лучшим решением, которое я могу придумать, используя только CSS, было бы использовать медиа-запросы на конкретных контрольных точках и разработать 2-4 (в зависимости от о том, сколько очков вы хотите, это может быть еще больше) желаемых конфигураций.

Подумайте о желаемых конфигурациях, затем вы можете указать конкретный идентификатор вашего контента для изменения их стилей/ширины на каждой точке останова. Например,

<head>

  <style>
    .container {
      margin:10px;
      border:1px solid black;
      float:left;
    }

    .tile {
      width:100px;
      height:100px;
      border:1px solid black;
      margin:5px;
      float:left;
      font-size: 50px;
      text-align: center;
      line-height: 100px;
      vertical-align: middle; 
    }
@media all and (max-width: 699px) and (min-width: 520px) {
  #tileOne {
    width: 100%;
  }
  #tileTwo {
    width: 50%;
  }
}
  </style>

</head>
<body>
    <div id="container-1" class="container">
      <span class="tile" id="tileOne">1</span>
      <span class="tile" id="tileTwo">2</span>
      <span class="tile">3</span>
      <span class="tile">4</span>
      <span class="tile">5</span>
      <span class="tile">6</span>
      <span class="tile">7</span>
      <span class="tile">8</span>
      <span class="tile">9</span>
    </div>
</body>

Этот метод будет полностью ручным, поэтому может не работать хорошо для динамического содержимого, если вы также не хотите использовать css-child-selectors, что для обратной совместимости лучше всего использовать с помощью jQuery. Но поскольку он полностью ручной, он также дает вам полный контроль над прогрессией.

Как и в случае с решением Niels, это не будет работать ниже IE9, потому что медиа-запрос не поддерживается.