CSS để chọn / định kiểu từ đầu tiên


76

Cái này khiến tôi hơi bối rối. Tôi muốn đặt từ đầu tiên của tất cả các đoạn trong div #content của mình ở 14pt thay vì đặt mặc định cho các đoạn (12pt). Có cách nào để thực hiện điều này trong CSS thẳng hay tôi phải gói từ đầu tiên trong một khoảng để thực hiện điều này?


Câu trả lời:


83

Những gì bạn đang tìm kiếm là một phần tử giả không tồn tại. Có: first-letter và: first-line, nhưng không có: first-word.

Tất nhiên bạn có thể làm điều này với JavaScript. Đây là một số mã tôi tìm thấy để thực hiện điều này: http://www.dynamicsitesolutions.com/javascript/first-word-selector/


72
Có lẽ bởi vì một "từ" không phải là một khái niệm được định nghĩa rõ ràng trong một ngôn ngữ bố cục. "Nửa chừng" là một từ hay hai từ? Còn "McDonald" và "O'Shea" thì sao? Từ đầu tiên trong "5 + 3 = 8" hoặc "5 + 3 = 8" là gì?
Robby Slaughter,

52
Đối với mục đích bố cục, định nghĩa của một từ là: "một nhóm các ký tự không có khoảng trắng theo sau và các ký tự khoảng trắng đứng trước" là một định nghĩa tốt và có khả năng sử dụng cao. Để xử lý, bạn có thể cần phải "chu đáo", nhưng đối với bố cục thì đó là một giải pháp hoàn toàn tốt.
Henrik Erlandsson

13
Không có khoảng trắng giữa các từ của ký tự Trung Quốc. 實際上, 漢字 沒有 單詞 和 字母 的 概念.
naichao

56
@RobbySlaughter CSS đã được xác định khái niệm về một "từ" (ít nhất là cho các ký tự alpha Latin) càng lâu càng text-transform: capitalizeđã được xung quanh: jsfiddle.net/mlms13/DRJ76
Michael Martin-Smucker

16
Một "từ" được định nghĩa rất rõ trong các trình duyệt. Việc triển khai: first-word sẽ đơn giản sử dụng cùng một logic được sử dụng trong ngắt dòng.
Lachlan Arthur

33

Tôi không đồng ý với Dale ... Phần tử mạnh thực sự là phần tử được sử dụng sai, ngụ ý điều gì đó về ý nghĩa, cách sử dụng hoặc sự nhấn mạnh của nội dung trong khi bạn chỉ đơn giản có ý định cung cấp phong cách cho phần tử.

Lý tưởng nhất là bạn có thể thực hiện điều này với lớp giả và biểu định kiểu của mình, nhưng vì điều đó là không thể, bạn nên làm cho đánh dấu của mình chính xác về mặt ngữ nghĩa và sử dụng <span class="first-word">.


4
Câu trả lời javascript được chấp nhận là đúng có khả năng hữu ích hơn, nhưng tôi tin rằng câu trả lời này đúng nhất về mặt ngữ nghĩa.
Reynolds

12
FWIW, <b>phần tử có thể thích hợp. Thông số kỹ thuật HTML5 cho biết: Phần tử b đại diện cho một khoảng văn bản mà sự chú ý đang được thu hút cho các mục đích thực dụng mà không truyền tải bất kỳ tầm quan trọng nào thêm và không có ngụ ý về giọng nói hoặc tâm trạng thay thế, chẳng hạn như các từ khóa trong phần tóm tắt tài liệu, tên sản phẩm trong một bài đánh giá, các từ có thể hành động trong phần mềm hướng văn bản tương tác hoặc một phần dẫn của bài báo . (nhấn mạnh của tôi) Từ đầu tiên không hoàn toàn là một bài báo, nhưng chức năng của nó thì giống nhau.
mattsoave

Rất tuyệt, @mattsoave. Tôi chưa thấy định nghĩa lại <b>trong html5, vì vậy điều đó rất thú vị. Tôi sẽ giữ nó trong túi thủ thuật của mình lần tới khi tôi cần một phần tử được tạo kiểu không có ý nghĩa ngữ nghĩa thực sự.
Prestaul

1
@mattsoave - Tôi biết đó là 5 năm sau đó, nhưng tôi nhận thấy cách stackoverflow sử dụng yếu tố ab để nhấn mạnh của bạn :-)
Herbert Van Vliet-

23

Điều tương tự, với jQuery:

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

hoặc là

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

(Qua 'Wizzud' trên Danh sách gửi thư jQuery )


1
Có vẻ như giải pháp tốt nhất cho tôi. BTW: điều này sẽ không hoạt động với, tức là. các ký tự tiếng slovak, như "Zimná záhrada". Vì vậy, tôi sử dụng regex này để thay thế: "([^ \ s] +)"
debute

9

Đáng buồn thay, ngay cả với những thứ thích của CSS 3, chúng tôi vẫn không có những thứ thích, :first-word :last-wordv.v. bằng cách sử dụng CSS thuần túy. Rất may, ngày nay hầu như có JavaScript cho mọi thứ mà tôi đề xuất. Sử dụng nthEverythingjQuery bạn có thể mở rộng từ các phần tử Pseudo truyền thống.

Hiện tại, các Pseudos hợp lệ là:

  • :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

Và sử dụng nth Mọi thứ chúng ta có thể mở rộng điều này thành:

  • ::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

Giải pháp CSS thuần túy:

Sử dụng: lớp giả dòng đầu tiên.

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. */

Không kiểm tra điều đó. Khá chắc chắn rằng nó sẽ hoạt động tốt cho bạn tho. Tôi đã áp dụng quy tắc khối cho lớp giả trước đây. Bạn có thể gặp khó khăn với độ rộng cố định cho mỗi từ đầu tiên, vì vậy text-align: center; và cung cấp cho nó một nền đẹp hoặc một cái gì đó để đối phó với không gian âm.

Hy vọng rằng sẽ làm việc cho bạn. :)

-Motekye


1
1) Đó là một phần tử giả 2) Đó là cho dòng đầu tiên .
BoltClock

14
Ý tưởng là làm cho dòng đầu tiên đủ rộng cho chỉ một từ, làm nổi nó để nó chạy với phần còn lại của văn bản, sau đó áp dụng các kiểu. Trời ạ.
Motekye Guakein

2
Một ý tưởng rất sáng tạo nhưng bạn nên thử nghiệm trước khi đăng. Nó không hoạt động - và nó không thể hoạt động vì displaybị bỏ qua trong ::first-line( developer.mozilla.org/de/docs/Web/CSS/::first-line ).
wortwart

4
Đủ rộng "chỉ cho một từ"? Thật nực cười, vì một từ có thể là 1 chữ cái hoặc 15 chữ cái.
jbyrd

7

Bạn phải gói từ trong một khoảng thời gian để thực hiện điều này.


2

Sử dụng yếu tố mạnh mẽ , đó là mục đích của nó:

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

Sau đó, tạo kiểu cho nó trong style sheet của bạn.

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

27
Thật trớ trêu khi "Lời đầu tiên" của bạn lại thực sự là 2 từ! ;)
Bobby Jack 11-08

2
Vâng, tôi cũng nghĩ như vậy khi viết câu trả lời.
Dale Ragan 11-08

19
Ngoại trừ mạnh là không chính xác về mặt ngữ nghĩa trong trường hợp này. Có vẻ như kích thước chỉ là một vấn đề về kiểu dáng và mạnh mẽ cho thấy rằng phần bị ảnh hưởng sẽ bị căng thẳng.
Akoi Meexx

4
Pluz, nếu bạn muốn sử dụng mạnh ở bất kỳ nơi nào khác trong nội dung, nó sẽ được làm lớn hơn. Tốt nhất hãy phân loại cậu bé hư đó và nhắm mục tiêu trực tiếp hơn.
Adrian Lynch

4
Dựa trên thông số kỹ thuật , tôi nghĩ <b>là thích hợp hơn.
mattsoave

2

Đây là một chút JavaScript và jQuery mà tôi đã tập hợp lại để gói từ đầu tiên của mỗi đoạn bằng một <span>thẻ.

$(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>';
        }
    });
});

Sau đó, bạn có thể sử dụng CSS để tạo kiểu cho .firstWord.

Nó không hoàn hảo, vì nó không tính đến mọi loại khoảng trắng; tuy nhiên, tôi chắc chắn rằng nó có thể đạt được những gì bạn đang mong muốn với một vài chỉnh sửa.

Hãy nhớ rằng mã này sẽ chỉ thực thi sau khi tải trang, vì vậy có thể mất vài giây để thấy hiệu quả.


1

Không có một phương pháp CSS đơn giản nào cho việc này. Bạn có thể phải sử dụng JavaScript + Regex để bật lên trong một khoảng thời gian.

Tốt nhất, sẽ có một phần tử giả cho từ đầu tiên, nhưng bạn không may mắn vì điều đó dường như không hoạt động. Chúng tôi có: chữ cái đầu tiên và: dòng đầu tiên.

Bạn có thể sử dụng kết hợp: after hoặc: before để đạt được nó mà không cần sử dụng khoảng cách.


0

Chèn Span Tag vào văn bản đoạn văn của bạn. Đối với Ví dụ- <p><span>Hello</span>My Name Is Dot</p và sau đó định kiểu chữ cái đầu tiên.


OP đang yêu cầu một bộ chọn. Câu hỏi của anh ấy cho biết: "Có cách nào để thực hiện điều này trong CSS thẳng không " [tôi nhấn mạnh].
VorganHaze

0

Một cách dễ dàng để thực hiện với 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.