阻止:从包装到下一行的元素之后

ptr*_*iek 72 css css3

我有这个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>
Run Code Online (Sandbox Code Playgroud)

我使用:after伪元素追加一个图标:

ul li.completed a:after {
    background:transparent url(img.png) no-repeat; 
    content: '';
    display:inline-block;
    width: 24px;
    height: 16px;
}
Run Code Online (Sandbox Code Playgroud)

问题:如果可用宽度太小,图标将换行到下一行.我希望它与它附加到的链接的最后一个字保持在同一行:

在此输入图像描述

这是可行的,没有在整个链接上添加'nowrap'(我希望单词包装,而不是图标).

在这里查看jsFiddle .

Hug*_*lva 74

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,这将使图标溢出容器,并且只有当文本遇到行尾时,行才会中断.如果需要在原始容器宽度内维护图标,可以添加填充以再次补偿:

ul li.completed a {
    display: inline-block;
    padding-right: 24px;
}
Run Code Online (Sandbox Code Playgroud)

重要更新:

要使此方法起作用,文本与持有伪元素的元素的结束标记之间必须没有空格.即使伪元素的宽度由负边距补偿,白色空间也会在遇到父元素边缘时使线条断开.例如,这有效:

<span>text goes here</span>
Run Code Online (Sandbox Code Playgroud)

不是:

<span>
    text goes here
</span>
Run Code Online (Sandbox Code Playgroud)

  • @brendanmckeown:您可以使用边距在图标和文本之间留出空间.使用伪的左边距来制作空格,并使其右边距为宽度和左边距的总和:{width:24px; margin-left:10px; margin-right:-34px} (3认同)
  • @brendanmckeown如果你使宽度更大,你可以只改变背景位置.所以`width:26px;`和`2px 0`作为背景位置会移动它.http://jsfiddle.net/Bk38F/23/ (2认同)

bte*_*fik 10

您可以将图像添加到最后一个单词.这将使它一起破碎.

在word中添加一个类 <strong class="test">word</strong>

.test:after { ...

http://jsfiddle.net/52dkR/

诀窍也是让那个班级成为 inline-block

如果你想保持下划线,请看这个.

http://jsfiddle.net/atcJJ/

text-decoration:inherit;

  • 我认为在强势要素中永远不会有最后一句话. (3认同)
  • 这个答案不够笼统。您希望特定的HTML标记始终位于您想要的位置。 (2认同)

Phe*_*ost 7

这与之前的回答有点类似,但我认为我会充实并完整地解释它.

一旦设置display: inline-block,:after就成为非文本绑定元素.这就是它包装的原因,以及为什么nowrap没有效果.所以不要display管它.

因为它是默认的文本元素,所以只要内容之间没有空格,内容就会绑定到以前的文本.所以不要添加任何,但要确保你有content: "",或者它是相同的display: none.唯一的问题是height并且widthcontent它控制,在这种情况下是崩溃的.所以width0,并且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 */
}
Run Code Online (Sandbox Code Playgroud)

我已经将它用于外部链接(a[href*="://"]:after),它在Firefox,Chrome和iOS中运行良好.并且由于图标仍然是文本元素,即使是绑定后的直接文本,因此任何关闭标点也将包装.


小智 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>
Run Code Online (Sandbox Code Playgroud)
ul li.completed a {
background: url(img1.png) no-repeat 100% 50%;
padding-right: 18px;
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/atcJJ/36/


小智 5

我尝试使用链接按钮进行此操作,并按照 @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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个 JS 小提琴。


Jas*_*ase 5

如果使用图标字体:使用“不间断空格”unicode\00a0以及伪元素内容(在本例中为 Font Awesome 字形)。

这不需要任何额外的标记或特殊格式或类名。

a[href^='http']::after {
  content: '\00a0\f14c';
  font-family: 'Font Awesome 5 Pro', sans-serif;
  line-height: 0;
}
Run Code Online (Sandbox Code Playgroud)

line-height: 0;当最后一个“单词+图标”换行时,该部分可防止线条抽搐。

代码笔示例