2013-09-28 2 views
113

Я хочу, чтобы мой div приспосабливал его высоту, чтобы всегда было равно ее ширине. Ширина percental. Когда ширина родителя уменьшается, ящик должен уменьшаться, сохраняя его соотношение сторон.Как стилизовать div, чтобы быть отзывчивым квадратом?

Как это сделать, CSS?

+0

Квадратные элементы в чистом CSS является сложной задачей, и с ограничениями, но [был дан ответ перед тем] (http://stackoverflow.com/questions/13851940/pure-css- решение квадратных элементов/13852277 # 13852277). Другой полезной ссылкой может быть [этот ответ] (http://stackoverflow.com/questions/14161321/scaling-object-element-height-proportional-to-width-constant-with-css/14162000#14162000). – ScottS

+1

Для ответной сетки квадратных элементов вы можете проверить этот ответ: [отзывчивые квадратные столбцы] (http://stackoverflow.com/questions/20456694/responsive-square-columns/20457076#20457076) –

ответ

131

Чтобы добиться того, что вы ищете вы можете использовать viewport-percentage lengthvw.

Вот краткий пример, который я сделал на jsfiddle.

HTML:

<div class="square"> 
    <h1>This is a Square</h1> 
</div> 

CSS:

.square { 
    background: #000; 
    width: 50vw; 
    height: 50vw; 
} 
.square h1 { 
    color: #fff; 
} 

Я уверен, что есть много других способов сделать это, но этот путь казался лучшим для меня.

+6

Это, безусловно, самое чистое решение. Для людей, заинтересованных в поддержке браузеров, я нашел [этот обзор] (http://caniuse.com/viewport-units). – danijar

+2

Очень приятно, но поддержка браузеров на данный момент немного отрывочна, хотя это не так - http://www.google.ie/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CEAQFjAA&url= http% 3A% 2F% 2Fcaniuse.com% 2Fviewport-units & ei = H3OfUojKDoWu7Aav64HICQ & usg = AFQjCNGClMNGOWMz16go3FPckmKbSmthnw & sig2 = ra5HzgNeZxkBSVlFXY1cSA & bvm = bv.57155469, d.ZGU – byronyasgur

+2

Это решение не очень хорошо сочетается с сеткой.Если вы смотрите на квадраты, расширяющиеся с шириной столбцов, ответ @rahulbehl работает лучше. – eightyfive

133

Работает практически во всех браузерах.

Вы можете попробовать дать padding-bottom в процентах.

<div style="height:0;width:20%;padding-bottom:20%;background-color:red"> 
<div> 
Content goes here 
</div> 
</div> 

Внешний div делает квадрат, а внутренний div содержит содержание. Это решение работало для меня много раз.

Вот jsfiddle

+3

Это работает, но я не знаю, Понимать технику. Не могли бы вы объяснить, почему это работает? – danijar

+10

Это очень хороший учебник, если вы хотите использовать метод padding-bottom. [link] http://www.dwuser.com/education/content/creating-responsive-tiled-layout-with-pure-css/ – rahulbehl

+2

Урок неплохой, я легко понимаю технику. – danijar

2

Это то, что я придумал. Вот a fiddle.

Во-первых, мне нужны три элемента обертки как для квадратной формы, так и для центрированного текста.

<div><div><div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, 
sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat 
volutpat.</div></div></div> 

Это стиль. Он использует два метода: один для square shapes и один для centered text.

body > div { 
    position:relative; 
    height:0; 
    width:50%; padding-bottom:50%; 
} 

body > div > div { 
    position:absolute; top:0; 
    height:100%; width:100%; 
    display:table; 
    border:1px solid #000; 
    margin:1em; 
} 

body > div > div > div{ 
    display:table-cell; 
    vertical-align:middle; text-align:center; 
    padding:1em; 
} 
+1

Дополнительные элементы для простого квадрата, юк, но работает, я полагаю. Примечание; 'display: table-cell' не поддерживается в IE7 или старше. – TheCarver

30

Это так же просто, как указание нижнего дна такого же размера, как и ширина в процентах. Так что если у вас есть ширину 50%, просто использовать этот пример ниже

id or class{ 
    width: 50%; 
    padding-bottom: 50%; 
} 

Вот это jsfiddle http://jsfiddle.net/kJL3u/2/

отредактированную версию с отзывчивым текста: http://jsfiddle.net/kJL3u/394

+3

Это вырастает из квадратного соотношения сторон, когда вы добавляете в него контент. – zoul

+1

Вы можете исправить эту проблему с помощью 'overflow: hidden 'или другого абсолютного позиционирования детей внутри контейнера. Удобно точно как ответ @ gidzior – mix3d

3

Другой способ заключается в использовании прозрачный 1x1.детские с width: 100%, height: auto в содержании div и абсолютно позиционируемых в нем:

HTML:

<div> 
    <img src="1x1px.png"> 
    <h1>FOO</h1> 
</div> 

CSS:

div { 
    position: relative; 
    width: 50%; 
} 

img { 
    width: 100%; 
    height: auto; 
} 

h1 { 
    position: absolute; 
    top: 10px; 
    left: 10px; 
} 

Fidle: http://jsfiddle.net/t529bjwc/

+0

Это более полезный метод, потому что у вас есть фактический размер и высота для работы - полезно для элементов внутри квадратного div. – Smith

30

HTML

<div class='square-box'> 
    <div class='square-content'> 
     <h3>test</h3> 
    </div> 
</div> 

CSS

.square-box{ 
    position: relative; 
    width: 50%; 
    overflow: hidden; 
    background: #4679BD; 
} 
.square-box:before{ 
    content: ""; 
    display: block; 
    padding-top: 100%; 
} 
.square-content{ 
    position: absolute; 
    top: 0; 
    left: 0; 
    bottom: 0; 
    right: 0; 
    color: white; 
    text-align: center; 
} 

http://jsfiddle.net/38Tnx/1425/

+1

Это чистая магия, но она работает! Благодаря! –

+5

Какая черная магия?! –

+1

Это решение работает очень хорошо, когда ширина может быть ограничена правилом max-width. В этих случаях фактическая вычисленная ширина может быть меньше ширины, заданной в процентах, и все другие решения, которые устанавливают заполнение непосредственно на внешний элемент, будут терпеть неудачу. – daniels

Смежные вопросы