Укажите естественный размер элемента HTML

Давайте поговорим об изображениях в HTML. Если я перетащу изображение на страницу без каких-либо других ограничений, оно примет свой «естественный размер», то есть буквальный размер изображения в пикселях. Если я укажу CSS max-width и max-height, то он сохранит свое естественное соотношение сторон, но уменьшит масштаб, чтобы соответствовать ограничениям по размеру. Потрясающий!

Я хочу точного поведения для произвольного элемента. То есть я хочу создать <div> или что-то еще, что имеет естественный размер (который я бы указал в пикселях) и сохраняет соотношение сторон при воздействии max-width и max-height. (Дополнительные баллы: было бы здорово, если бы техника также поддерживала min-width и min-height.)

Вот еще информация, которую я собрал:

  • Для изображения HTML5 вы можете прочитать естественный размер изображения с атрибутами naturalWidth и naturalHeight при условии, что атрибут complete истинен. К сожалению, как указывает MDN, эти свойства доступны только для чтения и специфичны для элементов изображения.

  • Этот подход великолепен, но (хотя высота соответствует max-width) ширина не отвечает до max-height.

  • Небольшой поиск не дал решения только для CSS, что заставляет меня думать, что его может и не быть. Я также приму решения JavaScript, но они должны быть устойчивыми к изменениям размера окна и размера родительского элемента.


person Calvin    schedule 27.07.2012    source источник
comment
Я думаю, что это предлагаемая функция CSS4. Затем вы можете определить длину как часть другой длины. Поскольку теги не имеют естественного размера, это, вероятно, самое близкое, что вы можете получить. Я вижу, могу ли я найти ссылку и опубликую ее здесь.   -  person Torsten Walter    schedule 28.07.2012
comment
Итак, вы должны сначала определить CSS width и CSS height DIV, а затем дополнительно определить max-width и/или max-height, чтобы уменьшить DIV, верно?   -  person Šime Vidas    schedule 28.07.2012
comment
@ŠimeVidas Да, но важно, чтобы соотношение сторон сохранялось. Просто установить ширину/высоту/максимальную ширину/максимальную высоту недостаточно.   -  person Calvin    schedule 30.07.2012


Ответы (3)


Вот мое супер-пупер решение:

HTML

<div class="ratioBox">
    <div class="dummy"></div>

     <div class="el">This is the super duper ratio element </div>

</div>

CSS

.ratioBox{
    position: relative;
    overflow: hidden;      /* to hide any content on the .el that might not fit in it */
    width: 75%;            /* percentage width */
    max-width: 225px;
    min-width: 100px;
    max-height: 112.5px;
    min-height: 50px;  
}

.dummy {
    padding-top: 50%;      /* percentage height */
}

.el {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: silver;
}

​

Посмотрите, как это работает здесь: http://jsfiddle.net/joplomacedo/7rAcH/

Объяснение, если вы не понимаете, что происходит, придет в конце дня, так как у меня, к сожалению, нет времени. [это 28 июля, 14:54 (время по Гринвичу), когда я пишу это]

person João Paulo Macedo    schedule 28.07.2012
comment
Это также объясняется на странице ansciath.tumblr.com/post/7347495869/css-aspect. -ratio (хотя там упоминается display: inline-block, которого здесь нет). В комментариях также упоминается обходной путь для IE 7. - person DCoder; 28.07.2012
comment
Это не то же самое, что делает там автор того поста - это похоже, но в некоторых фундаментальных аспектах это не то же самое. Я начал с упрощения этого решения, которое привело меня к этому jsfiddle.net/g9Awv. Он выполняет то же самое, но использует на один элемент меньше. Оттуда я перешел к приведенному выше коду (который допускает максимальную и минимальную ширину) - person João Paulo Macedo; 28.07.2012
comment
О... и display: inline-block, я думаю, там, потому что img элементы тоже имеют это. Возможно, автор хотел, чтобы блок вел себя как изображение. - person João Paulo Macedo; 28.07.2012
comment
Посмотрев на это более внимательно, кажется, что сообщение, на которое я ссылаюсь, утверждает, что использует inline-block для получения поведения сжатия до подгонки, но спецификация CSS говорит, что поведение применяется только после того, как ширина установлена ​​​​на auto... Странно. Ваше решение работает довольно хорошо и выглядит просто, спасибо, что поделились. - person DCoder; 28.07.2012
comment
Умно, но, похоже, здесь та же проблема, что и на ansciath.tumblr. .com/post/7347495869/css-aspect-ratio: если вы масштабируете страницу по горизонтали, высота настраивается правильно, но если вы масштабируете страницу по вертикали, ширина не корректируется должным образом. . - person Calvin; 30.07.2012

Измените размер div как изображение с помощью CSS

DEMO: измените размер окна результатов (ширину и высоту), чтобы увидеть элемент div. изменить размер, как изображение.

В демоверсии вы можете видеть, что и изображение, и div изменяются одинаково в зависимости от высоты и ширины области просмотра окна результата.

Этот метод использует vh/vw. единиц. Они позволяют вам установить ширину в соответствии с высотой области просмотра и высоту в соответствии с шириной области просмотра.
С помощью комбинированного использования max-width и max-height вы можете заставить его вести себя и изменять размер как изображение при изменении размера браузера.
Поддержка браузеров для этих устройств: IE9+. Для получения дополнительной информации см. раздел canIuse.
В приведенной выше демонстрации используется соотношение сторон 1:1, но вы можете с небольшими расчетами использовать любое другое соотношение сторон, например:

CSS (для соотношения сторон 1:1)

div{    
    width: 80vw; 
    height: 80vh;

    max-width: 80vh;
    max-height: 80vw;
}

Еще один шаг: vmin и vmax

Вы также можете использовать vmin/vmax. Эти единицы выбирают минимальное или максимальное значение между шириной и высотой окна просмотра, чтобы вы могли иметь желаемое поведение max/min-height и max/min-width. Но поддержка браузерами этих единиц не так хороша, как vh/vw (canIuse).

Демо

CSS (для соотношения сторон 1:1):

div{    
    min-width:200px;
    min-height:200px;

    width: 80vmin; 
    height: 80vmin;

    max-width: 800px;
    max-height: 800px;
}
person web-tiki    schedule 25.05.2014
comment
Это отличный ответ (я не знал о vw/vh/etc), и он идеально подходит для чего-то вроде лайтбокса, но, к сожалению, он все еще не соответствует The Dream. Вместо vh и vw для этого нужно что-то вроде pw и ph для ширины и высоты родителя. Ваше решение великолепно, но работает только в том случае, если вы хотите масштабировать свой элемент относительно всего окна просмотра. В CSS нет pw и ph. :/ - person Calvin; 05.06.2014
comment
@Calvin Я думаю, что vw/vh может быть полезен в зависимости от варианта использования. Они требуют думать и строить макеты по-другому. Точно так же, как при проектировании с пикселями или процентами, вам нужно подумать об этом до и на протяжении всего процесса проектирования. Я согласен с вами в отношении pw/ph, их было бы проще использовать, особенно если вы хотите адаптировать их к существующим веб-сайтам. - person web-tiki; 06.06.2014

Я не думаю, что сейчас это возможно сделать с помощью чистого CSS. Возможно, в будущем, когда у нас будет полная поддержка переменных и вычислений CSS. Теперь вы можете использовать прозрачное изображение, чтобы указать соотношение сторон или с помощью скриптов. Также может быть полезно что-то вроде LESS.

person Roman    schedule 28.07.2012
comment
МЕНЬШЕ не поможет. LESS — это просто препроцессор CSS. То есть конечным результатом файла LESS является файл CSS. Если вы не можете сделать это с помощью CSS, вы не можете сделать это с помощью LESS. - person João Paulo Macedo; 28.07.2012
comment
Вы не правы. С помощью LESS вы можете рассчитать высоту на основе ширины элемента, чтобы получить правильное соотношение сторон. - person Roman; 29.07.2012