22

I'm having an issue identical to this poster: Jquery problem with height() and resize()

But the solution doesn't fix my issue. I have three stacked divs, and I want to use JQuery to make the middle one adjust in height to 100% of the window height, minus the height (23px * 2) of the other top & bottom divs. It works on resize, but it's off (short) by 16px when the document initially loads.

HTML

<body>
<div id="bg1" class="bg">top</div>
<div id="content">
    help me. seriously.
</div>
<div id="bg2" class="bg">bottom</div>
</body>

CSS

html,
body {
    width:100%;
    height:100%;
}

.bg {
width:315px;
height:23px;
margin:0 auto;
text-indent:-9000px;
}

#bg1 {background:url(../images/bg1.png) 0 50% no-repeat;}
#bg2 {background:url(../images/bg2.png) 0 50% no-repeat;}

#content {
width:450px; 
margin:0 auto;
text-align: center;
}

JQuery

$(document).ready(function(){
    resizeContent();

    $(window).resize(function() {
        resizeContent();
    });
});

function resizeContent() {
    $height = $(window).height() - 46;
    $('body div#content').height($height);
}
4
  • I you looking for something like this? Or should the footer move with the page? cssplay.co.uk/layouts/basics2.html A fiddle would be nice! Commented Nov 15, 2011 at 3:06
  • I could do something like that, but I'm stuck with the HTML that will be generated server-side. I've been asked to solve this sort of issue with JQuery. Commented Nov 15, 2011 at 3:18
  • What's with the 9000px text indent? Commented Nov 15, 2011 at 3:19
  • See "Using Text Indent to Hide Text": reference.sitepoint.com/css/text-indent Commented Nov 15, 2011 at 3:26

4 Answers 4

58

I feel like there should be a no javascript solution, but how is this?

http://jsfiddle.net/NfmX3/2/

$(window).resize(function() {
    $('#content').height($(window).height() - 46);
});

$(window).trigger('resize');
Sign up to request clarification or add additional context in comments.

2 Comments

Actually, you can do it in a single line. Even shorter!
I think you'll find the following is better/more dynamic: $('#dataview').height($(window).height() - $('#dataview').offset().top - 10);
7

Okay, how about a CSS answer! We use display: table. Then each of the divs are rows, and finally we apply height of 100% to middle 'row' and voilà.

http://jsfiddle.net/NfmX3/3/

body { display: table; }
div { display: table-row; }
#content {
    width:450px; 
    margin:0 auto;
    text-align: center;
    background-color: blue;
    color: white;
    height: 100%;
}

3 Comments

Man! I knew there was a CSS only solution! You inspired me. Guys, prefer this non-JS solution before any JS one. It's not as clean and you might need to use some extra mark-up, but still worth it.
Why do people think CSS is always better than JS?
@barell It isn't always better, but where it concerns presentation it's generally preferable to use styling alone, instead of implementing behaviour/logic as well. An additional benefit is that CSS is resilient by design, whereas JavaScript is brittle by design.
4

The cleanest solution - also purely CSS - would be using calc and vh.

The middle div's heigh will be calculated thusly:

#middle-div { 
height: calc(100vh - 46px); 
}

That is, 100% of the viewport height minus the 2*23px. This will ensure that the page loads properly and is dynamic(demo here).

Also remember to use box-sizing, so the paddings and borders don't make the divs outfill the viewport.

1 Comment

Virtually all current browsers support calc (here: caniuse.com/#feat=calc) And same for vh (here: caniuse.com/#feat=viewport-units)
0

To see the window height while (or after) it is resized, try it:

$(window).resize(function() {
$('body').prepend('<div>' + $(window).height() - 46 + '</div>');
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.