Мозаика изображений 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 ответов
чтобы сделать правильный ответ, я сначала собираюсь уточнить требования:
- изображения все имеют одинаковое соотношение сторон: 3/2
- изображения не должны быть укороченные
- нет пространства между изображениями
- сделать мозаику из картинки
вы можете иметь тысячи возможностей для отображения ваших изображений. Я собираюсь сделать простой макет, который должен показать вам путь, чтобы построить свой собственный.
здесь FANCY FIDDLE того, что вы можете достичь, и вот как это выглядит:
первый шаг: подумайте, вычислите и подумайте еще раз
первый : чтобы сделать его простым, скажем, ваши изображения могут иметь 3 размера (я изменил размер изображения на 1 px, чтобы упростить вычисления):
- большой :
328*492px
- средний, 1/2 большой:
164*246px
- небольшой, 1/4 большого :
82*123px
второй : поскольку все ваши изображения являются портретами, а ваш контейнер имеет ту же высоту, что и большое изображение, вам придется работать с столбцами 492px heigh, которые могут иметь 3 ширины:
- большой :
328px
широкий, они могут отображать все изображения размером - среда :
328/2 = 164px
широкий, они могут отображать средние и небольшие картинки - маленький :
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, как правило, путь. Абсолютное позиционирование подобно витаминным таблеткам. Вы используете его, когда вам это нужно, но это не ваша основная еда. ;)
Что бы я сделал, так это:
просто расположите контейнер по желанию (по центру, например) и размер его ширины с процентом /раздела окна это.
потом вы положите ._pictures1-xx divs внутри него и размер ширины фото, используя процент контейнера. Высота будет держать коэффициент автоматически ( * )
Я бы тогда сделать ._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>
aspectRatioResizeImg
Это плагин jQuery, который позволяет изменять размер изображения, сохраняя соотношение сторон, сторона контейнера. При необходимости размер контейнера можно изменить в соответствии с аспектом изображения ratio.
https://github.com/stereoactivo/jquery.resize-image-aspect-ratio
по моему опыту: если вы установите только размер или высота или ширина (не так) изображение будет масштабироваться соответственно.