Поддерживать пропорции в соответствии с шириной и высотой

Можно установить и центрировать квадрат div в окне просмотра и всегда поддерживать его соотношение сторон в зависимости от ширины и высоты?

Требования:

  • только CSS
  • размер квадрата должен соответствовать наименьшему размеру (ширине или высоте) области просмотра независимо от ориентации (пейзаж или портрет) области просмотра.
  • квадрат должен быть центрирован по горизонтали и вертикали в окне просмотра

Пример:

Поддерживать пропорции в соответствии с шириной и высотой области просмотра

4 ответа

Решение

Чтобы поддерживать соотношение сторон div в соответствии с шириной и высотой в области просмотра, вы можете использовать один HTML-тег с:

  1. vmin единицы измерения:

    vmin 1/100 минимального значения между высотой и шириной области просмотра.
    (источник: MDN)

  2. position: absolute а также margin: auto; для центрирования

ДЕМО (измените высоту и ширину окна, чтобы увидеть его в действии)

Особенности:

  • сохраняет пропорции в соответствии с шириной и высотой
  • остается в центре окна просмотра по горизонтали и вертикали
  • никогда не переполняет область просмотра

Поддержка браузера:

vmin модули поддерживаются IE10 + ( canIuse) для поддержки IE9, вам нужно использовать запасной вариант с vm единицы вместо vmin как это:

width: 100vm; /* <-- for IE9 */
height: 100vm; /* <-- for IE9 */
width: 100vmin; 
height: 100vmin;

Полный код:

body {
  margin:0; /* To prevent scrollbars */
}

div{
  /* Aspect ratio */
  height:100vm; width:100vm; /* IE9 fallback */
  width: 100vmin; 
  height: 100vmin;
  /*Centering */
  position: absolute;
  top:0;bottom:0;
  left:0;right:0;
  margin: auto;
  /* styling */
  background: gold;
}
<div>whatever content you wish</div>

Вы можете получить адаптивный квадрат, используя единицы измерения vw & vh (длина в процентах от области просмотра), чтобы его размер.

Проверьте поддержку браузера: http://caniuse.com/viewport-units


Решение, которое реализует горизонтальное и вертикальное масштабирование

Пример живой страницы: http://sample.easwee.net/responsive-square/

.container {
    display:table;
    width:100%;
    height:100%;
}

.container-row {
    display:table-row;
}

.container-cell {
    display:table-cell;
    vertical-align:middle;
    text-align:center;
}

.square {
    display:inline-block;
    background:red;
    border: 3px solid blue;
}
@media(orientation:landscape) {
 .square {        
     width: 100vh;
     height: 100vh;
 }
}
@media(orientation:portrait) {
 .square{
     width: 100vw;
     height: 100vw;
 }
}
<div class="container">
 <div class="container-row">
  <div class="container-cell">
      <div class="square"></div>
     </div>
 </div>
</div>

Я объединил отличные ответы @ken-sharpe и @easwee, чтобы создать версию для неквадратных соотношений сторон: https://codepen.io/anon/pen/GyqopP

div {
  position: absolute;
  top:0;bottom:0;
  left:0;right:0;
  margin: auto;

  width: 100vw;
  height: 50vw;
  background: #326384;
}

@media (min-aspect-ratio: 2/1) {
    div {          
        width: 200vh;
        height: 100vh;
        background-color:green;
    }
}

Используйте что-то вроде этого

.container{
    display:block;
    background:#f2f2f2;
}

.square{
    width:50%;
    padding-top:50%;
    margin: auto;
    background:#e5e5e5;
}

DEMO

Другие вопросы по тегам