Высота, равная динамической ширине (разметка CSS) [дубликаты]

361

Можно ли установить ту же высоту, что и ширина (соотношение 1:1)?

Пример

+----------+
| body     |
| 1:3      |
|          |
| +------+ |
| | div  | |
| | 1:1  | |
| +------+ |
|          |
|          |
|          |
|          |
|          |
+----------+

CSS

div {
  width: 80%;
  height: same-as-width
}
  • 3
    Вы должны принять ответ, если он ответил на ваш вопрос. Как новый пользователь всегда хорошее место для посещения: stackoverflow.com/faq
  • 0
    @ChrisWue я знаю, в любом случае спасибо за совет!
Показать ещё 4 комментария
Теги:
responsive-design

9 ответов

62
Лучший ответ

Используя jQuery, вы можете добиться этого, выполнив

var cw = $('.child').width();
$('.child').css({'height':cw+'px'});

Проверьте рабочий пример http://jsfiddle.net/n6DAu/1/

  • 0
    Я очень плохо знаком с jQuery, есть ли способ получить полный пример этого?
  • 2
    Все, что вам нужно сделать, это включить сценарий jQuery и стили CSS. Проверьте полный код на jsfiddle.net/n6DAu/24
Показать ещё 6 комментариев
617

[Обновление: Хотя я обнаружил этот трюк самостоятельно, 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>
  • 0
    Ницца! Почему я не подумал об этом раньше. :)
  • 1
    Как это работает?
Показать ещё 26 комментариев
380

Есть способ с помощью CSS!

Если вы устанавливаете свою ширину в зависимости от родительского контейнера, вы можете установить высоту в 0 и установить padding-bottom в процентах, которые будут рассчитываться в зависимости от текущей ширины:

.some_element {
    position: relative;
    width: 20%;
    height: 0;
    padding-bottom: 20%;
}

Это хорошо работает во всех основных браузерах.

JSFiddle: https://jsfiddle.net/ayb9nzj3/

  • 0
    какая высота: 0? я могу бросить это?
  • 0
    если вы также установите высоту, то фактическая высота будет: высота + отступ-низ, и, как вы хотите, элемент с высотой, соответствующей ширине, вы должны сохранить высоту: 0;
Показать ещё 15 комментариев
87

Возможно без любого 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%;
}
  • 1
    Это именно то, что я искал, я просто пропустил процент заполнения, это, очевидно, секрет. Отлично, Сатран, большое спасибо.
  • 2
    На мой взгляд, это более элегантная версия решения, предоставленного Натаном Райаном. Браво.
Показать ещё 2 комментария
65

Простые и neet: используйте vw единицы для чувствительной высоты/ширины в соответствии с шириной окна просмотра.

vw: 1/100th ширины окна просмотра. (Источник MDN)

DEMO

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;
  • нет ненужной разметки HTML (только один элемент)
  • адаптировать соотношение сторон элементов в соответствии с высотой окна просмотра с помощью модулей vh
  • вы можете сделать отзывчивый квадрат или другое соотношение сторон, которое всегда вписывается в видовое окно в соответствии с высотой и шириной окна просмотра (см. этот ответ: Отзывчивый квадрат по ширине и высоте viewport или этой demo)

Эти устройства поддерживаются IE9 + см. canIuse для получения дополнительной информации

  • 5
    Это действительно умный способ сделать это на самом деле, но единственная проблема заключается в том, что вы теряете способность к размеру в зависимости от родительского элемента, ширина: 33,3% структуры родительской сетки с максимальной шириной не удается. Это хорошая альтернатива, если это не проблема.
  • 4
    Обратите внимание, что вы можете использовать функцию calc чтобы сделать ваш код немного понятнее. Например, чтобы иметь элемент с соотношением сторон 16: 9, где width 80vw вы можете использовать height: calc(80vw * (9/16)); ,
Показать ещё 2 комментария
57

Чрезвычайно простой метод jsfiddle

HTML

<div id="container">
    <div id="element">
        some text
    </div>
</div>

CSS

#container {
    width: 50%; /* desired width */
}

#element {
    height: 0;
    padding-bottom: 100%;
}
  • 0
    или просто .contianer {ширина: 50%; padding-top: 50%) .. нет необходимости в элементе
  • 6
    Почему это работает?
Показать ещё 6 комментариев
6

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

Это позволяет вам размещать контент внутри бокса без использования дополнительного 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>
  • 0
    это сработало отлично. благодарю вас. ;)
4

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

overflow: hidden;
overflow-x: auto;
overflow-y: auto;

для элемента. См. http://jsfiddle.net/B8FU8/3111/

-1

ширина: 80vmin; высота: 80vmin;

CSS составляет 80% наименьшего вида, высоты или ширины

http://caniuse.com/#feat=viewport-units

Ещё вопросы

Сообщество Overcoder
Наверх
Меню