代码之家  ›  专栏  ›  技术社区  ›  eyelidlessness

CSS中的复杂高度

css
  •  3
  • eyelidlessness  · 技术社区  · 16 年前

    在我解释我要做什么之前,请注意,我很幸运只需要瞄准Webkit(也就是说,我可以使用很多简洁的CSS)。

    所以,基本上,我想有一个高度灵活,位置固定,最大高度是可用窗口高度的块,在块的顶部和底部有一些始终可见的元素,在中间有一个自动溢出的区域。基本上是这样的:

    ----------------------
    | Top item  |        |
    |           |        |
    |   stuff   |        |
    |           |        |
    |           |        |
    | Last item |        |
    |------------        |
    |                    |
    |                    |
    ----------------------
    
    ----------------------
    | Top item  |        |
    |-----------|        |
    |  lots   |^|        |
    |   of    |_|        |
    |  stuff  |_|        |
    |         | |        |
    |         | |        |
    |-----------|        |
    | Last item |        |
    ----------------------

    可以用CSS完成吗?或者我要用javascript破解它?我愿意接受一点,如果这就是使这项工作更好的原因,比试图解释每一个愚蠢的小事情,如回流和窗口调整,以及所有这些胡说八道。

    我已经准备好了这个坏消息,这不是CSS可以做的,但我已经被一些人的魔法惊喜,所以可以工作之前。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Chris Serra    16 年前

    这看起来像你的 ticket

        2
  •  1
  •   eyelidlessness    16 年前

    好吧,我想出来了,我使用了一点javascript,但是如果这是跨浏览器的话,就没有必要这么复杂了。我会把答案贴出来,以防有人关心。

    Markup:

    <div class="complex-height">
        <div class="top"><!-- stuff --></div>
        <div class="middle"><!-- stuff --></div>
        <div class="bottom"><!-- stuff --></div>
    </div>
    

    CSS:

    .complex-height {
        position: fixed;
        top: 0;
        left: 0;
        max-height: 100%;
        width: 300px; /* Can be whatever, but must specify a width */
        overflow: auto;
    }
    .complex-height .top, .complex-height .bottom {
        width: 100%;
        position: absolute;
        z-index: 2; /* make sure they overlap the center */
    }
    .complex-height .top {
        top: 0;
    }
    .complex-height .bottom {
        bottom: 0;
    }
    

    javascript(假定是原型,但是直接编写或编写到另一个lib中很简单):

    $$('.complex-height .middle').each(function(middle) {
        middle.setStyle({
            paddingTop: middle.up('.complex-height').down('.top').getHeight() + 'px',
            paddingBottom: middle.up('.complex-height').down('.bottom').getHeight() + 'px'
        });
    });
    $$('.complex-height').invoke('observe', 'scroll', function(e) {
        this.down('.top').setStyle({
            top: this.scrollTop + 'px'
        });
        this.down('.bottom').setStyle({
            bottom: (0 - this.scrollTop) + 'px'
        });
    });