这是一个非常基本的技巧,对你们中的许多人来说都很明显。但由于某种原因,它的解决方案一直困扰着我,所以我在这里分享它。我喜欢带内边距的链接。您在正文内容中给链接加上一些内边距、背景和圆角。
a {
padding: 2px 6px;
background: #eee;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}

一个“带内边距”的链接
问题是,当您将图片设为链接时,这种内边距会以笨拙的方式显示。
错误的修复方法
我过去一直使用大锤而不是凿子来解决这个问题。也就是说,我写了一些 jQuery 来删除这些图片的内边距。
$("a:has('img')").css(padding, 0);
我之所以这样做是因为 jQuery 有 .has() 函数,它能够查看元素是否包含另一个元素,而 CSS 则缺乏这种功能。如果我们能在 CSS 中做到这一点就好了……
a:contains img { padding: 0; }
……但我们做不到。另一种方法是在所有包含图片的链接中添加一个类,例如class="imageLink"。我对这种语义没有任何问题,但它不像我想要的那么具有未来兼容性。也许网站的未来设计不使用带内边距的链接,现在所有这些旧链接都拥有一个不需要的类名。
简单的方法
事实证明,处理此问题的简单方法是在内部图片上应用一些负水平边距。
a img { margin: 0 -6px; }
这会将多余的内边距从外部拉开,留下一个干净的、没有凸起的图片。
请注意,在演示中,我使用了一个类来解决问题,这正是我上面告诉您不要做的事情。这只是为了演示目的,因为我想要一个有问题的图片和一个在同一页面上修复后的图片。
嘿 Chris,
前几天我在想带内边距的链接。我尝试在一个网站上使用它,但在链接的短语换行时遇到了问题。
假设我有一个五词的句子,它从一行的末尾开始,然后换行到下一行。使用带内边距的链接,内边距会在第一行有效地应用,但当该行换行时,该词现在直接显示在带内边距的链接的背景色旁边,没有应用内边距。
您如何解决这个问题?它一直困扰着我:)
这里就是这么运作的吧?
我知道你的意思,是的,这很烦人,也不理想。由于您不知道一行将在哪里换行,我无法想到任何立即的解决方案。虽然我想知道是否使用一些字间距会有所帮助?
这也一直困扰着我。我想到的最好的方法是在链接中使用 来表示空格,这样如果整个链接无法容纳在一行中,它就会跳到下一行。当然,这会在它上面留下一个非常笨拙的行长,但看起来比奇怪样式的分割链接好。
不过,我不确定,对于这个目的使用不换行空格是否存在任何语义问题。这是一种不好的做法吗?
这是另一种方法……不过,在链接上使用 white-space: nowrap; 可能更干净。对于 David 五词的句子示例,这可能会导致更奇怪的换行。
超级简单的解决方案就是保持一个经验法则,即段落文本中的链接不应超过两个词——这解决了大多数带内边距链接的问题。
“Nubbies” 这个词使用得不够多。很棒的提示!
这通过验证了吗?
在某个时候,我脑子里突然冒出一个想法,认为负值都是不好的,应该避免,不知道为什么。
为什么我们不能使用
a img {padding: 0}
?我记得我曾经使用过一个厚的底部边框作为我的链接,为了避免图片有它,我做了类似的事情。
因为这是针对图片而不是链接,而链接才是有内边距的。
哦,我明白了。谢谢您解释。
我也有同样的想法;)
负内边距可以验证。但负边距不行。负值应谨慎使用。因为可能会对网站的其他部分产生副作用,但我认为在教程中 Chris 使用它们的方式是可以的,而且是一个很好的技巧。
我通常只为带内边距的文本链接创建一个 span 类,它还没有让我失望过。
我敢肯定你是说反了——负边距是可以的,但负内边距不行
http://jigsaw.w3.org/css-validator/#validate_by_input
哈哈,是的,谢谢!我在结束了一天非常辛苦的工作后!
我将重新设计我的网站,对不同的浏览器进行大量测试,以及(有趣的是!)在 IE7 中,负边距问题没有出现。通常情况正好相反……:-)。我想这仍然是 IE 中的错误。
无论如何,您的技巧在 IE7 中也能正常运行。
这正是 CSS-Tricks 的最佳体现!;) 我真的很喜欢这些小技巧,谢谢 Chris
我过去遇到的另一个与图片链接有关的问题是,当您对它们应用
border-bottom
时。图片也会被加下划线,但您可以使用img { vertical-align: middle }
来解决这个问题,就像您在演示中示例中做的那样谢谢您的提示!我一直都在为此烦恼:)
头……
好奇三引号在这里会是什么样子!
为什么使用 jQuery 来解决这个问题会不好?性能下降?
为什么用 Javascript(以及遍历整个文档 DOM 的开销)来做,当它可以用 CSS 语句轻松完成时?:)
这又是我们真正需要一个父元素选择器来补充子元素选择器的情况。
例如,而不是
a > img { ... }
当然,它会选择作为 A 元素子元素的任何 IMG 元素。我们需要
a < img { padding: 0; }
我发现很多情况下,能够像上面一样访问父元素会很方便,实际上,它非常适合这种情况,而无需使用负边距。:)
哇,这将非常有用!
没错,但我听说对于浏览器供应商来说,现在实现它太难了。
这是一个期待已久的特性。
谢谢您提供这个“技巧”,Chris!
在处理带填充的链接时,我一直被这种填充的图像困扰。
这正是我一直寻找的解决方案!
继续努力!非常感谢!
干杯
我喜欢负边距的地方(并且略感惊讶)是它们完全通过验证。
我承认,我一直犹豫使用它们,因为感觉我做错了什么,在某些情况下它是一个“临时解决方案”……在这个例子中,它不是。但我承认我用它在 IE 中拖动标题和容器之间的边距,当我可能有一些其他无效的代码导致问题时……或者可能是 IE 本身。;)
有趣的提示。我不得不解决这个问题,因为我以前从未在我的正文文本中使用过这样的链接。
不过,我不确定的是,这在什么情况下会发生。
是当文章有特色图片时吗?通常浮动到右边或左边?或者它作为正文中的内嵌图像吗?或者两者都有?
我问这个问题的原因是,在我脑中的某个疯狂理论部分,我认为一定有一种方法可以将浮动应用于图像,从而将其从锚点标签的流动中移除(这意味着可以用一些奇技淫巧隐藏锚点标签),但不会影响段落文本。
是否有这样的 CSS 可能性,允许父元素在文本之间控制浮动元素?
xD
简单但有用 =)
Chris,感谢你创建了一个很棒的网站,我每天都会查看它,以不断学习。
当我查看 IE7 中的演示时,我看到图像顶部和右侧有灰色填充。未修复的图像周围都有灰色填充。
所以你确实阅读了我在你另一个博客上的评论,对吧? :)
是的!这确实是这篇文章的灵感来源。非常感谢你。
感谢你,Chris。我是你的忠实粉丝。
嗨,在 Internet Explorer 7 XP 中不起作用,我在图像左侧看到灰色,解决方案?
超链接标签中图像的负边距。很巧妙。
这是正确的 CSS 代码,在 IE 和 Firefox 中都可以正常显示。
p.cccp a {
color: blue;
text-decoration: none;
padding: 2px 6px;
background: #eee;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
p.cccp a:hover {
text-decoration: none;
color: #FFFFFF;
padding: 2px 6px;
background: #CC0000;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
这个代码是否正确,可以实现相同的效果,但只对具有 cccp 样式的段落中的链接起作用?
p.cccp a {
color: blue;
text-decoration: none;
padding: 2px 6px;
background: #eee;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
p.cccp a:hover {
text-decoration: none;
color: #FFFFFF;
padding: 2px 6px;
background: #CC0000;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
}
我真的很喜欢这个新的 CSS 3。有了对旧浏览器的回退,它对于可用性来说很棒。
你将在 IE6 中看到负边距的问题。IE6 不会像你期望的那样工作。
我喜欢文本内链接周围的圆角。如何在不使用图像的情况下让 IE 显示曲线?Jquery?
Sam Miller