Vertically Centered

Posted on Thu 25 May 2017 in JavaScript

I am porting a site, and the original login box would verticaly center, even as I change the size of the window. There were several StackOverflow answers that suggested creating a CSS class, which seemed perfect, but they didn't seem to work. Then I noticed they had some JavaScript in their file to pad the top of the login <div> element. I made some simplifications using jQuery and voila!

/* Vertically center login form in window
 *
 * Args:
 *     banner (str): id of any banner or navbar elements at the top of
 *         window
 *     log_form (str):  id of div containing log form to center
 *     minht (int): a minimum height to separate div from banner
 *
 * Use this as the callback for jQuery's resize function.*/

function set_login_form_container_margin_top(banner, log_form, minht) {
var banner_height =  $(banner).height();  // height of banner
var window_height = $( window ).height();  // window height
var login_form_height = $(log_form).height();  // login form
// new height = half difference between window and banner + login form
var new_height = (window_height - login_form_height - banner_height) / 2;
console.log('new_height = ' + new_height);
// set the margin on the top of the login form container
$(log_form).css('margin-top', new_height < minht ? minht : new_height + 'px');
}

Use it on your web page with jQuery's resize function.

<script src="/static/js/vertically_center.js"></script>
<script type="">
  $(function(){
    set_login_form_container_margin_top(
        "#my_banner",
        "#login-form-container", 0);
  });
  $( window ).resize(function(){
    set_login_form_container_margin_top(
        "#my_banner",
        "#login-form-container", 0);
  });
</script>