创建网页主体边框

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

本文最初发布于 2008年2月25日,但现已完全重写,内容更加全面,并展示了现代技术。

我在 Jon Hick 的网站 Hicksdesign 上第一次看到了“主体边框”的概念。在这种情况下,它是一种非常微妙且美观的特效。

主体边框的特征

  • 环绕整个浏览器窗口,无论屏幕尺寸如何,都粘附在边缘
  • 页面滚动时,所有边框都保持原位
  • 页面滚动时,内容位于边框下方

查看演示

方法 1:四个 div

实现此效果并具有最广泛的跨浏览器兼容性的方法是使用四个元素。Hicksdesign 就是这样做的,它使用了四个<b>元素,并在 HTML 注释中写道

我使用 b 标签边框是因为它只是视觉效果,没有实际意义,所以我也可以使用我能找到的最小标签。

无论如何,这都是表现层标记,并不理想。我们将在这里使用一个 div

<div id="left"></div>
<div id="right"></div>
<div id="top"></div>
<div id="bottom"></div>

然后我们使用 CSS 进行样式设置。一些属性由所有元素共享,一些仅由顶部/底部和左侧/右侧共享,一些则独一无二。以下是一种干净的编码方式,避免不必要的重复属性。

#top, #bottom, #left, #right {
	background: #a5ebff;
	position: fixed;
	}
	#left, #right {
		top: 0; bottom: 0;
		width: 15px;
		}
		#left { left: 0; }
		#right { right: 0; }
		
	#top, #bottom {
		left: 0; right: 0;
		height: 15px;
		}
		#top { top: 0; }
		#bottom { bottom: 0; }

这在 IE 7 及更高版本以及几乎所有其他良好的桌面浏览器中都应该可以正常工作。对于不支持固定定位的 IE 6,我们将使用头部中的条件注释将其删除(没有害处也没有好处)

<!--[if lte IE 6]>
	<style>#top, #bottom, #left, #right { display: none; }</style>
<![endif]-->

我们还应该在小屏幕(可能是移动设备)上将其删除,这些屏幕也不处理固定定位

@media 

/* Fairly small screens including iphones */
only screen and (max-width: 500px),

/* iPads */
only screen and (min-device-width: 768px) and (max-device-width: 1024px) 

{
	#top, #bottom, #left, #right { display: none; }
}

因此,现在我们可以在我们想要的地方获得效果,而不是在不想要的地方获得效果

方法 2:伪元素

在上面的示例中,我们需要四个唯一的元素来完成这项工作。但这比我们文档中语义上合适的元素多四个。理想情况下,我们应该使用零个。好吧,你可能知道,有两个元素的大小已经与浏览器窗口相同,即<html><body>元素。在这些元素上使用 :before 和 :after 伪元素,我们就得到了四个!

我们将使用与上面相同的属性和值,只是我们将使用

html:before, html:after, body:before, body:after {
    content: "";
    position: fixed;
    background: #a5ebff;

    /* etc. */
}

Harry Roberts 也提出了这个想法,并在 CSS Wizardy 上发布了它

虽然 伪元素的浏览器支持 非常好,但不如方法 1 好。更大的问题是存在一个 WebKit 错误,即 html 元素伪元素上的背景会溢出到整个视口中。这使得暂时无法在 html 元素上使用伪元素。

但有一个解决方案!同时保持语义!

我们实际上不需要四个唯一的元素,我们只需要两个。顶部和底部需要是唯一的,这样它们才能具有固定位置并且不会滚动。对于左侧和右侧,我们实际上只需在<body>上使用一个border

body:before, body:after {
    content: "";
    position: fixed;
    background: #900;
    left: 0;
    right: 0;
    height: 10px;
}
body:before {
    top: 0;
}
body:after {
    bottom: 0;
}
body {
    border-left: 10px solid #900;
    border-right: 10px solid #900;  
}

相同的效果,浏览器支持略少,语义性更强。

查看演示

趣味:Kottke.org 网页主体边框

Jason Kottke 的 Kottke.org 有一个非常酷的网页主体边框效果。

它使用八个不同的元素和八个不同的图像 (!) 来实现这一点。因为这种边框样式不会固定在视口的顶部和底部(只是内容的顶部和底部),所以使用 CSS3 实际上很容易实现。

我们将对<body>元素使用box-shadow,以及它逗号分隔多个阴影的巧妙功能。以下是它的全部内容,以及

body {
	padding: 40px;
	overflow-x: hidden; /* For Opera */
	-webkit-box-shadow:
		inset #19d4ff 0 0 0 5px,
		inset #18cdf7 0 0 0 1px,
		inset #53dfff 0 0 0 10px,
		inset #50d8f7 0 0 0 11px,
		inset #8ce9ff 0 0 0 16px,
		inset #88e2f7 0 0 0 17px,
		inset #c5f4ff 0 0 0 22px,
		inset #bfecf7 0 0 0 23px;
	-moz-box-shadow:
		inset #19d4ff 0 0 0 5px,
		inset #18cdf7 0 0 0 1px,
		inset #53dfff 0 0 0 10px,
		inset #50d8f7 0 0 0 11px,
		inset #8ce9ff 0 0 0 16px,
		inset #88e2f7 0 0 0 17px,
		inset #c5f4ff 0 0 0 22px,
		inset #bfecf7 0 0 0 23px;
	box-shadow:
		inset #19d4ff 0 0 0 5px,
		inset #18cdf7 0 0 0 1px,
		inset #53dfff 0 0 0 10px,
		inset #50d8f7 0 0 0 11px,
		inset #8ce9ff 0 0 0 16px,
		inset #88e2f7 0 0 0 17px,
		inset #c5f4ff 0 0 0 22px,
		inset #bfecf7 0 0 0 23px;
}

错误提示:Opera(Mac,11.10)存在一个奇怪的错误,它会扩展元素的大小以适应外部的阴影(即使阴影是内嵌的)。由于我们将其用于全宽的 body 元素,因此这会触发不需要的滚动条。可以通过隐藏 overflow-x 来隐藏水平滚动条。但不幸的是,屏幕底部仍然会有一点空间。

虽然这在所有涵盖的内容中浏览器支持最少,但还不错:IE 9+、Fx 3.5+、Opera 10.5+、Chrome 任意版本、Safari 3+

查看演示