Scale/zoom a DOM element and the space it occupies using CSS3 transform scale()

前端 未结 1 1255
野性不改
野性不改 2020-12-24 05:45

In the middle of my page I have a div element with some content in it (other divs, images, whatever).

before
1条回答
  •  再見小時候
    2020-12-24 06:16

    The HTML (Thanks Rory)

    
    
    
    
    
      Sandbox for SO question about scaling an element both visually and dimensionally
    
    
      
      
    before
    something inside
    another something
    after

    The CSS (Still started from Rory's base)

    body {
      font-size: 13px;
      background-color: #fff;
    }
    #wrapper {
      width: 50%;
      margin-left: auto;
      margin-right: auto;
      border: 0.07692307692307693em solid #888;
      padding: 1.1538461538461537em;
    }
    .surrounding-content {
      border: 0.07692307692307693em solid #eee;
    }
    #content-to-scale {
      border: 0.07692307692307693em solid #bbb;
      width: 10em;
    }
    #content-to-scale {
      font-size: 1.1em;
    }
    #content-to-scale img {
      width: auto;
      height: auto;
      min-width: 100%;
      max-width: 100%;
    }
    

    The Explanation:

    I'm using font size and ems to "scale" the dimensions of the child elements.

    Ems are dimension units that are relative to the current context's font-size.

    So if I say I have a font-size of 13px and a border of 1 (the desired border-width in pixels) divded by 13 (the current context's font-size also in pixels) = 0.07692307692307693em the browser ought to render a 1px border

    To emulate a 15px padding I use the same formula, (desired pixels)/(current context's font-size in pixels) = desired ems. 15 / 13 = 1.1538461538461537em

    To tame the scaling of the image I use an old favorite of mine: the natural ratio preserving scale, let me explain:

    Images have a natural height and width and a ratio between them. Most browser's will preserve this ratio if both width and height are set to auto. You can then control the desired width with min-width and max-width, in this case making it always scale to the full width of the parent element, even when it will scale beyond it's natural width.

    (You can also use max-width and max-height 100% to prevent the image from busting out of the borders of the parent element, but never scaling beyond their natural dimensions)

    You can now control the scaling by tweaking the font-size on #content-to-scale. 1.1em roughly equals scale(1.1)

    This does have some drawbacks: nested font-sizing in ems are applied recusively. Meaning if you have:

    
    
    Text

    You will end up with "Text" rendering at 4px instead of the 8px you might expect.

    0 讨论(0)
提交回复
热议问题