Chuyển đổi văn bản CSS viết hoa trên tất cả các chữ hoa


129

Đây là HTML của tôi:

<a href="#" class="link">small caps</a> & 
<a href="#" class="link">ALL CAPS</a>

Đây là CSS của tôi:

.link {text-transform: capitalize;}

Đầu ra là:

Small Caps & ALL CAPS

và tôi muốn đầu ra là:

Small Caps & All Caps

Có ý kiến ​​gì không?


1
@Marcel - không cần thiết, nó được theo sau bởi một khoảng trắng, vì vậy nó là một ký hiệu bằng chữ hoàn toàn hợp lệ (trừ khi tài liệu là XHTML, nhưng không có gợi ý nào)
Quentin

1
@David - Ồ, tôi cũng không biết đây là một ký hiệu hợp lệ. Cảm ơn, luôn có điều gì đó mới để học.
Marcel Korpel

Câu trả lời:


57

Không có cách nào để làm điều này với CSS, bạn có thể sử dụng PHP hoặc Javascript cho việc này.

Ví dụ về PHP

$text = "ALL CAPS";
$text = ucwords(strtolower($text)); // All Caps

Ví dụ về jQuery (bây giờ là plugin!):

// Uppercase every first letter of a word
jQuery.fn.ucwords = function() {
  return this.each(function(){
    var val = $(this).text(), newVal = '';
    val = val.split(' ');

    for(var c=0; c < val.length; c++) {
      newVal += val[c].substring(0,1).toUpperCase() + val[c].substring(1,val[c].length) + (c+1==val.length ? '' : ' ');
    }
    $(this).text(newVal);
  });
}

$('a.link').ucwords();​

Yup, có lẽ là cách duy nhất để làm điều này.
Pekka

2
Có thể tốt hơn với các biểu thức thông thường thay vì vòng lặp + chuỗi con này - Nhưng làm thế nào bạn có thể viết hoa một chữ cái trong các biểu thức thông thường của Javascript?
Harmen

3
Nếu bạn định làm phía máy chủ, bạn có thể viết thường toàn bộ chuỗi sau đó để CSS thực hiện viết hoa. Chỉ là một ý nghĩ.
Stephen P

16
Cuối cùng tôi đã thực hiện một .toLowerCase () trên toàn bộ chuỗi, sau đó sử dụng CSS để viết hoa. Cảm ơn vì lời khuyên!
Khan

1
@GlennFerrie Giải pháp CSS duy nhất bạn đang nói đến là gì, nếu bạn không phiền khi chia sẻ nó với chúng tôi? :-)
chảy nước

183

Bạn gần như có thể làm điều đó với:

.link { text-transform: lowercase; }
.link:first-letter { text-transform: uppercase; }

Nó sẽ cung cấp cho bạn đầu ra:

Small caps
All caps

7
nó hoạt động như một lá bùa, cảm ơn bạn!, thứ tự rất quan trọng, dòng có: chữ cái đầu tiên phải nằm sau dòng chữ thường.
Steven Lizarazo

9
Điều này dường như yêu cầu các phần tử .link được hiển thị dưới dạng các phần tử khối. (hiển thị: inline-block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann

1
Khéo léo suy nghĩ, làm tốt Philihp. Và Torin đã làm rất tốt khi chỉ ra "display: inline-block".
Chris Mendes

9
Nhưng nó không tạo ra kết quả mong muốn. Nó viết hoa chữ cái đầu tiên của phần tử chỉ trong khi câu hỏi yêu cầu viết hoa chữ cái đầu tiên của mỗi từ. Nó tạo ra 'Tất cả mũ' nhưng bắt buộc là 'Tất cả mũ'
manpreet singh

1
@manpreetsingh đúng, đó là lý do tại sao tôi nói nó gần như hoạt động. Nó có thể không chính xác những gì câu hỏi yêu cầu, nhưng thường thông số kỹ thuật của bạn là linh hoạt và một giải pháp đơn giản hơn là thích hợp hơn.
Philihp Busby 7/03/2016

32

Chuyển đổi bằng JavaScript bằng cách sử dụng .toLowerCase()capitalizesẽ làm phần còn lại.


1
Vâng. Tôi đã lặp lại các mục trong mô hình và chuyển đổi chúng thànhLowerCase, như myArray [i] .firstName = myArray [i] firstName.toLowerCase () Sau đó, trong css, text-Transform: capitalize
pdschuller

OP không đề cập đến JS.
JDuarteDJ

Cảm ơn về đầu vào, nhưng câu hỏi không chỉ giới hạn cách tiếp cận với CSS.
ronnyfm

Bạn có thể vui lòng xóa @JDuarteDJ bỏ phiếu không? Một lần nữa, câu trả lời của tôi phù hợp với những gì đã được hỏi. Và nếu bạn thấy những gì được chọn làm câu trả lời cũng sử dụng JavaScript, thậm chí cả jQuery. Cảm ơn.
ronnyfm

26

Câu hỏi thú vị!

capitalizebiến đổi mỗi chữ cái đầu tiên của một từ thành chữ hoa, nhưng nó không biến đổi các chữ cái khác thành chữ thường. Ngay cả lớp :first-lettergiả cũng sẽ cắt nó (vì nó áp dụng cho chữ cái đầu tiên của mỗi thành phần, không phải từng từ) và tôi không thể thấy cách kết hợp chữ thường và viết hoa để có kết quả mong muốn.

Theo như tôi có thể thấy, điều này thực sự không thể thực hiện được với CSS.

@Harmen cho thấy các cách giải quyết PHP và jQuery đẹp mắt trong câu trả lời của anh ấy.


1
Thật kỳ lạ, tôi dự kiến ​​thêm 'a {text-Transform: chữ thường}' sẽ hoạt động. Nhưng nó không.
Kwebble

1
Câu trả lời này trả lời tại sao nó xảy ra. :) Điều đó tốt hơn các giải pháp.
Asim KT

Giải thích rất tốt @Pekka 웃 một số hành vi bất ngờ từ CSS. Hãy hy vọng có một sự điều chỉnh trong đường ống.
Aaron Matthews

1
@Pekka Tôi đã cung cấp một câu trả lời rất gần với việc thực hiện điều này hoàn toàn bằng CSS. Có một giới hạn một lần trên mỗi dòng nhưng tôi nghĩ rằng nó phù hợp với hầu hết các trường hợp.
JDuarteDJ

9

Tôi muốn giới thiệu một giải pháp CSS thuần túy hữu ích hơn giải pháp chữ cái đầu tiên được trình bày nhưng cũng rất giống nhau.

.link {
  text-transform: lowercase;
display: inline-block;
}

.link::first-line {
  text-transform: capitalize;
}
<div class="link">HELLO WORLD!</div>
<p class="link">HELLO WORLD!</p>
<a href="#" class="link">HELLO WORLD!  ( now working! )</a>

Mặc dù điều này được giới hạn ở dòng đầu tiên, nó có thể hữu ích cho các trường hợp sử dụng nhiều hơn giải pháp chữ cái đầu tiên vì nó áp dụng viết hoa cho toàn bộ dòng và không chỉ từ đầu tiên. (tất cả các từ trong dòng đầu tiên) Trong trường hợp cụ thể của OP, điều này có thể đã giải quyết nó.

Lưu ý: Như đã đề cập trong các nhận xét giải pháp chữ cái đầu tiên , thứ tự của các quy tắc CSS rất quan trọng! Cũng lưu ý rằng tôi đã thay đổi <a>thẻ cho một <div>thẻ vì một số lý do, phần tử giả ::first-linekhông hoạt động với <a>các thẻ nguyên bản nhưng <div>hoặc <p>là tốt. EDIT: các <a>yếu tố sẽ làm việc nếu display: inline-block;là bổ sung vào .linklớp. Cảm ơn Dave Land vì đã phát hiện ra điều đó!

Lưu ý mới: nếu văn bản kết thúc tốt đẹp, nó sẽ mất chữ viết hoa vì thực tế nó hiện đang ở dòng thứ hai (dòng đầu tiên vẫn ổn).


1
( not working )Ví dụ của bạn có thể được thực hiện để làm việc bằng cách thêm display: inline-block;vào .linkphong cách.
Dave Land

Giải pháp tốt thông qua css trong trường hợp khi tất cả các chữ cái trong Caps ban đầu
Hassan Ali Shahzad

5

JavaScript:

var links = document.getElementsByClassName("link");
for (var i = 0; i < links.length; i++) {
  links[i].innerHTML = links[i].innerHTML.toLowerCase();
}

CSS:

.link { text-transform: capitalize; }

Những gì Khan "đã kết thúc làm" (sạch hơn và làm việc cho tôi) nằm trong phần bình luận của bài đăng được đánh dấu là câu trả lời.


4

captializechỉ có tác dụng chữ cái đầu tiên của từ. http://www.w3.org/TR/CSS21/text.html#propdef-text-transform


1
Câu trả lời này không mang tính xây dựng mặc dù thực tế là đưa ra lời giải thích về lý do tại sao OP gặp vấn đề.
JDuarteDJ

@JDuarteDJ Tôi nghĩ điều quan trọng là phải biết vấn đề nguồn, đó là trường hợp. captialize không bình thường hóa chuỗi, nhưng chỉ nhận được mục đầu tiên và biến nó thành một chữ cái viết hoa. Tôi thấy thông tin này thực sự hữu ích
Rodrigo Borba

3

Có thể hữu ích cho java và jstl.

  1. Khởi tạo biến với thông điệp cục bộ.
  2. Sau đó, có thể sử dụng nó trong hàm jstl toLowerCase.
  3. Chuyển đổi với CSS.

Trong JSP

1.

<fmt:message key="some.key" var="item"/>

2.

<div class="content">
  <a href="#">${fn:toLowerCase(item)}</a>
</div>

Trong CSS

3.

.content {
  text-transform:capitalize;
}

Trong trường hợp của tôi, tôi có thể làm ${fn:toLowerCase(some.key)}trực tiếp, mà không phải sử dụng fmt:message. Cảm ơn.
RaphaelDDL

3

Bạn có thể làm điều đó với chữ cái đầu tiên css! ví dụ tôi muốn nó cho Menu:

a {display:inline-block; text-transorm:uppercase;}
a::first-letter {font-size:50px;}

Nó chỉ chạy với các phần tử khối - do đó là khối nội tuyến!


Đây không phải là những gì OP yêu cầu, nó không phải là mũ nhỏ.
JDuarteDJ

2

Nếu dữ liệu đến từ cơ sở dữ liệu, như trong trường hợp của tôi, bạn có thể hạ thấp nó trước khi gửi nó vào danh sách chọn / danh sách thả xuống. Thật xấu hổ khi bạn không thể làm điều đó trong CSS.


1

Sau khi nghiên cứu rất nhiều, tôi thấy hàm / biểu thức jquery chỉ thay đổi văn bản bằng chữ cái đầu tiên, tôi sửa đổi mã đó cho phù hợp để làm cho nó hoạt động được cho trường đầu vào. Khi bạn sẽ viết một cái gì đó trong trường đầu vào và sau đó chuyển sang phần tử hoặc phần tử khác, văn bản của trường đó sẽ chỉ thay đổi với chữ viết hoa chữ cái đầu tiên. Không có vấn đề văn bản loại người dùng hoàn toàn viết hoa chữ thường hoặc viết hoa:

Thực hiện theo mã này:

Bước 1: Gọi thư viện jquery trong đầu html:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

Bước 2: Viết mã để thay đổi văn bản của các trường đầu vào:

<script>
$(document).ready(function(){
$("#edit-submitted-first-name,#edit-submitted-last-name,#edit-submitted-company-name, #edit-submitted-city").focusout(function(){
var str=$(this).val();
str = str.toLowerCase().replace(/\b[a-z]/g, function(letter) {
    return letter.toUpperCase();
});
$(this).val(str);
 });});

 </script>

Bước 3: Tạo các trường nhập HTML có cùng id mà bạn sử dụng trong mã jquery như:

<input type="text" id="edit-submitted-first-name" name="field name">

Id của trường đầu vào này là: edit-submit-First-name (Nó sử dụng mã jquery ở bước 2)

** Kết quả: Đảm bảo văn bản sẽ thay đổi sau khi bạn di chuyển tiêu điểm của mình từ trường đầu vào đó vào một yếu tố khác. Bởi vì chúng tôi sử dụng tập trung ra sự kiện của jquery ở đây. Kết quả sẽ như thế này: Loại người dùng: "cảm ơn" nó sẽ thay đổi với "Cảm ơn". **

May mắn nhất


0

Giải pháp PHP, trong phần phụ trợ:

$string = `UPPERCASE`
$lowercase = strtolower($string);
echo ucwords($lowercase);

-1

Tôi biết đây là phản hồi muộn nhưng nếu bạn muốn so sánh hiệu suất của các giải pháp khác nhau, tôi có một jsPerf mà tôi đã tạo.

Các giải pháp Regex là nhanh nhất cho chắc chắn.

Đây là jsPerf: https://jsperf.com/capitalize-jwaz

Có 2 giải pháp regex.

Cái đầu tiên sử dụng/\b[a-z]/g . Ranh giới từ sẽ viết hoa các từ như không tiết lộ thành Không tiết lộ.

Nếu bạn chỉ muốn viết hoa các chữ cái đứng trước một khoảng trắng thì hãy sử dụng biểu thức chính thứ hai

/(^[a-z]|\s[a-z])/g

-1

nếu bạn đang sử dụng jQuery; đây là một cách để làm điều đó:

$('.link').each(function() {
    $(this).css('text-transform','capitalize').text($(this).text().toLowerCase());
});

Đây là một phiên bản dễ đọc hơn để làm điều tương tự:

//Iterate all the elements in jQuery object
$('.link').each(function() {

    //get text from element and make it lower-case
    var string = $(this).text().toLowerCase();

    //set element text to the new string that is lower-case
    $(this).text(string);

    //set the css to capitalize
    $(this).css('text-transform','capitalize');
});

Bản giới thiệu


Tôi không nghĩ OP sử dụng jQuery.
JDuarteDJ

-6

tất cả đều sai nó tồn tại -> biến thể phông chữ: mũ nhỏ;

chuyển đổi văn bản: viết hoa; chỉ nắp chữ cái đầu tiên


Đó không phải là tất cả những gì OP muốn. Ông hy vọng đầu ra chỉ có các chữ cái đầu tiên của các từ được viết hoa; không phải toàn bộ chuỗi.
Andrew Barber

Có một sắc thái trong câu hỏi mà bạn không nhận thấy: text-transform: capitalize;không thay đổi văn bản đã là tất cả các chữ hoa. Xem lại câu hỏi: Người dùng đã thử điều đó.
Andrew Barber

sau đó có thể sử dụng thẻ span để chia nhỏ những từ mà họ muốn tất cả các chữ hoa và chữ hoa nhỏ.
Orlando
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.