Подтвердить что ты не робот

CSS: сделать ширину div пропорциональной высоте

Это немного сложно объяснить, но: мне нужен divive-height div (height: 100%), который будет масштабировать ширину, пропорциональную высоте (не наоборот).

Я знаю этот метод, используя padding-top hack, чтобы сделать высоту пропорциональной ширине, но мне нужно, чтобы она работала с другим наоборот. Сказав это, я не очень сильно заинтересован в дополнительном требовании абсолютно позиционированных элементов для контента в этом методе, поэтому я понимаю, что, возможно, я прошу о луне на палке здесь.

Чтобы визуализировать, вот изображение:

Visual representation of desired effect

... и вот jsFiddle, иллюстрирующий почти то же самое.

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

Мне бы очень понравилось не возвращаться к jQuery, просто потому, что будет неотъемлемое требование для обработчиков размеров и, как правило, больше отладки по всему кругу... но если это мой единственный выбор, то fiat.

4b9b3361

Ответ 1

Мне было интересно узнать о решении cc-css для решения этой проблемы. Я наконец придумал решение с использованием ems, которое можно постепенно увеличить с помощью vws:

См. ссылку на код для полной рабочей демонстрации и объяснения:

http://codepen.io/patrickkunka/pen/yxugb

Упрощенная версия:

.parent {
  font-size: 250px; // height of container
  height: 1em;
}

.child {
  height: 100%;
  width: 1em; // 100% of height
}

Ответ 2

О, возможно, вы можете использовать трюк "padding-top".

width: 50%;
height: 0;
padding-bottom: 50%;

http://absolide.tumblr.com/post/7317210512/full-css-fluid-squares

Или:

.square-box{
    position: relative;
    width: 50%;
    overflow: hidden;
    background: #4679BD;
}
.square-box:before{
    content: "";
    display: block;
    padding-top: 100%;
}

http://codeitdown.com/css-square-rectangle/

Вертикальное заполнение в CSS связано с шириной элемента, а не с высотой.

Ответ 3

Для решения шрифта требуется, чтобы высота была известна. Я нашел решение для создания элемента пропорционально внутри родительского div с неизвестными ширинами и высотами. Вот демонстрация.

Трюк, который я использую, - это изображение, используемое в качестве разделителя. Код объяснил:

<div class="heightLimit">
 <img width="2048" height="2048" class="spacer"
  src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAA
       P///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
 <div class="filler">
  <div class="proportional">
  </div>
 </div>
</div>

Так что это не самый красивый с двумя дополнительными div и бесполезным изображением. Но это может быть хуже. Элемент изображения должен иметь ширину и высоту с требуемыми размерами. Ширина и высота должны быть максимально допустимыми (функция!).

Css:

.heightLimit {
 position: absolute;
 top: 0;
 left: 0;
 height: 100%;
 width: auto;
 max-width: 100%;
 overflow: hidden;
}

Этот элемент предназначен для ограничения высоты, но для расширения по горизонтали (width: auto), хотя никогда не выше родительского (max-width). Переполнение должно быть скрыто, потому что некоторые дети будут выступать вне div.

.spacer {
 width: auto;
 max-height: 100%;
 visibility: hidden;
}

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

.filler {
 position: absolute;
 top: 0;
 left: 0;
 bottom: 0;
 right: 0;
}

Этот элемент необходим для заполнения пространства абсолютно позиционируемым контейнером.

.proportional {
 position: relative;
 width: 100%;
 height: 0;
 padding-bottom: 100%;
}

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

К сожалению, в Chrome и IE есть ошибка, поэтому, если вы измените родительский элемент с помощью Javascript, например, в моей демонстрации, размеры не будут обновляться. Существует хак, который можно применить для решения этой проблемы, как показано в моей демонстрации.

Ответ 4

Основываясь на ответе @kunkalabs (который действительно умный), я придумал решение, которое позволяет сохранить унаследованный размер шрифта.

HTML:

<div id='rect'>
    <div id='content'>Text</div>
</div>

CSS:

#rect {
    font-size: 1000%;
    height: 1em;
    width: 1em;
    position: relative;
}

#content {
    font-size: 10%;
}

В основном размер шрифта #content равен (100/$rectFontSize) * 100 процентов прямоугольника. Если вам нужен определенный размер пикселя для прямоугольника, вы можете установить размер шрифта #rect parent font size... в противном случае просто отрегулируйте размер шрифта до тех пор, пока он не о том, где вы хотите его видеть (и взорвите своего дизайнера в процессе).

Ответ 5

Сделать родительский DIV вести себя как ячейка таблицы и выровнять дочерний элемент по вертикали. Не нужно делать никаких трюков.

HTML

<div class="parent">
<img src="foo.jpg" />
</div>

CSS

.parent { width:300px; height:300px; display:table-cell; vertical-align:middle; }