2013-04-26 1 views
11

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

foo bar● 

Но если требуется линия обертка, я хочу значок, чтобы прикрепить к последнему слову и их завернуть вместе:

foo 
bar● 

Моя проблема очень похожа на: Prevent :after element from wrapping to next line

Однако, Assum решение es У меня есть доступ к последнему слову. В моем случае текст будет генерироваться динамически. Есть ли способ css/html только для того, чтобы значок обертывался последним словом?

Адрес jsfiddle.

+0

Я не могу найти способ сделать это только в CSS, поскольку последнее слово нуждается в ссылке на значок. Тем не менее, это замечательно легко, если вы хотите использовать небольшую функцию JS! – nickhar

+0

@nickhar У меня такая же проблема, но я не могу использовать ширину, которую использовал OP для контейнера. если бы вы могли помочь мне с этой небольшой функцией JS, было бы полезно. – Lucian

ответ

5

Интересно, я нашел, что вам нужно изменить только одну строку кода, чтобы это работало. Тестирование на вашем .container2 элемент jsFiddle, изменить

.container2:after { 
    font-family: FontAwesome; 
    content: "\f111"; 
    display: inline-block; 
} 

в

.container2:after { 
    font-family: FontAwesome; 
    content: "\f111"; 
    display: inline; 
} 

Это похоже на работу с любой шириной я поставил контейнер и оставаться на связи с тем, что когда-либо foo будет.

+0

Простой, но эффективный. Сделал трюк для меня ... спасибо! Вот очищенный [jsfiddle] (http://jsfiddle.net/6jh2j/1/) для всех, кто это случается. –

+0

Вы протестировали этот кросс-браузер? Или просто в браузере, который вы используете? – nickhar

+0

@nickhar Я еще не проверил кроссбраузерное тестирование (как и раньше), поскольку мой пример использования был для прототипа (в Chrome). Я обязательно буду обновляться, когда это произойдет. –

10

Я просто хотел указать , почему изменение, которое @Unmocked предоставлено фактически работает, и оно имеет отношение к difference between display: inline and display: inline-block.

Чтобы объяснить, вот немного фона на разницу между block дисплей и inline дисплей.

Блок дисплея

block элементы, в общем, являются элементами, которые причиной макета. Они получают свою собственную ограничительную рамку и имеют возможность подталкивать другие элементы в некоторой степени, чтобы вписаться в пространство, доступное в области рендеринга браузера. Примеры block изделий включают: h1, p, ul и table. Обратите внимание, что каждый из этих элементов по умолчанию запускает новую строку, а также заканчивает свою собственную линию при закрытии. Другими словами, они вписываются в блок текста, создавая свой собственный раздел уровня абзаца.

Инлайн Показать

inline элементы, в общем, отображаются в линию с текстом. Другими словами, они предназначены для отображения с влиния текста. Примеры включают i, b или span. Обратите внимание, что каждый из этих элементов по умолчанию продолжает поток окружающего его текста, не заставляя новую строку перед или после себя.

Введите Полпути случай ...

Инлайн-Block Display

inline-block представляет собой гибрид из двух предыдущих. По существу, элемент inline-blockзапускает везде, где его предшествующий текст не работает, и пытается вписаться в поток документа inline. Однако, если он достигнет точки, где ему необходимо wrap, он упадет до новой строки, как если бы это был элемент block. Последующий текст будет продолжен сразу после элемента inline-block и продолжит обертывание как обычно. Это может привести к некоторым странным ситуациям.

Вот пример, чтобы показать, что я имею в виду. Чтобы увидеть это в действии, ознакомьтесь с this cssdesk snippet.

enter image description here

В вашем примере, вы были настройки :after псевдо-элемент будет display: inline-block - это означало, что, когда это случилось продлить мимо самой правой границы дисплея оберточной, он действовал как свето- синий текст в примере - и завернут, как блок. Когда вы вместо этого меняете элемент на display: inline, он заставляет его действовать так же, как и любой другой текст - и без пробелов между ним и предыдущими буквами слово-обертка действует так, как вы этого хотели.

Надеюсь, это поможет!

Примечание: Другая вещь, которая изменяется между исходной fiddle и updated one является устранение white-space вокруг текста.

В первой скрипке, ваш HTML выглядит следующим образом:

<div class="container2"> 
    foo bar 
</div> 

Хотя браузер не дисплея пространства до и после текста, она содержит пространства, и когда :after элемент оказывается, это как если это происходит:

<div class="container2"> foo bar :after</div> 

браузер сжимает множественные пробелы в одиночные пробелы, но по-прежнему ставит пространство между словом "bar" и элементом :after. Так же, как пробел между любыми другими словами, это приведет к тому, что обертка произойдет после "bar", но до :after с определенной шириной.

Во второй скрипке, вы используете:

<div class="container-wide">foo bar</div> 
<div class="container-narrow">foo bar</div> 

В этом случае, потому что нет пробелов волоча "foo bar" строк, браузер Отрисовывает :after элемента отображается сразу после окончания строки содержимого. Это как если это происходит:

<div class="container-narrow">foo bar:after</div> 

Нет перерыв в inline -rendered текста не означает, без перерыва.

Для примера, демонстрирующего это, см. this update в вашем jsFiddle.

+2

Супер полезно @ troy-alford. Вы просто научили человека ловить рыбу. –

+0

Очень рад, что это помогло. :) –

+2

Этот тип ответа является причиной, по которой я использую SO, и действительно, почему это стоит предложить щедрость на неотвеченный вопрос! – nickhar

1

Вы можете использовать отрицательный запас ширины значка и преобразования css. Здесь скрипку, как это сделать:

.container { 
 
     width: 50px; 
 
    } 
 
    .icon-circle { 
 
     background:black; 
 
     height:10px; 
 
     width:10px; 
 
     display: inline-block; 
 
     margin-left:5px; 
 
    } 
 
    .ANSWER{ 
 
     display:block; 
 
     padding-right:15px; /* width of the icon */ 
 
    } 
 
    .ANSWER .icon-circle{ 
 
     margin-left:-10px; 
 
     transform:translate(15px); 
 
    }
<h4>What we want</h4> 
 
    <div class="this-is-how-it-should-wrap"> 
 
     foo bar<i class="icon-circle"></i> 
 
    </div> 
 

 
    <div style="margin-top:25px"></div> 
 

 
    <h4>What happenned</h4> 
 
    <div class="container NORMAL"> 
 
     foo bar<i class="icon-circle"></i> 
 
    </div> 
 

 
    <div style="margin-top:25px"></div> 
 

 
    <h3>The answer</h3> 
 
    <div class="container ANSWER"> 
 
     foo bar<i class="icon-circle"></i> 
 
    </div>

Иметь хороший день!