Я хочу создать, div
который может изменить свою ширину / высоту при изменении ширины окна.
Существуют ли какие-либо правила CSS3, которые позволили бы изменить высоту в соответствии с шириной при сохранении соотношения сторон ?
Я знаю, что могу сделать это с помощью JavaScript, но я бы предпочел использовать только CSS.
Ответы:
Просто создайте оболочку
<div>
с процентным значением дляpadding-bottom
, как это:В результате получится
<div>
высота, равная 75% ширины контейнера (соотношение сторон 4: 3).Это зависит от того, что для заполнения:
Нижние значения для других форматов изображения и ширины 100%:
Размещение контента в div:
Чтобы сохранить соотношение сторон div и предотвратить растяжение его содержимого, вам нужно добавить абсолютно позиционированный дочерний элемент и растянуть его по краям оболочки с помощью:
Вот демо и еще одна более глубокая демонстрация
источник
vw
единицы:Вы можете использовать
vw
единицы измерения как для ширины, так и для высоты элемента. Это позволяет сохранить соотношение сторон элемента в зависимости от ширины области просмотра.Кроме того, вы также можете использовать
vh
для высоты области просмотра, или дажеvmin
/,vmax
чтобы использовать меньшее / большее из размеров области просмотра (обсуждение здесь ).Пример: соотношение сторон 1: 1
Для других форматов изображения вы можете использовать следующую таблицу для расчета значения высоты в соответствии с шириной элемента:
Пример: 4x4 сетка квадратных делений
Вот Скрипка с этой демонстрацией, и вот решение сделать адаптивную сетку квадратов с вертикально и горизонтально центрированным контентом .
Поддержка браузеров для блоков vh / vw - IE9 +, см. CanIuse для получения дополнительной информации
источник
width:50%
иheight:50vw
высота немного выше ширины, так что не совсем пропорция 1: 1. Любые идеи?Я нашел способ сделать это с помощью CSS, но вы должны быть осторожны, так как он может меняться в зависимости от потока вашего собственного веб-сайта. Я сделал это для того, чтобы встроить видео с постоянным соотношением сторон в часть ширины моего веб-сайта.
Скажем, у вас есть встроенное видео, как это:
Затем вы можете поместить все это в div с помощью класса «video». Этот класс видео, вероятно, будет плавным элементом на вашем веб-сайте, так что сам по себе он не имеет прямых ограничений по высоте, но при изменении размера браузера он будет меняться по ширине в соответствии с потоком веб-сайта. Это был бы элемент, который вы, вероятно, пытаетесь вставить встраиваемое видео, сохраняя при этом определенное соотношение сторон видео.
Чтобы сделать это, я поместил изображение перед внедренным объектом внутри div класса "video".
!!! Важной частью является то, что изображение имеет правильное соотношение сторон, которое вы хотите сохранить. Кроме того, убедитесь, что размер изображения по крайней мере такой же большой, как и наименьшее, которое вы ожидаете от видео (или от того, что поддерживает AR), в зависимости от вашего макета. Это позволит избежать возможных проблем с разрешением изображения при изменении его размера в процентах. Например, если вы хотите сохранить соотношение сторон 3: 2, не просто используйте изображение размером 3 на 2 пикселя. Это может работать при некоторых обстоятельствах, но я не проверял это, и это, вероятно, было бы хорошей идеей, чтобы избежать.
Вероятно, у вас уже должна быть минимальная ширина, подобная этой, определенной для плавных элементов вашего веб-сайта. Если нет, то это хорошая идея, чтобы избежать обрезания элементов или их наложения, когда окно браузера становится слишком маленьким. В какой-то момент лучше иметь полосу прокрутки. Наименьшая ширина, которую должна получить веб-страница, составляет около 600 пикселей (включая столбцы фиксированной ширины), поскольку разрешение экрана не уменьшается, если вы не имеете дело с сайтами, удобными для телефона. !!!
Я использую полностью прозрачный PNG, но я не думаю, что это в конечном итоге имеет значение, если вы делаете это правильно. Нравится:
Теперь вы сможете добавить CSS, похожий на следующий:
Убедитесь, что вы также удалили все явные объявления высоты или ширины внутри объекта и вставили теги, которые обычно идут с кодом вставки для копирования / вставки.
Как это работает, зависит от свойств позиции элемента класса видео и элемента, который вы хотите, чтобы поддерживать определенное соотношение сторон. Он использует то, как изображение будет сохранять правильное соотношение сторон при изменении размера элемента. Он сообщает всему, что находится в элементе класса видео, чтобы в полной мере воспользоваться недвижимостью, обеспечиваемой динамическим изображением, увеличивая его ширину / высоту до 100% элемента класса видео, настраиваемого изображением.
Довольно круто, а?
Возможно, вам придется немного поиграть с ним, чтобы заставить его работать с вашим собственным дизайном, но на самом деле это работает на удивление хорошо для меня. Общая концепция есть.
источник
Эллиот вдохновил меня на это решение - спасибо:
aspectratio.png
это полностью прозрачный PNG-файл с размером вашего предпочтительного соотношения сторон, в моем случае 30x10 пикселей.HTML
CSS3
Обратите внимание:
background-size
это функция css3, которая может не работать с вашими целевыми браузерами. Вы можете проверить совместимость (например, на caniuse.com ).источник
Чтобы добавить к ответу Web_Designer,
<div>
высота будет (полностью составлена из нижнего отступа) 75% ширины содержащего его элемента . Вот хорошее резюме: http://mattsnider.com/css-using-percent-for-margin-and-padding/ . Я не уверен, почему так должно быть, но так оно и есть.Если вы хотите, чтобы ваш div был шириной, отличной от 100%, вам нужен еще один упаковочный div, для которого нужно установить ширину:
Недавно я использовал что-то похожее на трюк с изображением Эллиота, чтобы позволить мне использовать медиазапросы CSS для обслуживания другого файла логотипа в зависимости от разрешения устройства, но все равно масштабировать пропорционально, как это
<img>
было бы естественно (я установил логотип в качестве фонового изображения на прозрачный .png с правильным соотношением сторон). Но решение Web_Designer спасло бы меня запрос http.источник
Как указано здесь на w3schools.com и несколько раз подтверждено в этом принятом ответе , значения заполнения в процентах (выделено мной):
Ergo, правильный пример адаптивного DIV, который поддерживает соотношение сторон 16: 9, выглядит следующим образом:
CSS
HTML
Демо на JSFiddle
источник
Поскольку @ web-tiki уже показывает способ использования
vh
/vw
, мне также нужен способ центрирования на экране, здесь приведен фрагмент кода для портрета 9:16 .translateY
будет держать этот центр на экране.calc(100vw * 16 / 9)
Ожидаемая высота для 9/16.(100vw * 16 / 9 - 100vh)
высота переполнения, поэтому, потяните вверхoverflow height/2
будет держать его в центре экрана.Для пейзажа, и держите 16: 9 , вы показываете использование
Соотношение 9/16 легко изменить, нет необходимости предварительно задавать
100:56.25
или.100:75
Если вы хотите сначала обеспечить высоту, вам следует переключить ширину и высоту, например,height:100vh;width: calc(100vh * 9 / 16)
для портрета 9:16.Если вы хотите адаптировать для другого размера экрана, вы также можете заинтересовать
@media (orientation: portrait)
/@media (orientation: landscape)
portrait
/,landscape
чтобы изменить соотношение.источник
Это улучшение принятого ответа:
источник
Я наткнулся на умное решение, используя
<svg>
иdisplay:grid
.Элемент сетки позволяет вам занимать одно и то же пространство с двумя (или более) элементами, без необходимости указывать, какой из них устанавливает высоту. Что означает, что из коробки, более высокий устанавливает соотношение .
Это означает, что вы можете использовать его как есть, когда вы знаете, что контент никогда не будет достаточно высоким, чтобы заполнить весь «коэффициент», и вы просто ищете способ расположить контент в этом пространстве (то есть, чтобы центрировать его в обоих направлениях, используйте
display:flex; align-items:center; justify-content:center
).Это почти то же самое, что использование прозрачного
<img>
сdisplay:block
заранее заданным соотношением, за исключением того, что<svg>
оно легче и значительно легче изменить (чтобы изменить отношение быстро, если вам нужно).Все, что вам нужно сделать, это изменить
<svg>
соотношение s:<svg viewBox="0 0 4 3"></svg>
<svg viewBox="0 0 16 9"></svg>
Посмотрите, как это работает:
Показать фрагмент кода
Если вам нужно решение, в котором элементу контента не разрешено устанавливать соотношение, когда оно выше (со скрытым или автоматическим переполнением), вам нужно установить
position:relative
сетку иposition:absolute; height:100%; overflow-y: auto;
контент. Пример:Показать фрагмент кода
источник
Основываясь на ваших решениях, я сделал несколько хитростей:
Когда вы используете его, ваш HTML будет только
Чтобы использовать его таким образом, сделайте: CSS:
и JS (JQuery)
И имея это, вы просто устанавливаете attr
data-keep-ratio
в высоту / ширину и все.источник
data-keep-ratio
неkeep-ratio
и получить его значение с помощью$(this).data('keep-ratio');
Вы можете использовать SVG. Сделайте положение контейнера / оболочки относительным, сначала поместите svg как статически расположенное, а затем поместите абсолютно позиционированное содержимое (вверху: 0; слева: 0; справа: 0; внизу: 0;)
Пример с пропорциями 16: 9:
image.svg: (может быть встроено в src)
CSS:
HTML:
Обратите внимание, что встроенный svg, похоже, не работает, но вы можете urlencode svg и встроить его в атрибут img src следующим образом:
источник
SCSS - лучшее решение в моем случае; используя атрибут данных:
Например :
источник
источник
[data-aspect-ratio]
Селектор атрибута доступен для вас в CSS.Хотя большинство ответов очень крутые, большинство из них требуют правильного размера изображения ... Другие решения работают только на ширину и не заботятся о доступной высоте, но иногда вы также хотите разместить контент на определенной высоте. ,
Я попытался соединить их вместе, чтобы создать полностью переносимое и масштабируемое решение ... Хитрость заключается в том, чтобы использовать автоматическое масштабирование изображения, но использовать встроенный элемент SVG вместо использования предварительно отрендеренного изображения или любой другой формы. второй HTTP-запрос ...
Обратите внимание, что я использовал большие значения в атрибутах SVG ширины и высоты, так как он должен быть больше максимального ожидаемого размера, поскольку он может только уменьшаться. В примере соотношение div составляет 10: 5.
источник
Просто идея или взломать.
источник
Допустим, у вас есть 2 div, внешний div это контейнер, а внутренним может быть любой элемент, который вам нужен, чтобы сохранить его соотношение (img или iframe на youtube или любой другой)
HTML выглядит так:
Допустим, вам нужно сохранить соотношение "элемент"
соотношение => 4 к 1 или 2 к 1 ...
CSS выглядит так
заполнение, если указано в%, рассчитывается на основе ширины, а не высоты. .. так что, в принципе, вам не важно, какая у вас ширина, высота будет всегда рассчитываться исходя из этого. который будет держать соотношение.
источник
Я сталкивался с этой проблемой довольно много раз, поэтому я сделал для нее решение JS. Это в основном регулирует высоту domElement в соответствии с шириной элемента в соответствии с указанным соотношением. Вы можете использовать его следующим образом:
<div ratio="4x3"></div>
Имейте в виду, что, поскольку он устанавливает высоту элемента, элемент должен быть либо a,
display:block
либоdisplay:inline-block
.https://github.com/JeffreyArts/html-ratio-component
источник
Если вы хотите разместить квадрат внутри видового экрана в книжной или альбомной ориентации (настолько большой, насколько это возможно, но при этом ничего не торчит снаружи), переключитесь между использованием
vw
/vh
on directionportrait
/landscape
:источник
Я хотел бы поделиться своим решением, где у меня есть
img
тег, заполняющий определенное соотношение сторон. Я не мог использоватьbackground
из - за отсутствия поддержки CMS и я не предпочитаю использовать тег стиля следующим образом:<img style="background:url(...)" />
. Кроме того, ширина составляет 100%, поэтому не нужно устанавливать фиксированный размер, как в некоторых решениях. Это будет масштабироваться ответственно!источник
Вы можете достичь этого с помощью SVG.
Это зависит от случая, но в некоторых это действительно полезно. Как пример - вы можете установить
background-image
без установки фиксированной высоты или использовать его для встраивания YouTube<iframe>
с соотношением16:9
иposition:absolute
т. Д.Для
3:2
набора коэффициентовviewBox="0 0 3 2"
и так далее.Пример:
источник
Простой способ сохранить соотношение сторон, используя элемент canvas.
Попробуйте изменить размер div ниже, чтобы увидеть его в действии.
Для меня этот подход работал лучше всего, поэтому я делюсь им с другими, чтобы они тоже могли извлечь из этого пользу.
Также работает с динамической высотой!
источник
Скажем, что вам нравится поддерживать ширину: 100 пикселей и высоту: 50 пикселей (то есть 2: 1). Просто сделайте эту математику:
источник
Ну, мы недавно получили возможность использовать
aspect-ratio
свойство в CSS.https://twitter.com/Una/status/1260980901934137345/photo/1
Примечание: поддержка еще не самая лучшая ...
https://caniuse.com/#search=aspect-ratio
источник
Вы можете использовать макет потока (FWD).
https://en.wikipedia.org/wiki/Adaptive_web_design
Он будет масштабировать и поддерживать макет, он немного сложен, но позволяет изменять размер страницы, не выдвигая содержимое, например (RWD).
Это похоже на отзывчивость, но это масштабирование. https://www.youtube.com/watch?v=xRcBMLI4jbg
Вы можете найти формулу масштабирования CSS здесь:
http://plugnedit.com/pnew/928-2/
источник
Я использовал новое решение.
К основному соотношению сторон
Однако это относится ко всему окну просмотра. Итак, если вам нужен div, который составляет 30% ширины области просмотра, вы можете использовать 30vw вместо этого, и, поскольку вы знаете ширину, вы повторно используете их по высоте, используя calc и vw unit.
источник
Если бы вся структура контейнера была основана на процентах, это было бы поведением по умолчанию, можете ли вы привести более конкретный пример?
Ниже приведен пример того, что я имею в виду, если бы вся ваша родительская иерархия была основана на%, любая настройка окна браузера работала бы без каких-либо дополнительных js / css, разве это не возможно с вашим макетом?
источник