Вот один из способов сделать это, который включает в себя дополнительную надбавку, чтобы она не понравилась всем.
Пусть .wrap
- некоторый родительский элемент, содержащий блок с некоторой шириной и высотой (может быть в значениях%).
Определите дочерний контейнер inline-block, .framer
, ширина которого равна% от родителя, например, 23%.
В пределах .framer
разместите квадратное изображение .aspect-setter
(размеры не являются критичными, просто держите его маленьким) и установите ширину на 100%. Затем изображение будет масштабироваться до ширины .framer
, а .framer
будет сжиматься до изображения (потому что это встроенный блок) и сохранить свою внутреннюю форму (потому что высота автоматически). Используйте visibility: hidden
, чтобы скрыть изображение, сохраняя его в потоке содержимого.
Определите .avatar-container
как абсолютно позиционированный элемент и используйте смещения, чтобы масштабировать его до .framer
. Поскольку .framer
является квадратным, .avatar-container
также будет квадратным.
Использование дополнительного изображения не слишком элегантно, но оно выполняет свою работу.
.wrap {
width: 400px;
height: 250px;
border: 1px dotted gray;
}
.framer {
display: inline-block;
position: relative;
border: 1px dashed blue;
width: 23%;
}
.aspect-setter {
vertical-align: top;
visibility: hidden;
width: 100%;
height: auto;
}
.avatar-container {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
border-radius: 50%;
background-image: url('http://www.wisportsfan.com/siteresources/images/defaultavatar.jpg');
background-size: cover;
}
<div class="wrap">
<div class="framer">
<img class="aspect-setter" src="http://placehold.it/100x100">
<div class="avatar-container"></div>
</div>
</div>
Будет высота динамически изменяться после загрузки страницы? Что вы пробовали, что не сработали? – wrxsti
Да, будет. Например. высота будет изменяться, когда устройство, на которое он просматривается, находится в портретном или альбомном режиме. – Tiwaz89
Я не уверен, что эта техника будет работать для вас, но вы можете установить изображение в качестве фона div и установить 'background-size'' cover': http://jsfiddle.net/4d3eqagy/ Это отрицает необходимость любого динамического размера, так как браузер будет заботиться о нем для вас. –