Подтвердить что ты не робот

Предотвратить: после переноса элемента на следующую строку

У меня есть этот 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>

Я добавляю значок с помощью: после псевдоэлемента:

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

Проблема: если доступная ширина слишком мала, значок переносится на следующую строку. Я хотел бы, чтобы он оставался на той же строке, что и последнее слово ссылки, к которой он добавлен:

enter image description here

Это выполнимо, не добавляя 'nowrap' ко всей ссылке (я хочу, чтобы слова обертывались, а не значок).

См. jsFiddle здесь.

4b9b3361

Ответ 1

вместо этого вы можете добавить изображение к последнему слову. что заставит его сломаться вместе.

добавить класс к слову <strong class="test">word</strong>

и .test:after { ...

http://jsfiddle.net/52dkR/

трюк также должен сделать этот класс inline-block

и если вы хотите сохранить подчеркивание, см. это.

http://jsfiddle.net/atcJJ/

добавить text-decoration:inherit;

Ответ 2

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>

Ответ 3

Это немного похоже на предыдущий ответ, но я подумал, что я полностью его объясню и полностью объясню.

Как только вы установите 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. И так как значок остается текстовым элементом, даже прямым текстом после его привязки, поэтому любая закрывающая пунктуация тоже будет завершена.

Ответ 4

У меня была такая же проблема. Мне не очень понравилась идея добавления тегов strong или 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;
}

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

Ответ 5

Пожалуйста, убедитесь, что вы закончили тег перед

<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;
}

Пожалуйста, проверьте это: http://jsfiddle.net/supriti/atcJJ/7/

Ответ 6

Это можно сделать без :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; 
}

http://jsfiddle.net/my97k7b1/

Ответ 7

Я пытался сделать это с помощью кнопки ссылки и добился наибольшего успеха, добавив отступ справа от элемента, как предложил @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;
}

Здесь JS Fiddle.

Ответ 8

Если используется значок шрифта: Использование unicode \00a0 "неразрывный пробел" вместе с содержимым \00a0 (в данном случае это глиф Font Awesome).

Это работает без какой-либо дополнительной разметки, специального форматирования или имен классов.

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

Высота line-height: 0; part предотвращает подергивание строк при переносе последнего слова и иконки.

Пример CodePen