Можно ли использовать CSS calc () для вычисления отношения ширины/высоты?

Это код, который у меня есть в настоящее время (он еще не работает):

HTML:

<div class="chi_display_header" style="background-image:url('http://localhost/.../header-dummy-small.png');"></div>

CSS:

.chi_display_header {
    background-size:contain;
    width:100%;
    min-height:100px;
    height:calc(1vw * 270 / 1280px);
    max-height:270px;
    max-width:1280px;
    margin:0 auto;
}

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

известные свойства:

соотношение: 1280: 270

минимальная высота: 100px

максимальная высота: 270px

максимальная ширина: 1280 пикселей

что я пытаюсь сделать, это рассчитать высоту контейнера .chi_display_header волшебным образом с calc:

height = calc (CURRENT_SCREEN_WIDTH * 270 / 1280);

однако мой нынешний подход

height:calc(1vw * 270 / 1280px);

пока не работает. Есть ли решение CSS?

3 ответов


решение (Ty 4 комментариев):

.chi_display_header {
    background-size:cover;
    width:100%;
    min-height:100px;
    height:calc(100vw * 270.0 / 1280.0);
    max-height:270px;
    max-width:1280px;
    margin:0 auto;
}

я применил решение Blackbam к ситуации, когда div был помещен в тело, и тело имело левую и правую обивку 15px. Вычитание общего левого и правого заполнения (30px) из расчетной высоты удалило пробел, который появился выше и ниже div.

height:calc(100vw * aspect_ratio - 30px);

это можно сделать без calc() Как хорошо. padding (даже -top и -bottom) относительно ширины элемента, так что вы можете получить тот же эффект, таким образом:

.chi_display_header {
    background-size: cover;
    width: 100%;
    min-width: 474px;
    max-width: 1280px;
    height: 0;
    padding-bottom: 21.09375%;
}

вы также можете добавить элементы внутри с внутренним <div> используя относительный / абсолютный трюк, хотя все начнет идти наперекосяк, если содержание превышает высоту содержания:

.chi_display_header {
    ...
    position: relative;
}

.chi_display_header .inner {
    position: absolute;
    top: 0; left: 0; right: 0;
    padding: 15px;
}