Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I make an element as wide as it is high in css?

Tags:

css

I know I can make an element as high as it is wide using padding-top/bottom

#element {
  width: 40%;
  padding-top: 40%;
}

The reason the above works is because, when giving padding-top/bottom a percentage value, it is relative to the width of the parent, not the height.

how can i do the same thing, just making it as wide as it is high instead of the other way around?

It needs to be responsive, and the solution should work in all major browser including IE8+

like image 952
SomeNorwegianGuy Avatar asked Nov 16 '13 22:11

SomeNorwegianGuy


People also ask

How do you make a full width element in CSS?

The width property is used to fill a div remaining horizontal space using CSS. By setting the width to 100% it takes the whole width available of its parent. Example 1: This example use width property to fill the horizontal space. It set width to 100% to fill it completely.

How do you make a Div wider as its content?

Using inline-block property: Use display: inline-block property to set a div size according to its content.

How do I change the content width in CSS?

The width CSS property sets an element's width. By default, it sets the width of the content area, but if box-sizing is set to border-box , it sets the width of the border area.

How do you set the width of an element?

height properties to set the width and height of an element, e.g. box. style. width = '100px' . The width and height properties set the element's width and height to the supplied values.


1 Answers

Well, I found a unique hack, though it's only a half-answer (it might answer certain cases). Maybe someone with a few more wits can extend it and find a full solution. :-)

Based on the fact that <img> tags retain their proportion when scaling only one dimension, I put together a test that embeds a 1x1 spacer, and scales it to fit the height.

It does work well. Sadly, the downside is the image needs to be contained in an element which is a sibling to the content generating the height, and the width of the actual element with the content does not change.

Thus, if you're able to duplicate your content, it might actually work.

Here's a JSFiddle to demonstrate it. And, here's the commented code:

<style type="text/css">
    #outer {
        position:relative; /* limit the absolutely positioned #box */
    }
    #box {
        background-color:red;
        position:absolute;
        height:100%; /* make this box fill the height of #outer */
        display:block;
        z-index:-1; /* put it behind the content box generating height (maybe not if you want to hide / copy it) */
    }
    img {
        height:100%; /* generate the proportional square */
    }
    #inner {
        position:absolute;
        top:0; bottom:0; left:0; right:0; /* make the inner box just fill the box generated by the image */
    }
    .centered {
        text-align:center;
        margin-top:50%;
        transform:translateY(-50%); /* quick vertical-centering css */
    }
    #box-text {
        color:white;
    }
    #height-box {
        display:inline-block; /* make the box width fit to the content - not vital either way */
    }
</style>
<div id="outer">
    <div id="box">
        <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
        <div id="inner">
            <p id="box-text" class="centered">Box</p>
        </div>
    </div>
    <div id="height-box" contenteditable="true">is<br>this<br>actually<br>possible?</div>
</div>
like image 153
Codesmith Avatar answered Nov 15 '22 08:11

Codesmith