Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ensure an element retains a specified aspect ratio

Is there anyway to specify an aspect ratio in CSS such as 4:3 or 16:9 and then have the div (container) block fit the current window width and height?

enter image description here

Quite a simple question hopefully it has a relatively simple answer.

Edit: those still interested a great example of achieving this using only styles would be Bootstrap's responsive helpers classes.

like image 358
Joshua Barnett Avatar asked Feb 15 '23 03:02

Joshua Barnett


1 Answers

For this I fear you'll need some JS. I used jQuery here:

function preserveAspect() {
  var scaled = $("#scaled");
  scaled.height("100%");
  scaled.width("100%");
  scaled.css("box-sizing", "border-box");
  var ratio = 16/9;
  var w = scaled.outerWidth();
  var h = scaled.outerHeight();

  if (w > ratio*h) {
    scaled.width(ratio*h);
    // horizontal centering is done using margin:auto in CSS
  } else if (h > w/ratio) {
    var newHeight = w/ratio;
    scaled.height(newHeight);
    // for vertical centering:
    scaled.css({marginTop: ($("body").height()-newHeight)/2});
  }

}
$(document).ready(function() {
    preserveAspect();
    $(window).resize(preserveAspect);
});

Explanation:

  1. First we scale up our div to 100% in width and height so that we know how much space it has.
  2. Then we look up if it is too wide which means that the width is more than height times ratio.
    • If so, change width. Height is at 100% already.
    • Otherwise it might be too high, in which case we want the scale to be width divided through ratio. To center vertically we use a margin-top set to (window_height - element_height) / 2.
  3. If neither of both rules apply, the div is scaled properly already.
  4. In the end we add event listeners for when document is fully loaded and whenever the window size changes.

Full code and working example here: http://jsbin.com/efaRuXE/5/

like image 139
Hubert Grzeskowiak Avatar answered Feb 17 '23 03:02

Hubert Grzeskowiak