我有这个HTML:
<ul>
<li class="completed"><a href="#">I want the icon to stay on the same line as this last <strong>word</strong></li>
</ul>
我使用:after伪元素追加一个图标:
ul li.completed a:after {
background:transparent url(img.png) no-repeat;
content: '';
display:inline-block;
width: 24px;
height: 16px;
}
问题:如果可用宽度太小,图标会换行到下一行。我希望它与它附加到的链接的最后一个字保持在同一行:
这是否可行,没有在整个链接上添加'nowrap'(我希望单词包装,而不是图标)。
请参阅jsFiddle here。
答案 0 :(得分:68)
JSFiddle - http://jsfiddle.net/Bk38F/65/
为伪元素添加负边距,以补偿其宽度:
ul li.completed a:after {
background:transparent url(img1.png) no-repeat;
content: ' ';
display: inline-block;
width: 24px;
height: 16px;
margin-right: -24px;
}
现在,这将使图标溢出容器,并且只有当文本遇到行尾时,该行才会中断。如果您需要在原始容器宽度内维护图标,可以添加填充以再次补偿:
ul li.completed a {
display: inline-block;
padding-right: 24px;
}
重要更新:
要使此方法起作用,文本和持有伪元素的元素的结束标记之间必须没有空格。即使伪元素的宽度由负边距补偿,白色空间也会在遇到父元素边缘时使线条断开。例如,这有效:
<span>text goes here</span>
而不:
<span>
text goes here
</span>
答案 1 :(得分:10)
您可以将图像添加到最后一个单词。这将使它一起分裂。
在word中添加一个类
<strong class="test">word</strong>
和.test:after { ...
诀窍也是使该类成为inline-block
如果你想保留下划线,请看这个。
添加text-decoration:inherit;
答案 2 :(得分:7)
这与之前的答案有点相似,但我认为我会把它充实并完全解释。
一旦设置display: inline-block
,:after
就会成为非文本绑定元素。这就是它包装的原因,以及为什么nowrap没有效果。所以请单独留下display
。
由于默认情况下它是文本元素,因此只要内容之间没有空格,内容就会绑定到上一个文本。所以不要添加任何内容,但请确保您拥有content: ""
,或者与display: none
相同。唯一的问题是height
和width
由content
控制,在这种情况下会被折叠。因此width
为0
,height
为行高。
用填充物调整区域大小;向左或向右,没关系。添加一点margin
,以便图标不会触及文本。将所有内容保持为相对大小(em
,pt
等),并使用background-size: contain
,以便图标与文本一起缩放,如表情符号或字体。最后使用background-position
将图标放在所需的位置。
ul li.completed a:after {
content: "";
background: url('icon.svg');
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
margin-left: 0.2em; /* spacing*/
padding-right: 0.75em; /* sizing */
}
我已经将它用于我的外部链接(a[href*="://"]:after
),并且它在Firefox,Chrome和iOS中运行良好。并且由于图标仍然是文本元素,即使是绑定后的直接文本,因此任何关闭标点符号也会包装。
答案 3 :(得分:5)
我遇到了同样的问题。我真的不喜欢在最后一个单词中添加强标签或span标签的想法,所以我尝试简单地将图标添加为背景图像,使用一些填充右边而不是使用:after或:before伪元素。为我工作!
<ul><li class="completed"><a href="#">I want the icon to stay on the same line as this last word</a></li></ul>
ul li.completed a {
background: url(img1.png) no-repeat 100% 50%;
padding-right: 18px;
}
答案 4 :(得分:3)
请确保在
之前结束标记<ul><li class="completed"><a href="#">I want the icon to stay on the same line as this last <strong>word</strong></a></li></ul>
尝试以下css。而不是使用“之后”使用“之前”并向右浮动。
ul li.completed a:before {
background:transparent url(img1.png) no-repeat;
content: '';
display:inline-block;
width: 24px;
height: 16px;
float:right;
}
答案 5 :(得分:2)
可以在没有:after
的情况下执行此操作。
带背景的元素应为display:inline
。
<h1><span>I want the icon to stay on the same line as this last word</span></h1>
h1 span {
padding-right: 24px;
background: url('icon.svg') no-repeat right top;
}
答案 6 :(得分:2)
我尝试使用链接按钮,并且最成功的是在@Hugo Silva建议的情况下在元素的右侧添加填充,然后将:: after设置为绝对位置。这是一个非常简单的解决方案,似乎适用于现代浏览器。
.button {
position: relative;
color: #F00;
font-size: 1.5rem;
padding-right: 2.25rem;
}
.button::after {
content: '>>';
display: inline-block;
padding-left: .75rem;
position: absolute;
}
答案 7 :(得分:1)
当元素的文本结尾处有空格时,就会出现此问题,因此它将图标视为另一个单词。我的解决方案是使用javascript删除空白并将其放在元素外部。同样,通过这种方式,我们避免了text-decoration:underline
为链接末尾的空白设置样式:
$(document).ready(function () {
$("a[href$=\".pdf\"]").each(function () {
var endspace = /\s$/;
if (endspace.test($(this).html())) {
var linktx = $(this).html().replace(/\s*$/, "");
$(this).html(linktx);
$(this).after(" ");
}
});
});
在CSS中,我在图标之前添加了一个不间断的空格\00A0
,以将其与文本分开,并根据字体大小进行缩放。在某些情况下,使用狭窄的不间断空间\202F
可以提供更好的视觉效果:
a[href$=".pdf"]:after {
content: "\00A0\f1c1";
font-family: "Font Awesome 5 Pro";
}
答案 8 :(得分:0)
如果使用图标字体:使用“不间断空格” Unicode \00a0
以及伪元素内容(在本例中为Font Awesome字形)。
此方法无需任何额外的标记或特殊格式或类名。
a[href^='http']::after {
content: '\00a0\f14c';
font-family: 'Font Awesome 5 Pro', sans-serif;
line-height: 0;
}
line-height: 0;
部分可防止在最后一个“单词+图标”换行时出现抽动。
答案 9 :(得分:0)
在我的特定设置下,唯一可行的解决方案是使用相对位置,并将我的图标元素放置在绝对位置的范围内。像这样:
h2 a {
position: relative;
width: auto;
}
h2 a span {
position: absolute;
right: -30px;
bottom: 0;
}
<h2>
<a href="#">
The arrow won't drop to the next line as an orphan, even if the text is long and responsive
<span>→</span>
</a>
</h2>