【问题标题】:Simple 100% CSS Height example not working, can someone help please简单的 100% CSS 高度示例不起作用,有人可以帮忙吗
【发布时间】:2014-04-25 11:53:14
【问题描述】:

我有一个非常简单的 CSS 100% 示例,按照我的理解,从逻辑上讲,它应该可以工作,但不能。谁能解释一下原因?

HTML:

<div id="header">header</div>
<div id="nav">Nav</div>
<div id="title">title</div>
<div id="content">
    Content
</div>

CSS:

html {
    height:100%;
    padding: 0;
    margin: 0;
}
body {
    height: 100%;
    padding: 0;
    margin: 0;
}
#header {
    background-color:red;
    padding: 0;
    margin: 0;
}
#nav {
    background-color:gray;
    padding: 0;
    margin: 0;
}
#title {
    background-color:azure;
    padding: 0;
    margin: 0;
}
#content {
    background-color:antiquewhite;
    height:100%;
    padding: 0;
    margin: 0;
}

据我了解,不应该有垂直滚动条。然而一个出现了。

这里有一个小提琴来演示:http://jsfiddle.net/codeowl/9wABW/

感谢您的宝贵时间,

问候,

斯科特

更新:

这是我最终做的:

我开发了一种堆栈和填充方法,如下所示。不幸的是,我在尝试访问 java 脚本中的窗口时遇到了问题,所以我只能粘贴代码:

CSS:

#header {
    background-color:red;
}
#nav {
    background-color:gray;
}
#title {
    background-color:azure;
}
#content {
    background:green;
}

HTML:

<div id="header" class="stack-y">header</div>
<div id="nav" class="stack-y">Nav</div>
<div id="title" class="stack-y">title</div>
<div id="content" class="fill-y">
    <div data-role="splitter"
        data-panes="[
        { scrollable: false, collapsible: true, size: '300px' },
        { scrollable: false, collapsible: true }
        ]" 
        class="fill-y">
        <div>
            Left Pane
        </div>
        <div>
            Right Pane
        </div>
    </div>
    <div class="stack-y">Test Content</div>
</div>

Java 脚本:

$(document).ready(function () {
    var fResizeLayout = null;

    fResizeLayout = function() {
        var aFillElements = $('.fill-y');
        $.each(aFillElements, function (i, e) {
            var p = null,
                iPY = 0,
                iY = 0,
                iH = 0;
            e = $(e);
            p = e.parent();
            if (p.prop('tagName') === 'body') { iPY = $(window).height(); }
            else { iPY = p.innerHeight(); }
            e.siblings('.stack-y').each(function () {
                iY += $(this).outerHeight(true);
            });
            iH = (iPY - iY - parseInt(e.css('border-top-width'), 10) - parseInt(e.css('border-bottom-width'), 10));
            e.height(iH);
        });
        kendo.resize($('#content'));
    };

    kendo.init($('#content'));
    fResizeLayout();

    $(window).on('resize', function () {
        if (this.resizeTO) clearTimeout(this.resizeTO);
        this.resizeTO = setTimeout(function () {
            $(this).trigger('resizeEnd');
        }, 200);
    });

    $(window).on('resizeEnd', function () {
        fResizeLayout();
    });            
});

当然,您需要包含剑道库才能使剑道部分工作。

<link href="http://cdn.kendostatic.com/2013.3.1119/styles/kendo.common.min.css" rel="stylesheet" type="text/css" />
<link href="http://cdn.kendostatic.com/2013.3.1119/styles/kendo.default.min.css" rel="stylesheet" type="text/css" />
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://cdn.kendostatic.com/2013.3.1119/js/kendo.all.min.js"></script>

没有基诺库:

HTML:

<div id="header" class="stack-y">header</div>
<div id="nav" class="stack-y">Nav</div>
<div id="title" class="stack-y">title</div>
<div id="content" class="fill-y">
    Test Fill Content
</div>
<div class="stack-y">Test Stacked Content</div>

Java 脚本:

$(document).ready(function () {
    var fResizeLayout = null;

    fResizeLayout = function() {
        var aFillElements = $('.fill-y');
        $.each(aFillElements, function (i, e) {
            var p = null,
                iPY = 0,
                iY = 0,
                iH = 0;
            e = $(e);
            p = e.parent();
            if (p.prop('tagName') === 'body') { iPY = $(window).height(); }
            else { iPY = p.innerHeight(); }
            e.siblings('.stack-y').each(function () {
                iY += $(this).outerHeight(true);
            });
            iH = (iPY - iY - parseInt(e.css('border-top-width'), 10) - parseInt(e.css('border-bottom-width'), 10));
            e.height(iH);
        });
    };

    fResizeLayout();

    $(window).on('resize', function () {
        if (this.resizeTO) clearTimeout(this.resizeTO);
        this.resizeTO = setTimeout(function () {
            $(this).trigger('resizeEnd');
        }, 200);
    });

    $(window).on('resizeEnd', function () {
        fResizeLayout();
    });            
});

感谢 Carlos 的 resizeEnd 部分:https://stackoverflow.com/a/12692647/2109254

感谢所有做出贡献的人。

希望这可以帮助其他人。

问候,

斯科特

【问题讨论】:

  • 100% 是相对于整个 body 元素而不是剩余空间计算的,在前 3 个元素占据了它们的空间之后!
  • height:auto 对你有用吗?
  • 没有自动没有工作...
  • 我想要做的是 content 元素占据 body 元素剩余空间的 100%,所以我可以将项目放入其中并让它们占据 100% 的剩余空间...

标签: html css kendo-ui height splitter


【解决方案1】:

编辑

This 将提供您正在寻找的布局,在包装内容中使用 display:table-row。

html {
    height:100%;
    padding: 0;
    margin: 0;
}
body {
    height: 100%;
    padding: 0;
    margin: 0;
}
#header {
    background-color:red;
    padding: 0;
    margin: 0;
    display: table-row;
    height:1px;
}
#nav {
    background-color:gray;
    padding: 0;
    margin: 0;
    display:table-row;
    height:1px;
}
#title {
    background-color:azure;
    padding: 0;
    margin: 0;
    display:table-row;
    height:1px;
}
#content {
    background:green;
    padding: 0;
    margin: 0;
    display:table-row;
}
#wrapper {height:100%;width:100%;margin:0;padding:0;display:table}



<div id="wrapper">    
    <div id="header">header</div>

    <div id="nav">Nav</div>
    <div id="title">title</div>
    <div id="content">
        Content
    </div>
</div>

检查您的updated fiddle

您需要元素的包装器,具体取决于您可能想要使用表格 css 属性(显示:表格行等)的特定布局。

<div id="wrapper">    
    <div id="header">header</div>

    <div id="nav">Nav</div>
    <div id="title">title</div>
    <div id="content">
        Content
    </div>
</div>



html {
    height:100%;
    padding: 0;
    margin: 0;
}
body {
    height: 100%;
    padding: 0;
    margin: 0;
}
#header {
    background-color:red;
    padding: 0;
    margin: 0;
}
#nav {
    background-color:gray;
    padding: 0;
    margin: 0;
}
#title {
    background-color:azure;
    padding: 0;
    margin: 0;
}
#content {

    padding: 0;
    margin: 0;
}
#wrapper {height:100%;margin:0;padding:0;background-color:antiquewhite;}

【讨论】:

  • 其实严格来说,不需要包装器。
  • 没错...但是,它仍然是更好操作的好习惯。您不应该使用 body 进行样式设置,恕我直言,包装类可以在标准高度布局中具有您想要的所有填充、边框和边距。
  • 这不起作用。内容元素的高度不是 100%。看这个小提琴,我在上面放了一个 bg 颜色来证明这一点。 jsfiddle.net/codeowl/m5VHp 您在这里所做的只是将所有元素放在一个包装器中并赋予其颜色。它没有解决问题。不过还是感谢您的回复。
  • @user2109254 您没有要求内容元素具有 100% 的高度,如果不滚动,这是不可能的,因为上面已经有其他元素。也许你应该重新考虑并明确你想要的结果。
  • 再次指出:我认为你想要做的,是通过显示为 display: table;height:100% 的包装类解决的,然后将每个包装元素显示为 display:table-row; .这样,您可能有特定的页眉/页脚高度,内容将覆盖所有剩余空间,最高可达 100%
【解决方案2】:

而不是使用 height:100% 使用 height:auto..它会工作..:)

【讨论】:

  • 它不起作用。我正在使用 Chrome 进行测试,并且在 html、body 和 content 元素的任何组合上使用 auto 不会给我 100% 的高度。
  • height:auto 的工作方式是,如果你放内容,它会自动调整,但如果你不放任何东西,它就会保持这样......你必须在里面放一些东西才能使用..或尝试以像素为单位给出高度..
  • 好的,我们同意,高度自动并不能解决问题。感谢您尝试 ;-)
  • 嘿..它的基本 html..如果你会有一大袋塑料..是的,它会像 100% 的高度,但如果你不把它填满里面..它会是什么样子..缩小了,所以这并不意味着袋子没有 100% 的高度,所以..直到你不会填满..没有人能解决这个..对不起,但它是 HTML 的真相..
【解决方案3】:

想想你在做什么。你告诉content 100% 是它的包含元素。这将是body

因此,content 将占据窗口的大小,但您还有其他三个具有高度的 div,因此总内容大小将 = 100%(正文大小)+标题 + 导航 + 标题

如果您想解决这个问题,您可以简单地将内部内容加起来为 100%,然后根据需要调整百分比。看看:

http://jsfiddle.net/9wABW/3/

【讨论】:

  • 是的,我明白现在发生了什么,以及为什么会出现滚动条。我希望有一种简单的方法可以让内容 div 填充剩余空间,而无需滚动条。我不想使用 % 因为我希望标题、标题和导航成为其内容的高度。
猜你喜欢
  • 2010-12-31
  • 2021-08-13
  • 1970-01-01
  • 2014-02-16
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多