我最近需要为一个网站制作一个占位符页面。我希望徽标图像精确地位于屏幕中央,也就是水平和垂直居中。我很快想到,只需给图像元素添加一个名为“centered”的类,然后设置该类的样式即可。
.centered {
position: fixed; /* or absolute */
top: 50%;
left: 50%;
}
但是,正如您所想,这并不完全有效。这样做只是将图像的左上角精确地放在页面中央,而不是将图像的中心放在页面中央。
为了使图像完全居中,只需应用一个等于图像高度一半的负上边距,以及一个等于图像宽度一半的负左边距即可。例如,如下所示:
.centered {
position: fixed;
top: 50%;
left: 50%;
margin-top: -50px;
margin-left: -100px;
}
这样就可以解决问题了。
当您知道要居中对象的尺寸时,此方法效果很好。如果您不知道,或者认为尺寸可能会发生变化并希望使其具有前瞻性,请尝试以下方法:
.centered {
position: fixed;
top: 50%;
left: 50%;
/* bring your own prefixes */
transform: translate(-50%, -50%);
}
transform
的 translate
值基于元素的尺寸,因此这样可以很好地居中。
是的,没错,但在 IE6 中不起作用,您可能知道,因此您应该使用
* html .centered { position:absolute }
,因为 IE6 有一个错误,导致它在 Quirks 模式下将 position:absolute 作为 position:fixed 使用。您还可以使用更复杂的技巧,例如 ie-fixed.htc。如果我的“要居中的对象”使用百分比表示呢?或者我不知道它的高度是多少(流体高度)?
很棒的文章,我一直在寻找这个技巧。谢谢。
我也是..谢谢 Chris!
@Mariusz:是的,这正是确保它在 IE 6 中正常工作所需的,感谢您指出这一点。
@Cosss:那就不那么容易了。此技巧只是为了居中一个简单的图像徽标。您始终可以为其设置一些上边距,并使用以下方法将其水平居中:
margin: 20px auto;
或者您可以使用支持垂直居中的表格。或者可能也存在 JavaScript 解决方案。
@Jochen:太好了,很高兴这篇文章对您有所帮助!
太基础了。
不错的提示,可能会派上用场。一个优秀的开发者应该像您一样想出这个方法。
@Cosss 和 Chris
相反,难道不应该更容易吗?
我的意思是,如果您的宽度为 20%,则其一半为 10%,50% – 10% = 40%,因此请按如下方式设置:
left: 40%;
width: 20%;
这在我看来是合理的,但我现在有点困了,所以谁知道呢。
@David:是的,您是对的,如果对象的宽度是百分比,只需将“left”设置为剩余百分比的一半即可。例如,left 百分比 =(100 – width 百分比)。
但是,垂直居中一个流体高度的对象则比较困难。这几乎只是表格的范畴。
Chris,
此技巧并不是居中对象的可靠方法;我过去常常通过组合 left/top 和 margin-left/margin-top 来居中较大的块,直到有人发现关于此方法的一个可怕的事实。
例如,在一个更大的框中
#centered
{
width:900px;height:400px;
left:50%;top:50%;
margin:-200px 0 0 -450px;
border:1px solid #000;
position:fixed;
}
* html #centered { position:absolute;} /* 正如 Mariusz 所注意到的 */
如果您尝试将窗口宽度缩小到小于 900px 的某个尺寸,则框的左右部分将随着窗口尺寸的减小而被窗口覆盖(如果您垂直缩小窗口尺寸,也会发生同样的情况)。
并且无论您是在 FF、IE、Safari 还是 Opera 上测试,滚动条都将不可见;存在一个有意义的解释。
在大于对象尺寸的窗口中,中间的 x 和 y 点位于等于或大于对象边距的位置。
示例
窗口尺寸:1000 x 600
中心点:500 x 300
我示例中的对象边距:-450 x 200
————————————————————————
对象的定位:50 x 100
但是,在狭窄的窗口中…
示例
窗口尺寸:700 x 600
中心点:350 x 300
对象边距:-450 x -200
——————————————————–
对象的定位:-100 x 100,导致负定位。
尽管如此,对于小型对象来说,这仍然是一个不错的技巧。
@Hudson Tavares:您说得对,如果您的窗口尺寸缩小到小于要居中对象的尺寸,则不会出现滚动条。查看此示例:
https://css-tricks.cn/examples/CSSCentering/
我也理解您所说的最终会出现负定位,因为您可以将窗口缩小到足以使内容从边缘消失,而无法滚动到该内容的程度。我认为,如果任何人的浏览器窗口缩小到 500px 宽左右,他们就知道自己在做什么,并且知道内容页面不适合以这种方式查看。
如果您正在处理内容居中,我认为使用水平居中和静态垂直定位是一种更健康的方法。
我一直在使用 50%/50% 的 CSS 定位,但最终遇到了 Hudson 遇到的相同问题……在较小的浏览器窗口尺寸下,网站顶部会被切掉。我在网站上已经使用了 JavaScript/jQuery,因此只需编写一个在加载和调整大小时调用的函数即可。希望有一种方法可以使其仅使用 CSS 就能工作。
function setCenter(whichDiv) {
var newX = ($(window).width() - $(whichDiv).width())/2;
var newY = ($(window).height() - $(whichDiv).height())/2;
if (newY
我是一个试图理解 CSS 的新手。我喜欢这个技巧,但它似乎只适用于在浏览器中居中的徽标或其他内容。但是,我有一个使用“div”标签形成的框,我试图将图像居中到该框中。此技巧将图像从我的框中取出并在浏览器中居中。有没有办法将图像保留在我的框中,并在框中而不是在浏览器中居中?
@Joe Porritt:您是否知道放置图像的 div 的宽度?如果您知道,则始终可以通过该类为图像添加一个类,然后通过该类应用一些左边距来将其居中。如果您不知道,则实际上可以使用 text-align 来居中图像,因为默认情况下图像为内联级元素。
不要被诸如 <center> 之类的已弃用标签所诱惑。这只是一个坏习惯 =P
这修复了滚动条
http://exanimo.com/css/vertical-centering-with-a-floated-shim/
很棒的文章,我一直在寻找如何做到这一点。
到目前为止,我做了类似的事情
margin: 0 auto;
但我不确定这是否是最佳方法。
好的,让我们更上一层楼
我可以在中间居中两个框(不同颜色),左侧框向左重复,右侧框向右重复……并且它们始终保持居中,真正的中心?
棒棒棒!
我发现了另一个不错的技巧
.centered-horizontal
{
left:-50%;
position:relative;
}
简单、快速,正是我需要的,谢谢!
在 div、外部或任何您想要的位置都能完美工作..但在 IE8 中至少您需要声明 !doctype 才能正常工作。
不客气:)
感谢您的网站以及您所做的一切。当我在很多场合遇到难题时,这个网站都证明对我有很大帮助。您的工作激励着我的工作变得更好。
实际上,我发现使用表格是实现此目的的最佳方法。它在所有浏览器(甚至IE)中都能正常工作。此外,这样您就不需要知道图像的大小。
我使用 jQuery 来确定 margin-top 和 margin-left.. 它可以完美地居中动态元素。
似乎没有人注意到您图表上的数字颠倒了。(您将
top:
放在左右箭头的位置,反之亦然)试试
CSS
HTML
有趣的DOM。Chris Coyier 的代码是 CSS 入门级。不响应式。
要注入 CSS 代码…
left:50%; top:50%;
left: -0.5(objectwidth); top: 50%(objectheight) ? ?
我们如何使用 CSS 编写相对于宽度/高度 50% 的代码?
响应式很棒(也许不是我),但可以将其作为起点。
left、margin-left 和 width 之间存在三角函数关系。
由浏览器对高度-宽度比率的动态平衡的掌控所实例化。
所以逻辑大声疾呼,“这里有一个钥匙孔!”
background-size: auto; left: 50%; margin-left: -12.5%; width: 25%;
…好吧,这太神奇了!!
如果每个图像都正好是 50%,那就有点无聊了。推断?
更像是漏斗标记。适合钥匙孔,而不是钥匙。有什么想法吗?
报告一个难题,阐明难以捉摸的术语“响应式”。此 50% 模型的一个缺点:放大和缩小时,50% 的图像大小保持不变,而其他所有内容都会放大和缩小。虽然在浏览器窗口大小变化时居中且动态,但此图像并不“响应式”,不尊重设备缩放技术。当设备放大以增大字体时…字体自适应在容器内部部署相对动态宽度:100%。
我们很想知道 Chris 如何围绕我们的半尺寸奇迹来表达他的说法,比如在他上面主题的扩展中。抱歉连发帖子,发现很令人兴奋。我现在把这留给你们所有人。