21

对齐图标(左)和文本(右)或左边的相反文本和右边的图标的最佳方法是什么?

图标图像和文本是否必须相同大小?理想情况下,我希望它们不同但垂直对齐。

我正在使用 background-position css 属性从更大的图像中获取图标。

这是我现在的做法,但我正在努力让它们在同一条线上或垂直对齐到底部。

文本

这是我尝试您的建议后得到的。

虽然文本现在与图标对齐,但它叠加在我想要的图标右侧的图标上。请注意,我正在使用背景位置来显示更大图像集中的图标。

基本上我得到

<icon><10px><text_and_unwanted_icon_to_the_right_under_it>
<span class="group3_drops_icon group3_l_icon" style="">50</span>

group3_drops_icon {
background-position:-50px -111px;
}

.group3_l_icon {
-moz-background-clip:border;
-moz-background-inline-policy:continuous;
-moz-background-origin:padding;
background:transparent url(/images/group3.png) no-repeat scroll left center;
height:35px;
overflow:hidden;
padding-left:55px;
}
4

3 回答 3

37

我通常使用background

<style type="text/css">
.icon {
background-image: url(path/to/my/icon.jpg);
background-position: left center;
background-repeat: no-repeat;

padding-left: 16px; /* Or size of icon + spacing */
}
</style>

<span class="icon">Some text here</span>
于 2010-06-23T23:38:41.083 回答
27

您可以使用 vertical-align 和 line-height 在同一行上执行此操作

<p style='line-height: 30px'>
  <img src='icon.gif' style='vertical-align: middle' />Icon Text
</p>

或者,您可以使用无重复和定位的后台方法:

span.icontext {
  background: transparent url(icon.gif) no-repeat inherit left center;
  padding-left: 10px /* at least the width of the icon */
}

<span class="icontext">
  Icon Text
</span>
于 2010-06-23T23:36:06.510 回答
14

可悲的是,这些答案都不是防弹的,每个都有一个大缺陷。

@rossipedia 我曾经以这种方式实现我的所有图标,并且效果很好。但是,这是一个很大的问题,但它不适用于精灵,因为您使用 background-position 属性将图标定位在包含文本的容器内。并且尽可能不使用精灵对性能和搜索引擎优化不利,这使得它们对于任何好的现代网站都是必不可少的。

@Jamie Wong 第一个解决方案有两个标记缺陷。可悲的是,正确地使用语义上的元素被某些人低估了,但是您会看到在搜索引擎排名中优先考虑表单的好处。所以首先,当内容不是段落时,你不应该使用 p-tag。改用跨度。其次,img-tag 仅用于内容。在非常特殊的情况下,您可能不得不忽略此规则,但这不是其中之一。

我的解决方案:我不会骗你,我已经检查了很多地方,恕我直言,没有最佳解决方案。不过,这两个解决方案是最接近的解决方案:

内联块解决方案

HTML:
<div class="container">
  <div class="icon"></div>
  <span class="content">Hello</span>
</div>

CSS:
.container {
   margin-top: 50px;
}

.container .icon {
    height: 30px;
    width: 30px;
    background: #000;
    display: inline-block;
    vertical-align: middle;
}
.container .content {
    display: inline-block;
    vertical-align: middle;
}

“显示:内联块;” 是一件美好的事情。你可以用它做很多事情,它在响应式设计中表现得非常好。 但这取决于您的客户。Inline-Block 不适用于 IE6、IE7,并且仍然会导致 IE8 出现问题。我个人不再支持 IE6 和 7,但 IE8 仍然存在。如果你的客户真的需要他的网站在 IE8 中可用,那么 inline-block 很遗憾是没有选择的。先评估这个。用你的精灵替换图标元素的黑色背景,定位它,在那里扔不重复,瞧,你有它。哦,是的,另外,您可以使用垂直对齐以任何方式对齐文本。

PS:我知道那里有一个空的HTML标签,如果有人对如何填写它有建议,我将不胜感激。

固定高度解决方案

.clearfix:after {
    content: ".";
    display: block;
    clear: both;
    visibility: hidden;
    line-height: 0;
    height: 0;
}

.clearfix {
    display: inline-block;
}

html[xmlns] .clearfix {
    display: block;
}

* html .clearfix {
    height: 1%;
}
.container {
    margin-top: 50px;
    border: 1px solid #000;
}

.container .icon {
    height: 30px;
    width: 30px;
    background: #000;
    float:left;
}
.container .content {
    line-height: 30px;
    float: left;
    display: block;
}

我讨厌这个。它为文本使用固定的行高,如果您选择与图标框相同的高度,则文本以该高度为中心。要将文本与顶部对齐,剪切行高,至于底部,您必须使用 position: absolute 和容器的固定宽度和高度来修复它。除非有人要求,否则我不会讨论这个问题,因为这本身就是一个完整的问题,并带来很多缺点。这条路径的主要缺点是高度固定。固定高度总是不灵活的,尤其是对于文本,它可能会导致一堆问题(您不能再以用户身份缩放文本而不被切断,而且不同的浏览器会以不同的方式呈现文本)。因此,请确保在没有浏览器的情况下,文本会被截断,并且在其行高内有一些摆动空间。PS:不要忘记容器的 clearfix。而且,当然,用你的精灵替换黑色背景并根据位置+不重复。

结论

尽可能使用 inline-block。;) 如果不是,请深呼吸并尝试第二种解决方案。

于 2014-03-04T09:09:41.967 回答