Как сделать CSS для сетки изображений

#php #javascript #html #css #grid

#php #javascript #HTML #css #сетка

Вопрос:

Я хотел бы создать сетку изображений, и я столкнулся с тем, что, по моему мнению, должно быть наиболее распространенной проблемой для сетки: а именно, как удалить поля / отступы на последних элементах?Я пытался (безуспешно):

 #page {
margin: 0 -8px -8px 0;
}

#page a {
float: left;
margin: 0 8px 8px 0;
}
  

Почему этот код не работает? Каков наилучший способ решить эту проблему?

Фреймворки CSS вынуждают нас указывать последние элементы:

960.gs использует:

 .alpha {
  margin-left: 0;
}

.omega {
  margin-right: 0;
}
  

BluePrint CSS использует:

 .last {margin-right: 0;}
  

Золотая сетка использует:

 .inside {margin-left: 0;}
  

Но как я могу это сделать, когда все, что у меня есть, — это неизвестный список изображений, который я хотел бы разложить по n столбцам? Ранее я писал для этого PHP-код и вызывал его с аргументом для количества столбцов, но для решения этой проблемы должен быть какой-то очень простой CSS-трюк!

(ссылка на страницу удалена, поскольку приведенные ниже примеры jsfiddle намного лучше)

Комментарии:

1. Извините, это была опечатка, исправленная за минуту, теперь она исправлена. То, что я хочу, это (например) поместить 3 столбца изображений шириной 100 пикселей с 10 пикселями между ними в один div размером 320 пикселей. Дело в том, что я хочу, чтобы ширина внешнего div была 320 пикселей вместо 330 пикселей.

2. Вы имеете в виду вот так , но без обивки вокруг контейнера?

3. Боюсь, ссылка все еще недоступна, если я смогу увидеть реальную проблему, я могу предложить CSS-трюк.

4. Да, это то, что я хотел, и jsfiddle в вашем ответе именно это.

Ответ №1:

Для этого, безусловно, существует простое решение в формате css / html. Вам не нужно жестко кодировать стиль с помощью php, или выполнять математику, или использовать javascript:

http://jsfiddle.net/Madmartigan/34UCn/5/

Возможно, это не лучшее или единственное решение, но иногда добавление div-оболочки дает вам большую гибкость. Вот важная часть кода, который я использовал:

HTML:

 <div class="wrapper">
    <div>
        <img><img><img><img><img><img>
    </div>
</div>
  

CSS:

 .wrapper {
    overflow:hidden;
    width:320px;
}
.wrapper div {
    /* any width up to (total img width) * (num_columns) */
    /* the rest will be chopped off by overflow:hidden */
    width:330px;

    /* chops off top "padding" of inner div (first row imgs top margin) */
    margin-top:-10px;
}
img {
    width:100px;
    height:75px;
    float:left;
    margin:10px 10px 0 0;
}
  

Надеюсь, это тот эффект, который вы ищете. Это не будет работать с изображениями переменного размера, но в вашем примере все они оказались одинакового размера. Протестировано в IE6, IE8 и FF4.

Комментарии:

1. Я должен отметить, что 340 пикселей там может быть просто 330 пикселей, ошибка. На самом деле это не имеет значения, оно просто должно быть достаточно маленьким, чтобы ограничить количество столбцов, которое вы хотите.

2. СПАСИБО, это потрясающее решение! Да, это для миниатюр фиксированного размера, конечно. Но не могли бы вы объяснить это в нескольких словах 1. зачем нужны два divs? 2. почему верхняя и левая стороны обрабатываются в разных разделах? 3. что float: left; делает в 1-м div? 4. Правильно ли я думаю, что эти два теперь действуют как .clearfix?

3. Я создал fork (без верхнего элемента с плавающей точкой) и протестировал это во всех возможных браузерах, и это работает отлично: jsfiddle.net/zsero/34UCn/3

4. Да, не нужно использовать float, просто мои floatitits барахлят. Хотя это не то же самое, что clearfix. Оболочка была необходима для overflow:hidden того, чтобы отрезать верхний и правый 10px от поля img. Хотя, похоже, у вас это есть! Обновленный пост с новой скрипкой с несколькими примечаниями и меньшим количеством свойств css.

Ответ №2:

Для этого afaik не существует простого CSS-решения. Вам нужно либо использовать javascript для выполнения некоторой математики, либо использовать php, как вы сказали.

Редактировать: Есть селектор, подобный nth-child() , но я не уверен в совместимости. Вы можете прочитать больше об этом здесь и проверить совместимость здесь или просто погуглить для получения дополнительной информации 😉 На самом деле jQuery также использует селекторы css, так что вы можете проверить больше примеров в jQuery api.

Правка2: Э-э, я вообще-то забыл, что это nth-child() в любом случае бесполезно, потому что вы не знаете n . Итак, вернемся к моему первоначальному ответу: вы не можете сделать это без каких-либо сценариев, если хотите динамического поведения.Вы, конечно, могли бы использовать этот n-й селектор, но только в том случае, если вы знаете, что у вас будет некоторое известное количество изображений в одной строке.

Комментарии:

1. Итак, вы говорите, что что-то подобное в PHP if ($i % 3 == 0) ... не так глупо, как я думал?

2. Это не глупо, imo. Но на самом деле есть селекторы, такие как nth-child, но я не уверен в совместимости с браузером. Я собираюсь добавить две ссылки к своему ответу, чтобы вы могли попробовать это и получить больше информации.

Ответ №3:

 .divclass {
    width:320px;
    float:left;
}
.maincol {
    width:100px;
    border-color:transparent;
    border-style:solid;
    border-width-right:10px;
    border-width-left:0px;
    border-width-top:0px;
    border-width-bottom:0px;
    margin:0px;
    padding:0px;
}
.rightcol {
    width:100px;
    border-color:transparent;
    border-style:solid;
    border-width:0px;
    margin:0px;
    padding:0px;
}
<div class="divclass"><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--><img class="maincol"><img class="maincol"><img class="rightcol"><br><!--
--></div>
  

вы не хотите, чтобы между изображениями были ПРОБЕЛЫ! это все испортит… Я даже не уверен насчет комментариев.