Ответ 1
Используя jQuery, вы можете добиться этого, выполнив
var cw = $('.child').width();
$('.child').css({'height':cw+'px'});
Можно ли установить ту же высоту, что и ширина (соотношение 1:1)?
Пример
+----------+
| body |
| 1:3 |
| |
| +------+ |
| | div | |
| | 1:1 | |
| +------+ |
| |
| |
| |
| |
| |
+----------+
CSS
div {
width: 80%;
height: same-as-width
}
Используя jQuery, вы можете добиться этого, выполнив
var cw = $('.child').width();
$('.child').css({'height':cw+'px'});
[Обновление: Хотя я обнаружил этот трюк самостоятельно, Ive с тех пор узнал, что Тьерри Кобленц избил меня. Вы можете найти его статью 2009 года в List Apart. Кредит, при котором должен быть предоставлен кредит.]
Я знаю, что это старый вопрос, но я столкнулся с аналогичной проблемой, которую я действительно решал только с помощью CSS. Вот мой пост в блоге, в котором обсуждается решение. В сообщении присутствует живой пример. Код отправляется ниже.
HTML:
<div id="container">
<div id="dummy"></div>
<div id="element">
some text
</div>
</div>
CSS
#container {
display: inline-block;
position: relative;
width: 50%;
}
#dummy {
margin-top: 75%; /* 4:3 aspect ratio */
}
#element {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: silver /* show me! */
}
#container {
display: inline-block;
position: relative;
width: 50%;
}
#dummy {
margin-top: 75%;
/* 4:3 aspect ratio */
}
#element {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: silver/* show me! */
}
<div id="container">
<div id="dummy"></div>
<div id="element">
some text
</div>
</div>
Есть способ с помощью CSS!
Если вы устанавливаете свою ширину в зависимости от родительского контейнера, вы можете установить высоту в 0 и установить padding-bottom в процентах, которые будут рассчитываться в зависимости от текущей ширины:
.some_element {
position: relative;
width: 20%;
height: 0;
padding-bottom: 20%;
}
Это хорошо работает во всех основных браузерах.
Возможно без любого Javascript:)
В этой статье это прекрасно написано - http://www.mademyday.de/css-height-equals-width-with-pure-css.html
HTML:
<div class='box'>
<div class='content'>Aspect ratio of 1:1</div>
</div>
CSS:
.box {
position: relative;
width: 50%; /* desired width */
}
.box:before {
content: "";
display: block;
padding-top: 100%; /* initial ratio of 1:1*/
}
.content {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
/* Other ratios - just apply the desired class to the "box" element */
.ratio2_1:before{
padding-top: 50%;
}
.ratio1_2:before{
padding-top: 200%;
}
.ratio4_3:before{
padding-top: 75%;
}
.ratio16_9:before{
padding-top: 56.25%;
}
Простые и neet: используйте vw
единицы для чувствительной высоты/ширины в соответствии с шириной окна просмотра.
vw: 1/100th ширины окна просмотра. (Источник MDN)
HTML:
<div></div>
CSS для соотношения сторон 1:1:
div{
width:80vw;
height:80vw; /* same as width */
}
Таблица для расчета высоты в соответствии с желаемым соотношением сторон и шириной элемента.
aspect ratio | multiply width by
-----------------------------------
1:1 | 1
1:3 | 3
4:3 | 0.75
16:9 | 0.5625
Этот метод позволяет вам:
position:absolute;
Эти устройства поддерживаются IE9 + см. canIuse для получения дополнительной информации
HTML
<div id="container">
<div id="element">
some text
</div>
</div>
CSS
#container {
width: 50%; /* desired width */
}
#element {
height: 0;
padding-bottom: 100%;
}
Расширяя технику заполнения сверху/снизу, можно использовать псевдоэлемент, чтобы установить высоту элемента. Используйте плавающие и отрицательные поля, чтобы удалить псевдоэлемент из потока и просмотра.
Это позволяет вам размещать контент внутри бокса без использования дополнительного div и/или CSS-позиционирования.
.fixed-ar::before {
content: "";
float: left;
width: 1px;
margin-left: -1px;
}
.fixed-ar::after {
content: "";
display: table;
clear: both;
}
/* proportions */
.fixed-ar-1-1::before {
padding-top: 100%;
}
.fixed-ar-4-3::before {
padding-top: 75%;
}
.fixed-ar-16-9::before {
padding-top: 56.25%;
}
/* demo */
.fixed-ar {
margin: 1em 0;
max-width: 400px;
background: #EEE url(https://lorempixel.com/800/450/food/5/) center no-repeat;
background-size: contain;
}
<div class="fixed-ar fixed-ar-1-1">1:1 Aspect Ratio</div>
<div class="fixed-ar fixed-ar-4-3">4:3 Aspect Ratio</div>
<div class="fixed-ar fixed-ar-16-9">16:9 Aspect Ratio</div>
На самом деле это относится к комментарию к ответу Натана, но мне не разрешено это делать...
Я хотел поддерживать соотношение сторон, даже если в коробке слишком много материала. Его пример расширяет высоту, изменяя соотношение сторон. Я нашел добавление
overflow: hidden;
overflow-x: auto;
overflow-y: auto;
для элемента. См. http://jsfiddle.net/B8FU8/3111/
ширина: 80vmin; высота: 80vmin;
CSS составляет 80% наименьшего вида, высоты или ширины