2017-02-16 94 views
1

我有一个下拉菜单,其位置应该取决于标题的高度。根据视口高度,标题的高度根据内容,媒体查询设置的字体大小和填充而变化。CSS响应绝对定位

HTML:

<header> 
    <p>Example</p> 
    <nav> 
    <a>Link</a> 
    <a>Link</a> 
    <a>Link</a> 
    </nav> 
</header> 

CSS:

body { 
    background-color: white; 
} 

header { 
    background-color: grey; 
    padding: 1rem 0; 
    position: fixed; 
    width: 100%; 
} 

@media(max-height: 500px) { 
    header { 
    padding: 0; 
    } 
} 

nav { 
    background-color: #CCC; 
    position: absolute; 
    top: 82px; 
    width: 100%; 
} 

a { 
    border-bottom: 1px solid white; 
    display: block; 
    padding: 0.75rem; 
} 

想象nav是折出下拉菜单。

小提琴:https://jsfiddle.net/mjufc63b/2/

如果你减少到低于500像素,看起来头和导航之间的白色差距,这不应该是让你的窗口的高度。此外,如果您更改浏览器的字体大小。

有没有解决方案让下拉菜单总是独立于标题的高度,也高于其他内容(绝对定位是什么),而不使用javascript,并且不会移动header以外的nav

+0

的'nav'应自动移动到顶部和缩小差距,而不需要重新定义与保证金媒体查询中的'top'css属性。在这个例子中,我可以这样做,是的,但是如果标题高度因内容的字体大小或高度而改变,我不能定义“顶部”边距。 – Hativ

+0

是的,对不起,我误解了你的问题。你可以检查我的答案。 – Armin

回答

2

设置顶部为100%,媒体查询之外

body { 
 
    background-color: white; 
 
} 
 

 
header { 
 
    background-color: grey; 
 
    padding: 1rem 0; 
 
    position: fixed; 
 
    width: 100%; 
 
} 
 

 
@media(max-height: 500px) { 
 
    header { 
 
    padding: 0; 
 
    } 
 
} 
 

 
nav { 
 
    background-color: #CCC; 
 
    position: absolute; 
 
    top: 100%; 
 
    width: 100%; 
 
} 
 

 
a { 
 
    border-bottom: 1px solid white; 
 
    display: block; 
 
    padding: 0.75rem; 
 
}
<header> 
 
    <p>Example</p> 
 
    <nav> 
 
    <a>Link</a> 
 
    <a>Link</a> 
 
    <a>Link</a> 
 
    </nav> 
 
</header>

+0

不错。我太被媒体查询解决方案困扰了,我忘记了最普通的一个:) – Armin

+0

简单而干净的解决方案..对我感到羞耻。谢谢! – Hativ

+0

@Armin感谢这两个。很高兴它帮助! – vals

3

在媒体查询中查找500px以下的高度,从nav元素中移除固定的顶部边距。

@media(max-height: 500px) { 
    header { 
    padding: 0; 
    } 
    header > nav { 
    top: auto; 
    } 
} 

实际上,您也可以在媒体查询之外进行默认操作。将顶部边距定义为自动。这样,您就不必在意固定值

nav { 
    background-color: #CCC; 
    position: absolute; 
    top: auto 
    width: 100%; 
} 

由于您的header固定它不会推动其他要素,所以为了做到这一点,你需要添加空间内的元素。例如:

header { 
    background-color: grey; 
    position: fixed; 
    width: 100%; 
} 

header p{ 
    padding: 1rem 0; 
} 

如果从header去除填充并把它添加到你的内心p元素,它会推动你nav。但一般来说,为了获得更多的内容,你可以在里面创建一个新的包装元素,作为“空间接受者”。

+0

媒体查询的解决方案有效,但如果'header'的高度被字体大小或内容改变,我需要一个通用的解决方案。您的第二个解决方案将忽略填充底部。请参阅https://jsfiddle.net/mjufc63b/3/ – Hativ

+0

我更新了我的答案。此外,请检查@vals回答替代方案。 – Armin