假设您想要创建一个这样的布局
这很合理,对吧?尤其是在您的文章是关于猫咪喜欢成为关注的中心时。明白了吗?!(小猫来自 PlaceKitten)。
但这并不容易实现。我们当前的布局方法并非为此而设计。事实上,有时它们感觉并没有考虑到“网页设计”。我说的对吗?即使是最前沿的 CSS 布局系统,我认为也无法很好地处理这种情况。这有点像 float
,因为文本环绕图像,但文本从两个方向环绕,因此它有点像 float: center;
或 float: both;
,而它们并不存在。
但这是可行的!证明
我们将通过使用浮动伪元素占位符来实现它。我们将在每一列文本1中放置一个,一个浮动到左侧,一个浮动到右侧。伪元素的高度应与图像相同,宽度的一半(或多或少……请记住,您需要一些填充,并且还需要考虑间距)。
本质上
#l:before, #r:before {
content: "";
width: 125px;
height: 250px;
}
#l:before {
float: right;
}
#r:before {
float: left;
}
现在文本中出现了一个空洞,可以将我们的图像放置在那里。我们可以通过在那里绝对定位它来实现,就像在演示中一样。或者您也可以将其保留在上面的某个元素中,居中,并使用列上的负顶部边距将文本向上拉。
1 注意,我们使用 div 作为文本列,而不是 CSS 列,后者会更酷且更具语义化,但它不会发生。
哦。很棒的小技巧,而且与众不同。更有意义,而且鉴于越来越多的人购买具有更大屏幕的新型电脑或其他人想要杂志式布局以及与常见单块文本略有不同的东西,我一直在使用更多列样式布局。
感谢这个很棒的小技巧!看起来很棒,而且实际上也更自然!
这太棒了!您会认为规范中应该有一些东西可以更直观地做到这一点。在某些方面,它让我想起了围绕图像环绕文本的沙袋 div 技术。
我最喜欢的“float: center;”技巧是将元素设置为“display: inline-block;”,并将它的父元素设置为“text-align: center;”。它没有与本示例完全相同的行为,但它是一种非常有用的技巧。
非常有趣
谢谢
克里斯又回到了真正的 css 技巧!谢谢,学习新技巧总是很愉快。
非常巧妙.. 可用于广告,谢谢
我的天哪,它在 ie 5.5 中不起作用!!!!!!!!!!!!! ASFASDASFASFADSDSF!
(不错的提示 ;) )
不过,很酷的是它应该可以在 IE 7 及更高版本中运行,就巧妙的技巧而言,这已经相当不错了。
说真的,哪个客户让你支持 IE5.5?仍然有 Windows 95/98 的客户吗?
^讽刺。
绝对是一个可靠的技巧。为了实现如此简单的事情而不得不如此大费周章,这真是荒谬。我想我们必须等到 CSS4……。
你还在用 IE5.5 吗?……
我认为很难在文本中表达讽刺 ;-) 不过克里斯,这是一个很棒的技巧,我会尝试一下。谢谢
我最喜欢的就是这些东西,有趣的解决方法,有意义且有坚实的基础。不错 :)
呵呵,我永远也想不到。
只要有耐心,你就能获得更有趣的浮动效果
http://rmcreative.ru/blog/post/slozhnoe-obtekanie-tekstom
这非常酷,古老的 shim 技术。某种程度上,“重点”在于伪元素意味着代码保持几乎完美的语义,不需要额外的元素。
我不知道有多少次我看到有人试图使用 float:center - 您会认为在看到它几次无法工作后他们会停止。所以,这个标题引起了我的注意 :)
感谢您的提示!伪选择器非常棒,我喜欢看到关于如何使用它们的各种想法。
嘿,克里斯,
我不会在标记中包含图像,因为它会破坏 IE6/7。相反,我将使用它来为两个伪元素设置背景图像。这样,您就可以获得相同的效果并获得不错的“回退”(因为图像不会与内容重叠)。
嗨,克里斯,很棒的技巧。令人惊叹的一个 :)
您的网站恰如其分地命名为 CSS-Tricks,展示了整个 WWW 中令人惊叹且最稀有的技巧。
嘿,克里斯,
我之前必须实现“float: center”外观,并且它必须在 IE6 上运行,因此我使用了间隔图像而不是伪元素 - 坦白地说,我从未想过这一点。
如果我再次收到此类请求,我将更新 我的方法!
干杯,
嘿,谢谢,克里斯。我对此感到非常兴奋!!!也许是我的印刷背景一直让我渴望这种能力,但我尝试过以多种方式实现“居中浮动”,但始终失败。
干杯 -
喜欢!赋予“杂志版式”一词新的含义。;-)
这看起来像个好主意。我在实现方面有一个问题
当您有多个要居中的元素时,是否需要在您的样式表中使用类似以下内容,并为每个元素使用唯一的调用?
#element1 #left:before, #element1 #right:before { content: “”; width: 225px; height: 250px; }
#element2 #left:before, #element2 #right:before { content: “”; width: 225px; height: 250px; }
感谢您的建议。
~杰夫
如果大小要求不同,实际上更有意义
#element1 #left:before, #element1 #right:before { content: “”; width: 225px; height: 250px; }
#element2 #left:before, #element2 #right:before { content: “”; width: 100px; height: 150px; }
抱歉,我无法编辑我之前的评论……所以这里还有另一个更新以适应“居中浮动”多个元素
对于多个元素,您不能使用重复的 ID,而必须使用类,因此这应该可以工作
#element1 .left:before, #element1 .right:before { content: “”; width: 225px; height: 250px; }
#element2 .left:before, #element2 .right:before { content: “”; width: 100px; height: 150px; }
非常巧妙!!它是 IE 兼容的吗?
它并非完全兼容 IE。我刚刚测试过。
IE8 和 IE9 运行良好。
IE7 及更低版本失败……
@克里斯·科伊尔
感谢您的博文。可能以后会用到。
感谢分享,我仍在学习所有这些酷炫的 css 技巧,您的网站很棒!
期待您发布更多文章 :)
这真是一个很酷的技巧。非常简单。当我读到“我们将通过使用浮动伪元素占位符来实现它”时,我就知道你要做什么,但如果没有那个“触发器”,我永远也不会想到这种方法。事实上,我从未想过这样的“问题”。
非常棒的工作!
很喜欢这个效果,并且尝试(不成功)为 IE7 及更低版本浏览器重现这种外观。我曾以为包含 Dean Edward 的 IE7.js 会解决这个问题,但目前它似乎在 :before 和 :after 选择器上存在问题,所以没有成功。
我会继续努力,如果我有什么进展会在这里更新。
看起来 jQuery 解决方案是最佳答案——无论是通过 API (https://api.jqueryjs.cn/before/ 和 https://api.jqueryjs.cn/after/) 还是这个插件 http://jquery.lukelutman.com/plugins/pseudo/。
也许更好的方法是简单地包含 IE7 及以下的特定样式表,这些样式表可以修正无法支持这些选择器的浏览器的布局。
您可以用间隔图像或空白标签替换伪元素,因为 IE7 及更低版本不支持 :before、:after 伪元素。这是一个 使用间隔图像的示例。
干杯,
感谢 Fabien,但当您需要与 CMS 集成并依赖于客户端插入大量额外元素时,该解决方案效果不佳。我想我仍在寻找适用于旧版浏览器的完美基于 CSS 的解决方案!
我希望我们可以使用 column-count CSS 属性来实现这一点。
非常酷,Chris。我可以看到很多我想实施此功能的机会。
我按照您的说明和代码操作,并成功地完成了第一次尝试;一旦我弄清楚如何在此处包含图像,我就会分享其屏幕截图。
感谢您分享这个很棒的概念和清晰的解释。
我刚刚偶然发现了完全相同的问题——一周前;)
我想知道如何在 CMS 模板中构建它。
非常感谢。我会测试一下,但我相信它会起作用;)
嗨!
我们就在上周遇到了这个问题。我的一个同事想做类似的事情,我告诉他这是不可能的。
但是现在,当我看到问题的解决方案时,它似乎比我预期的更容易解决!
非常感谢! :)
我按照您的说明和代码操作,并成功地完成了第一次尝试;一旦我弄清楚如何在此处包含图像,我就会分享其屏幕截图。
非常棒的想法~~~~
很棒的技巧,但我希望它能使用 css3 columns。好吧。
很棒的技巧!“float: center;” 一直是我的梦想。这效果非常好。谢谢!
这个看起来不错。
不过,有一件事我不明白,为什么他们不直接创建一个 float:center 的 css 呢?
非常酷也很实用!
那么 :before 是否创建某种指定宽度和高度的虚拟 div 呢?
因为从我理解的示意图来看,创建的 :before 区域就像具有“display:block;”… 的元素一样。浏览器是否将其视为这样?
它不是 DIV,但没错,它是一个通用的块级元素。(而且它之所以是块级,是因为将其浮动会自动使其成为块级,否则它将是内联的。)
它支持 IE6 和 IE7 吗?
不错的想法,将来我可能需要用到,谢谢。
这很巧妙,谢谢,我会试一试 :)
哦,非常方便……目前来说!
您绝对应该查看 box-pack:center,这是实现此目的的另一种方法:https://mdn.org.cn/en/CSS/-moz-box-pack
IE6-7 不支持 :before,这就是我们需要针对 Microsoft 优化此示例的原因 :)
例如,使用一些带有 js 表达式的特殊技巧
不需要,只需向他们展示一个简单的版本,其中图像位于左上角,然后继续即可。
我喜欢它!我不是一个硬核程序员,但我的理解正确吗,这是一个仅限 css3 的技巧?
创建效果的非常棒的技巧……
哎呀!o_O
感谢您的提示。
很棒的技术,Chris!我在我的博客上写了一个变体 文章:它使用
display: table-cell
创建列,从而简化了 CSS 和标记。感谢您的技巧!如果我想实现与此相反的效果(即 2 张图片中间有文字),我可以使用以下方法,我的理解正确吗?
此示例中提到的图片很蠢。
也许我正在使自己陷入比实际更困难的境地
这仅仅是众多 CSS 技巧中的一种,这些技巧使整个 HTML 布局问题比本应有的复杂了一点点。
您不应对困境负责,但也没有帮助我们解决问题。
这个技巧就像把袜子塞进破窗户里。