Grid of responsive squares

前端 未结 4 562
一生所求
一生所求 2020-11-22 03:35

I\'m wondering how I would go about creating a layout with responsive squares. Each square would have vertically and horizontally aligned c

4条回答
  •  花落未央
    2020-11-22 04:02

    You can make responsive grid of squares with verticaly and horizontaly centered content only with CSS. I will explain how in a step by step process but first here are 2 demos of what you can achieve :

    • Grid of square images
    • Grid of squares with content

    Now let's see how to make these fancy responsive squares!



    1. Making the responsive squares :

    The trick for keeping elements square (or whatever other aspect ratio) is to use percent padding-bottom.
    Side note: you can use top padding too or top/bottom margin but the background of the element won't display.

    As top padding is calculated according to the width of the parent element (See MDN for reference), the height of the element will change according to its width. You can now Keep its aspect ratio according to its width.
    At this point you can code :

    HTML :

     

    CSS

    div {
        width: 30%;
        padding-bottom: 30%; /* = width for a square aspect ratio */
    }
    

    Here is a simple layout example of 3*3 squares grid using the code above.

    With this technique, you can make any other aspect ratio, here is a table giving the values of bottom padding according to the aspect ratio and a 30% width.

     Aspect ratio  |  padding-bottom  |  for 30% width
    ------------------------------------------------
        1:1        |  = width         |    30%
        1:2        |  width x 2       |    60%
        2:1        |  width x 0.5     |    15%
        4:3        |  width x 0.75    |    22.5%
        16:9       |  width x 0.5625  |    16.875%
    




    2. Adding content inside the squares

    As you can't add content directly inside the squares (it would expand their height and squares wouldn't be squares anymore) you need to create child elements (for this example I am using divs) inside them with position: absolute; and put the content inside them. This will take the content out of the flow and keep the size of the square.

    Don't forget to add position:relative; on the parent divs so the absolute children are positioned/sized relatively to their parent.

    Let's add some content to our 3x3 grid of squares :

    HTML :

    .. CONTENT HERE ..
    ... and so on 9 times for 9 squares ...

    CSS :

    .square {
        float:left;
        position: relative;
        width: 30%;
        padding-bottom: 30%; /* = width for a 1:1 aspect ratio */
        margin:1.66%;
        overflow:hidden;
    }
    
    .content {
        position:absolute;
        height:80%; /* = 100% - 2*10% padding */
        width:90%; /* = 100% - 2*5% padding */
        padding: 10% 5%;
    }
    

    RESULT <-- with some formatting to make it pretty!



    3.Centering the content

    Horizontally :

    This is pretty easy, you just need to add text-align:center to .content.
    RESULT

    Vertical alignment

    This becomes serious! The trick is to use

    display:table;
    /* and */
    display:table-cell;
    vertical-align:middle;
    

    but we can't use display:table; on .square or .content divs because it conflicts with position:absolute; so we need to create two children inside .content divs. Our code will be updated as follow :

    HTML :

    ... CONTENT HERE ...
    ... and so on 9 times for 9 squares ...

    CSS :

    .square {
        float:left;
        position: relative;
        width: 30%;
        padding-bottom : 30%; /* = width for a 1:1 aspect ratio */
        margin:1.66%;
        overflow:hidden;
    }
    
    .content {
        position:absolute;
        height:80%; /* = 100% - 2*10% padding */
        width:90%; /* = 100% - 2*5% padding */
        padding: 10% 5%;
    }
    .table{
        display:table;
        height:100%;
        width:100%;
    }
    .table-cell{
        display:table-cell;
        vertical-align:middle;
        height:100%;
        width:100%;
    }
    




    We have now finished and we can take a look at the result here :

    LIVE FULLSCREEN RESULT

    editable fiddle here


提交回复
热议问题