Мозаика изображений HTML / CSS

Я хочу сделать макет изображения с портретных изображений внутри div с фиксированным соотношением сторон 3:2. Размер изображений 327x491px.

основная проблема-нежелательные пробелы между изображениями. Как я ... --6-->выровнять изображения как мозаику используя только HTML / CSS?

HTML-код :

<div id="pictures1" class="_pictures1 grid">
    <div class="_pictures1-01"><div style="width:125px;height: 188px; background: red;"><img src="" width="125" height="188" alt="" /></div></div>
    <div class="_pictures1-02"><div style="width:192px;height: 288px;background: green;"><img src="" width="192" height="288" alt="" /></div></div>
     ... SO ON ...
</div> 

CSS:

._pictures1 {
    width: 935px; height: 490px;
    margin: -26px 0 0 59px;
    float: left;
    top: 20%; left: 20%;
    position: absolute;
    border: 1px gray solid;
}
._pictures1 div {position: absolute;}
._pictures1-01 {top: 0px; left: 35px;}
._pictures1-02 {top: 200px; left: 0px;}
/* ... SO ON ... */

jsfiddle

10 ответов


чтобы сделать правильный ответ, я сначала собираюсь уточнить требования:

  1. изображения все имеют одинаковое соотношение сторон: 3/2
  2. изображения не должны быть укороченные
  3. нет пространства между изображениями
  4. сделать мозаику из картинки

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

здесь FANCY FIDDLE того, что вы можете достичь, и вот как это выглядит:

Mosaic of images in html/css - example layout


первый шаг: подумайте, вычислите и подумайте еще раз

первый : чтобы сделать его простым, скажем, ваши изображения могут иметь 3 размера (я изменил размер изображения на 1 px, чтобы упростить вычисления):

  1. большой : 328*492px
  2. средний, 1/2 большой:164*246px
  3. небольшой, 1/4 большого : 82*123px

второй : поскольку все ваши изображения являются портретами, а ваш контейнер имеет ту же высоту, что и большое изображение, вам придется работать с столбцами 492px heigh, которые могут иметь 3 ширины:

  1. большой : 328px широкий, они могут отображать все изображения размером
  2. среда : 328/2 = 164px широкий, они могут отображать средние и небольшие картинки
  3. маленький : 327/4 = 82px широко, они могут только показать небольшое изображения

третий : сколько столбцов и какие размеры изображения? Это зависит от вас, вам придется сделать выбор в соответствии с общей шириной вашего контейнера и количеством изображений, которые вы хотите отобразить.

но в вашей скрипке, контейнер (._pictures1), имеет 935px ширина, которую будет невозможно достичь с шириной столбца, выбранной непосредственно перед этим.

935/82 = 11.4024...

ближайший вы можете получить это 82*12 = 984px широкое контейнер.

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


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

поскольку я уверен, что вам интересно и вы хотите проверить это, вот пример расположение в

отзывчивая мозаика изображения


следующий шаг: дизайн макета

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

Я разработал изображение, которое вы можете увидеть в bigininng ответа.

как я уже сказал, Есть много возможностей компоновки (количество столбцов и размеров изображений в те столбцы) поэтому для примера я выбрал 2 больших колонки, 1 средний и 2 маленьких

328*2+164+82*2 = 984px ( = width of container so it can fit!)

последний шаг : начать программировать!

вы можете увидеть результат в этой

скрипка

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

CSS:

#wrap {
    width:984px;
    height:492px;
}
.big_col, .medium_col, .small_col{
    height:492px;
    float:left;
}
img {
    display:block;
    margin:0;
    padding:0;
    border:none;
    float:left;
}
.big_col {
    width:328px;
}
.medium_col{
    width:164px;
}
.small_col{
    width:82px;
}
.big_img img {
    width:328px;
    height:493px
}
.medium_img img {
    width:164px;
    height:246px;
}
.small_img img {
    width:82px;
    height:123px;
}

затем разметка HTML:

<div id="wrap">
    <div class="big_col">
        <div class="small_img">
            <img src="http://www.lorempixum.com/327/491/abstract" alt="" />
            <img src="http://www.lorempixum.com/g/327/491" alt="" />
            <img src="http://www.lorempixum.com/g/327/491/sports" alt="" />
            <img src="http://www.lorempixum.com/327/491/nature" alt="" />
        </div>
        <div class="medium_img">
            <img src="http://www.lorempixum.com/g/327/491/business" alt="" />
            <img src="http://www.lorempixum.com/327/491/people" alt="" />
        </div>
        <div class="small_img">
            <img src="http://www.lorempixum.com/g/327/491/food" alt="" />
            <img src="http://www.lorempixum.com/327/491" alt="" />
            <img src="http://www.lorempixum.com/327/491/cats" alt="" />
            <img src="http://www.lorempixum.com/327/491/people" alt="" />
        </div>
    </div>
    <div class="big_col">
        <img src="http://www.lorempixum.com/327/491/nature" alt="" />
    </div>
    <div class="small_col small_img">
        <img src="http://www.lorempixum.com/g/327/491/transport" alt="" />
        <img src="http://www.lorempixum.com/g/327/491/sports" alt="" />
        <img src="http://www.lorempixum.com/327/491/nature" alt="" />
        <img src="http://www.lorempixum.com/g/327/491/sports" alt="" />
    </div>
    <div class="medium_col medium_img">
            <img src="http://www.lorempixum.com/327/491/nightlife" alt="" />
            <img src="http://www.lorempixum.com/g/327/491/transport" alt="" />
    </div>
    <div class="small_col small_img">
            <img src="http://www.lorempixum.com/327/491/fashion" alt="" />
            <img src="http://www.lorempixum.com/327/491/nature" alt="" />
            <img src="http://www.lorempixum.com/g/327/491/sports" alt="" />
            <img src="http://www.lorempixum.com/327/491" alt="" />
    </div>
</div>

Если вы задаете одно измерение или другое, но не оба, изображения должны изменяться плавно. Попробуйте установить ширину в процентах.


прежде всего, чтобы удалить пространство между изображениями, просто удалите значение "0"padding и margin.

затем, чтобы достичь того, что вы хотите, вы можете использовать или комбинировать эти стратегии:

1) назначьте фиксированный размер в пикселе одному из размеров: другой будет масштабироваться автоматически.

2) Вы можете рассчитать необходимый размер с помощью javascript и назначить значение динамически. Например, с jQuery framework:

$(img).each(function(){
 var h = this.height();
 var w = this.width();


 if (w => h){
  this.attr('width', w*0.66);
}
else {
  this.attr('height',h*.066);
}
});

3) Вы можете использовать CSS фон-картинка для дивов и background-size: cover или background-size: contain как вам нужно, статически или динамически (W3C по документам


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

родной поток HTML, как правило, путь. Абсолютное позиционирование подобно витаминным таблеткам. Вы используете его, когда вам это нужно, но это не ваша основная еда. ;)

Что бы я сделал, так это:

  1. просто расположите контейнер по желанию (по центру, например) и размер его ширины с процентом /раздела окна это.

  2. потом вы положите ._pictures1-xx divs внутри него и размер ширины фото, используя процент контейнера. Высота будет держать коэффициент автоматически ( * )

  3. Я бы тогда сделать ._pictures1-xx divs отображает " встроенный блок "и поплавок"влево". Затем немного div с четким"обоими" после последнего рисунка и закройте контейнер.

(*) напоминание : ширина или высота значение по умолчанию - "авто", то есть любой размер, который сохраняет отношение изображения, когда другое значение px/%. Горизонтальные поля изначально становятся динамическими, когда высота ваших фотографий определена, чтобы сохранить соотношение ваших фотографий. Если вы определяете ширину и оставляете высоту авто, то высота динамична, чтобы сохранить соотношение фотографий, а поля не меняются.

Я надеюсь, это было полезно.


Я хотел бы дать простое решение.

вы можете просто обернуть img тег с DIV. И вы должны применить CSS к этому завернутому DIV.

Код Вместо этого
<img src='some_image.jpg'>
Польза под видом структуры
<div class="img_wrapper">
     <img src='some_image.jpg'>
</div>


в CSS

//  suggestion: target IMG with parent class / ID
.img_wrapper img{
    width: 100%; 
    height: auto;
} 

все изображения внутри класса .img_wrapper будет иметь правильное соотношение сторон.


оберните изображение с помощью div. установите ширину и высоту для div согласно коэффициенту. Дайте только высоту для изображения. Если вы хотите, чтобы изображение занимало только пространство, им нужно использовать display: inline also


попробуйте что-то вроде этого

стилизация

body{
    background: black;
    width:80%;
    margin:5em auto;
    display:block;
}
.wrapper{
    background:#FFF;
    float:left;
}   

.container{
    height:476px;
    width:192px;
    display:inline-block;
    float:left;
}
.small{
    height:188px;
    width:125px;
    display:block;
    margin:0 auto;
    background:#333;
}
.medium{
    background:#666;
    width:192px;
    height:288px;
}
.large{
    height:476px;
    width:200px;
    background:#999;
    display:inline-block;
    float:left;
}

это HTML

<div class="wrapper">
    <div class="container">
        <div class="small">
            <div class="small_inner">
            </div>
        </div>        
        <div class="medium">
            <div class="medium_inner">
            </div>
        </div>
    </div>
    <div class="large">
        <div class="large_inner">
        </div>
    </div>
    <div class="container">
        <div class="medium">
            <div class="medium_inner">
            </div>
        </div>
        <div class="small">
            <div class="small_inner">
            </div>
        </div>  
    </div>
    <div class="large">
        <div class="large_inner">
        </div>
    </div>
    <div class="container">
        <div class="small">
            <div class="small_inner">
            </div>
        </div>        
        <div class="medium">

            <div class="medium_inner">
            </div>
        </div>
    </div>
</div>

img{
 height: auto;
 width: 50%
}

aspectRatioResizeImg
Это плагин jQuery, который позволяет изменять размер изображения, сохраняя соотношение сторон, сторона контейнера. При необходимости размер контейнера можно изменить в соответствии с аспектом изображения ratio.
https://github.com/stereoactivo/jquery.resize-image-aspect-ratio


по моему опыту: если вы установите только размер или высота или ширина (не так) изображение будет масштабироваться соответственно.