【发布时间】:2016-12-13 00:36:52
【问题描述】:
我正在进行响应式设计,我在顶部有一个 ID div,在页面的其余部分,我应该在页面的每个角落都有 div 按钮(即,我应该有 2x2 div ,每行并排两个 div,第一行与页面顶部对齐,第二行与页面底部对齐)- 在横向视图中。 (在Placing 4 html elements in every corner of a div 中讨论了类似的内容,但我无法找到如何将该解决方案应用于我的示例)。
在纵向视图中,按钮的宽度应该大约是视口宽度的大小,并且它们应该在彼此下方。我想出了以下示例:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<script type="text/javascript">
</script>
<style type="text/css">
html, body {
margin: 0;
padding: 0;
}
.testbtnholder {
border: 2px solid gray;
width: calc(100% - 1em);
height: calc(100% - 2em);
position: relative;
margin-top: 0px;
margin-left: 1em;
margin-right: 1em;
margin-bottom: 1em;
}
.testbtn {
border: 2px solid #FF9999;
width: calc(50% - 1em);
height: 5em;
/* line-height: 5em; // does vertical align to middle, but only for single-line text; http://phrogz.net/css/vertical-align */
position: absolute;
text-align: center;
/* top: 50%; margin-top: -2.5em; // should do vertical align to middle, but it doesn't */
}
@media all and (orientation:landscape) {
.testbtn:nth-child(even) {
right: 0;
}
/*nth-last-child(-n+2) - select 2 last items from the parent*/
.testbtn:nth-last-child(-n+2) {
bottom: 0;
}
}
@media all and (orientation:portrait) {
.testbtn {
position: relative;
width: calc(100%);
}
}
#dreport {
font-size: 0.76em;
}
</style>
</head>
<body>
<div id="dreport">Test text</div>
<div class="testbtnholder">
<div class="testbtn">Test <br/> one</div>
<div class="testbtn">Test two</div>
<div class="testbtn">Test three</div>
<div class="testbtn">Test <br/> four</div>
</div>
</body>
</html>
这个横向示例在 Chromium 48 中有些工作,但在 Firefox 50 中失败(下图,左图是 Chromium,右图是 Firefox):
(事实上,如果我在 HTML 的开头添加 <!DOCTYPE html>,Chromium 也会产生与 FF 相同的错误布局!)
我的问题/疑问是:
- 即使我将
html和body的边距/填充设置为 0,然后为margin-left和margin-right显式设置.testbtnholder,在 FF 和 Chromium 中我都会得到某种左边距“推动”布局的其余部分,因此出现滚动条。如何显式设置边距,这样我就不必依赖overflow:hidden;来隐藏滚动条(因此.testbtnholder的边框在页面中水平居中显示)? - 我希望 div 按钮中的文本水平和垂直居中;我已经使用
text-align: center实现了水平居中,但无法让垂直居中(使用vertical-align: middle)工作 - 如何让 Firefox 渲染与 Chromium 相同的图像(FF 渲染问题可能在 Positioning problems in Firefox? position:relative for a display:table element 中描述)
- 有没有比我这里采用的更好的布局方法?例如,根据方向将
absolute的位置切换到relative对我来说似乎有点骇人听闻,那么使用弹性盒布局会更好吗?我看过https://css-tricks.com/snippets/css/a-guide-to-flexbox/,但现在对我来说有点太多了 - 所以如果 flexbox 在这里更适用,我该如何重写这个例子的 HTML/CSS 来使用 flexbox?李>
否则,在纵向模式下,布局通常可以正常工作(除了边距问题):
【问题讨论】:
-
首先,从 HTML 中取出
<style>内容并将其放入 CSS 文件中,然后您可以从 HTML 标头调用。 -
谢谢@Martin - 但据我所知,如果 CSS 包含在 HTML 中,或者在单独的文件中,渲染应该没有区别?我把它们放在一起,所以这个例子可以只用一个文件来复制......