如何:可调整大小的背景图像

Avatar of Chris Coyier
Chris Coyier

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

如果您正在寻找如何进行全屏背景图像,请点击此处

我的朋友 Richard 最近向我提出了一个简单的 CSS 问题

有没有办法使背景图像可调整大小? 就像,用图像填充网页的背景,无论浏览器窗口的大小如何。 同时,让它随着浏览器窗口的变化而变大或变小。 同时,确保它保持其比例(不会奇怪地拉伸)。 同时,不要产生滚动条,如果需要,只需垂直裁剪。 同时,在页面上作为内联 <img> 标记出现。

,这是一个很高的要求。 我的第一个想法是……嗯,没有。 但这当然正是我喜欢的那种挑战,所以我开始思考。 最终,我找到一个非常好的解决方案,我们把它变成了一个非常棒的小项目。 首先,查看完成的项目,然后我将向您展示它是如何完成的

完成的项目: 天气如何? 离线

resizeablebackgroundimage

继续调整您的浏览器窗口,并注意图像将如何调整大小以适合。 它不会“动态”地进行,但它确实有效。 它也满足了所有其他要求:没有滚动条,并且保留了像素比例。

第一次尝试

嗯,我的第一个想法是,这确实需要是一个 CSS 背景图像。 如果图像足够大,它将填充屏幕边缘到边缘。 它也可以居中,所以我认为这已经足够好了。 较大的浏览器窗口将显示更多图片,较小的窗口将显示更少的图片。 如果应用于 body 标签,它将很好地填充屏幕,不会出现滚动条。 我认为这是一个相当好的解决方案,即使它不是技术上可调整大小的,因为您不能设置 CSS 背景图像的大小。 以下是我的第一次尝试方法。

<head>
	....
	<script type="text/javascript" src="js/jquery.js"></script>
	<script type="text/javascript">
	$(document).ready(function() { 
		$("img.source-image").hide();
		var $source = $("img.source-image").attr("src");
		$('#page-body').css({
			'backgroundImage': 'url(' + $source +')',
			'backgroundRepeat': 'no-repeat',
			'backgroundPosition': 'top center'
		});
	}); 
	</script>
</head>
<body id="page-body">
	<img class="source-image" src="images/image.jpg" alt="" />
</body>

你猜对了,jQuery。 上面的代码将隐藏页面上的图像,但会获取它的“src”属性并将其作为背景应用于 body 元素(通过其唯一的 ID“page-body”)。 查看一个实际操作的示例

 

第二次尝试(更好)

虽然第一次尝试做得不错,但它在最基本层面上失败了:它不是“可调整大小的”。 所以是时候进行另一次尝试了。 为了控制显示在屏幕上的图像大小而不改变文件本身,就是使用 <img> 标签将其内联显示。 使用 img 标签,我们可以设置“width”和“height”属性来控制图像的大小。 如果我们能获取浏览器窗口的精确像素宽度,我们就可以在图像的 width 属性中使用该数字并控制其大小,同时保留比例。

我们可以再次使用 jQuery 和 尺寸插件 来获取浏览器窗口的宽度。 然后,我们将使用该数字来设置图像的 width 属性,我们将为其提供一个唯一的类名“source-image”。 我们需要在 DOM 准备就绪时立即执行此操作,这样它会在图像开始加载之前发生。 我们也可以在窗口调整大小的任何时候执行此操作(FTW)。 以下是操作方法

<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/jquery.dimensions.js"></script>
<script type="text/javascript">
	$(document).ready(function() { 
		var $winwidth = $(window).width();
		$("img.source-image").attr({
			width: $winwidth
		});
		$(window).bind("resize", function(){ 
			var $winwidth = $(window).width();
			$("img.source-image").attr({
				width: $winwidth
			});
		 });
	}); 
</script>

为了让这个内联图像更像背景图像,我们可以使用应用于它的唯一类名来应用一些绝对定位。

img.source-image {
	position: absolute;
	top: 0;
	left: 0;
}

由于这种绝对定位,您想要放在它上面的任何内容也需要定位和更高的 z-index 值。 如果您的源图像特别高,或者您的浏览器窗口特别宽,图像很容易比您的浏览器窗口更高并强制出现垂直滚动条。 为了防止这种情况,只需将 body 上的 overflow 值设置为 hidden

body {
  overflow: hidden;
}

第三次尝试(最佳)

忘记这个 javascript 业务吧! 由于 Anders 的评论指出了 Stu Nicholls 的版本,这里有一个更好的方法来处理它,而无需任何 javascript!

由于我们已经在图像上拥有一个唯一的类名,图像已使用绝对定位,并且滚动条问题已解决,那么我们只需使用百分比直接在 CSS 中设置宽度

#img.source-image {
  width: 100%;
  position: absolute;
  top: 0;
  left: 0;
}

查看实际操作的演示。 这是迄今为止最好的解决方案,因为调整大小是动态发生的,以获得流畅的感觉,并且不依赖于任何 javascript。

关于 WhatsTheWeather.net 的更多信息

我只为 天气如何 (2013 年 11 月更新:现已离线) 做了简单的设计,但 Richard 做了所有很酷的编码才能使其正常运行。 据我了解,它是一系列 3 个不同的 API。 它首先获取您的 IP 地址并使用 API 将其转换为城市和州。 然后它使用一些天气 API 来获取当前天气。 然后它使用 Flickr API 来获取与天气相匹配的标签的随机图像。 如果它无法获取您的邮编,它会要求您提供,就像在 iPhone 上一样(它也会自动检测并进行略微不同的处理)。 所有这些都使用 Ruby on Rails 完成。 相当花哨的舞蹈!