CSS для вибору / стилю першого слова


76

Цей мене задубив. Я хочу зробити перше слово з усіх абзаців у своєму #content div на 14pt замість типового для абзаців (12pt). Чи є спосіб зробити це в прямому CSS, чи я залишив обертати перше слово в проміжок для цього?


Відповіді:


83

Те, що ви шукаєте, - це псевдоелемент, якого не існує. Існує: перша буква та: перший рядок, але немає: перше слово.

Звичайно, ви можете зробити це за допомогою JavaScript. Ось деякий код, який я знайшов, що робить це: http://www.dynamicsitesolutions.com/javascript/first-word-selector/


72
Можливо, тому, що "слово" - це не чітко визначене поняття в мові розкладки. "Напівпіч" - це одне-два слова? А як щодо "Макдональда" та "О'Ші"? Яке перше слово в "5 + 3 = 8" або "5 + 3 = 8"?
Роббі Забій

52
Для цілей макетування визначення слова як: «група символів, що не є пробілами, що слідують за символами пробілу та перед ними» є хорошим і дуже корисним. Для обробки вам може знадобитися бути продуманим, але для макета це цілком гарне рішення.
Генрік Ерландссон,

13
Між словами китайських ієрогліфів немає пробілів. 實際上, 漢字 沒有 單詞 和 字母 的 概念.
deerchao

56
@RobbySlaughter CSS вже давно визначає поняття "слова" (принаймні для латинських символів) text-transform: capitalize: jsfiddle.net/mlms13/DRJ76
Michael Martin-Smucker

16
"Слово" дуже добре визначене у браузерах. Реалізація: first-word просто використовувала б ту саму логіку, що використовується в розривах рядків.
Lachlan Arthur,

33

Я повинен не погодитися з Дейлом ... Сильний елемент насправді є неправильним елементом для використання, маючи на увазі щось про значення, використання чи наголос вмісту, тоді як ви просто маєте намір надати елементу стиль.

В ідеалі ви змогли б досягти цього за допомогою псевдокласу та вашої таблиці стилів, але оскільки це неможливо, вам слід зробити свою розмітку семантично правильною та використовувати <span class="first-word">.


4
Відповідь javascript, прийнята як правильна, є потенційно більш корисною, але я вважаю, що ця відповідь є найбільш семантично правильною.
Рейнольдс,

12
FWIW, <b>елемент може бути відповідним. В специфікації HTML5 сказано: Елемент b представляє простір тексту, на який звертається увага в утилітарних цілях, не передаючи жодної зайвої важливості і не впливаючи на альтернативний голос чи настрій, такі як ключові слова в анотації документа, назви продуктів у огляд, дієві слова в інтерактивному текстовому програмному забезпеченні або стаття . (наголос на моєму) Перше слово - це не зовсім стаття, але його функція однакова.
mattsoave

Дуже приємно, @mattsoave. Я ще не бачив перевизначення <b>в html5, так що це дуже цікаво. Я зберігатиму це у своїй сумці фокусів наступного разу, коли мені знадобиться стилізований елемент без реального семантичного значення.
Prestaul

1
@mattsoave - Я знаю, що це 5 років тому, але я помітив, як stackoverflow використовує елемент ab для вашого акценту :-)
Герберт Ван-

23

Те саме, з jQuery:

$('#links a').each(function(){
    var me = $(this);
    me.html( me.text().replace(/(^\w+)/,'<strong>$1</strong>') );
  });

або

$('#links a').each(function(){
    var me = $(this)
       , t = me.text().split(' ');
    me.html( '<strong>'+t.shift()+'</strong> '+t.join(' ') );
  });

(Через "Wizzud" у списку розсилки jQuery )


1
Здається, це найкраще рішення для мене. BTW: це не спрацює, тобто. словацькі символи, як-от "Zimná záhrada". Тож я використав замість цього регулярний вираз: "([^ \ s] +)"
дебют

9

На жаль, навіть для подібних CSS 3 ми все ще не маємо подібних :first-word :last-wordтощо, використовуючи чистий CSS. На щастя, сьогодні існує майже JavaScript для всього, що призводить мене до моєї рекомендації. Використовуючи nthEverything та jQuery, ви можете перейти від традиційних елементів псевдо.

На даний момент дійсними псевдо є:

  • :first-child
  • :first-of-type
  • :only-child
  • :last-child
  • :last-of-type
  • :only-of-type
  • :nth-child
  • :nth-of-type
  • :nth-last-child
  • :nth-last-of-type

І використовуючи n-те Все, що ми можемо розширити це до:

  • ::first-letter
  • ::first-line
  • ::first-word
  • ::last-letter
  • ::last-line
  • ::last-word
  • ::nth-letter
  • ::nth-line
  • ::nth-word
  • ::nth-last-letter
  • ::nth-last-line
  • ::nth-last-word

8

Чисте рішення CSS:

Використовуйте псевдо-клас першого рядка.

display:block;
Width:40-100px; /* just enough for one word, depends on font size */
Overflow:visible; /* so longer words don't get clipped.*/
float:left; /* so it will flow with the paragraph. */
position:relative; /* for typeset adjustments. */

Не перевіряв це. Впевнений, це буде добре працювати для вас. Я раніше застосовував правила блоків до псевдокласів. Можливо, у вас зафіксовано фіксовану ширину для кожного першого слова, тому вирівнювання тексту: center; і дайте йому приємний тло або щось для боротьби з негативним простором.

Сподіваюся, це працює для вас. :)

-Мотеке


1
1) Це псевдоелемент 2) Це для першого рядка .
BoltClock

14
Ідея полягає в тому, щоб зробити перший рядок достатньо широким лише для одного слова, перемістити його так, щоб він проходив з рештою тексту, а потім застосувати стилі. Боже
Motekye Guakein

2
Дуже креативна ідея, але перед публікацією варто перевірити. Це не працює - і воно не може працювати, оскільки displayігнорується у ::first-line( developer.mozilla.org/de/docs/Web/CSS/::first-line ).
wortwart

4
Досить широке "лише на одне слово"? Це смішно, оскільки слово може складати 1 букву або 15 букв.
jbyrd


2

Використовуйте сильний елемент, тобто його призначення:

<div id="content">
    <p><strong>First Word</strong> rest of paragraph.</p>
</div>

Потім створіть для нього стиль у своїй таблиці стилів.

#content p strong
{
    font-size: 14pt;
}

27
Іронічно, що ваше "Перше слово" насправді - це 2 слова! ;)
Боббі Джек

2
Так, я думав те саме, коли писав відповідь.
Дейл Рейган,

19
Окрім сильного в цьому випадку є семантично неправильним. Здається, що розмір - це лише проблема стилю, і сильний знак вказує на те, що на зазначений розділ слід наголосити.
Akoi Meexx

4
Плюс, якщо ви хочете використовувати сильний де-небудь ще у вмісті, його буде збільшено. Найкраще класифікувати цього поганого хлопчика і націлити його прямо.
Адріан Лінч,

4
Виходячи зі специфікації , я вважаю, що <b>це більш доречно.
mattsoave

2

Ось трохи JavaScript і jQuery, які я зібрав, щоб обернути перше слово кожного абзацу <span>тегом.

$(function() {
    $('#content p').each(function() {
        var text = this.innerHTML;
        var firstSpaceIndex = text.indexOf(" ");
        if (firstSpaceIndex > 0) {
            var substrBefore = text.substring(0,firstSpaceIndex);
            var substrAfter = text.substring(firstSpaceIndex, text.length)
            var newText = '<span class="firstWord">' + substrBefore + '</span>' + substrAfter;
            this.innerHTML = newText;
        } else {
            this.innerHTML = '<span class="firstWord">' + text + '</span>';
        }
    });
});

Потім ви можете використовувати CSS для створення стилю для .firstWord.

Це не ідеально, оскільки не враховує всі типи пробілів; однак, я впевнений, це зможе досягти того, що вам потрібно, за допомогою декількох налаштувань.

Майте на увазі, що цей код буде виконуватися лише після завантаження сторінки, тому ефект може побачити долю секунди.


1

Для цього не існує простого методу CSS. Можливо, вам доведеться скористатися JavaScript + регулярним виразом, щоб з’явитись у певному інтервалі.

В ідеалі для першого слова міг би бути псевдоелемент, але вам не пощастило, оскільки це, здається, не працює. У нас є: перший лист і: перший рядок.

Можливо, ви зможете скористатися комбінацією: after або: before, щоб досягти цього, не використовуючи інтервал.


0

Вставте тег Span у текст абзацу. Наприклад, <p><span>Hello</span>My Name Is Dot</p а потім стилізуйте першу літеру.


OP просить селектора. У його запитанні було сказано: "Чи є спосіб зробити це в прямому CSS" [курсив мій].
VorganHaze

0

Простий спосіб зробити це за допомогою HTML + CSS:

TEXT A <b>text b</b>

<h1>text b</h1>

<style>
    h1 { /* the css style */}
    h1:before {content:"text A (p.e.first word) with different style";    
    display:"inline";/* the different css style */}
</style>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.