แปลงข้อความเป็นตัวพิมพ์ใหญ่ในตัวพิมพ์ใหญ่ทั้งหมด


129

นี่คือ HTML ของฉัน:

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

นี่คือ CSS ของฉัน:

.link {text-transform: capitalize;}

ผลลัพธ์คือ:

Small Caps & ALL CAPS

และฉันต้องการผลลัพธ์ที่จะเป็น:

Small Caps & All Caps

ความคิดใด ๆ


1
@Marcel - มันไม่จำเป็นที่จะต้องก็จะตามด้วยช่องว่างจึงเป็นเครื่องหมายตัวอักษรที่ถูกต้องสมบูรณ์ (ยกเว้นกรณีที่เอกสาร XHTML แต่มีข้อเสนอแนะไม่เป็น)
เควนติน

1
@ David - โอ้ฉันไม่รู้ว่านี่เป็นสัญกรณ์ที่ถูกต้องเช่นกัน ขอบคุณมีอะไรใหม่ให้เรียนรู้เสมอ
Marcel Korpel

คำตอบ:


57

ไม่มีวิธีในการทำเช่นนี้กับ CSS คุณสามารถใช้ PHP หรือ Javascript สำหรับสิ่งนี้

ตัวอย่าง PHP:

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

ตัวอย่าง jQuery (เป็นปลั๊กอินทันที!):

// 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();​

น่าจะเป็นวิธีเดียวที่จะทำได้
Pekka

2
อาจดีกว่าด้วยนิพจน์ทั่วไปแทนการวนซ้ำ + สตริงย่อย - แต่คุณจะพิมพ์ตัวอักษรในนิพจน์ปกติของ Javascript ได้อย่างไร
Harmen

3
หากคุณกำลังจะทำมันบนฝั่งเซิร์ฟเวอร์คุณสามารถพิมพ์เล็กสตริงทั้งหมดแล้วปล่อยให้ CSS ทำประโยชน์ให้เป็นตัวพิมพ์ใหญ่ แค่ความคิด
สตีเฟ่นพี

16
ฉันลงเอยด้วยการทำ. toLowerCase () บนสตริงทั้งหมดแล้วใช้ CSS เพื่อใช้ประโยชน์ ขอบคุณสำหรับคำแนะนำ!
Khan

1
@GlennFerrie CSS วิธีเดียวที่คุณกำลังพูดถึงคือถ้าคุณไม่รังเกียจที่จะแบ่งปันกับเรา :-)
น้ำ

183

คุณสามารถเกือบจะทำมันด้วย:

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

มันจะให้ผลลัพธ์:

Small caps
All caps

7
มันใช้งานได้เหมือนมีเสน่ห์ขอบคุณ! ลำดับที่สำคัญคือสายที่มี: ตัวอักษรตัวแรกต้องอยู่หลังบรรทัดตัวพิมพ์เล็ก
Steven Lizarazo

9
ดูเหมือนว่าจะต้องมีองค์ประกอบ. ลิงค์จะแสดงเป็นองค์ประกอบบล็อก (display: inline-block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann

1
ความคิดที่ฉลาดทำให้ Philihp ทำได้ดี Torin ทำได้ดีมากสำหรับการชี้ให้เห็น "display: inline-block"
Chris Mendes

9
แต่มันไม่ได้ผลลัพธ์ที่ต้องการ มันเป็นตัวอักษรตัวแรกขององค์ประกอบเฉพาะในขณะที่คำถามขอให้พิมพ์ตัวอักษรตัวแรกของแต่ละคำ มันสร้าง 'All caps' แต่ต้องการ 'All Caps'
manpreet singh

1
@ manpreetsingh ถูกต้องนั่นคือเหตุผลที่ฉันบอกว่ามันใช้งานได้เกือบ อาจไม่ใช่สิ่งที่คำถามถาม แต่บ่อยครั้งที่ข้อมูลจำเพาะของคุณมีความยืดหยุ่นและเป็นวิธีแก้ปัญหาที่ง่ายกว่า
Philihp Busby

32

แปลงด้วยการใช้ JavaScript .toLowerCase()และcapitalizeจะทำส่วนที่เหลือ


1
อ๋อ ฉันทำซ้ำไอเท็มในโมเดลและแปลงเป็น toLowerCase เช่น myArray [i] .firstName = myArray [i] firstName.toLowerCase () จากนั้นใน css, text-transform: capitalize
pdschuller

OP ไม่ได้พูดถึง JS
JDuarteDJ

ขอบคุณสำหรับการป้อนข้อมูล แต่คำถามไม่ได้ จำกัด วิธีการเฉพาะ CSS
ronnyfm

คุณช่วยกรุณาลบ @JDuarteDJ โหวตลงได้ไหม? อีกครั้งคำตอบของฉันเป็นไปตามสิ่งที่ถูกถาม และถ้าคุณเห็นสิ่งที่ถูกเลือกเป็นคำตอบก็ใช้ JavaScript เช่นกันแม้แต่ jQuery ขอบคุณ
ronnyfm

26

คำถามที่น่าสนใจ!

capitalizeแปลงตัวอักษรตัวแรกของคำทุกคำเป็นตัวพิมพ์ใหญ่ แต่จะไม่แปลงตัวอักษรอื่นเป็นตัวพิมพ์เล็ก ไม่ใช่แม้กระทั่ง:first-letterคลาสหลอกจะตัดมัน (เพราะมันใช้กับตัวอักษรตัวแรกของแต่ละองค์ประกอบไม่ใช่แต่ละคำ) และฉันไม่เห็นวิธีการรวมตัวพิมพ์เล็กและพิมพ์ใหญ่เพื่อให้ได้ผลลัพธ์ที่ต้องการ

ดังนั้นเท่าที่ฉันเห็นนี่เป็นไปไม่ได้แน่นอนที่จะทำกับ CSS

@Harmen แสดงวิธีแก้ปัญหา PHP และ jQuery ที่ดูดีในคำตอบของเขา


1
แปลกฉันคาดว่าการเพิ่ม 'a {text-transform: lowercase}' จะใช้งานได้ แต่มันก็ไม่ได้
Kwebble

1
คำตอบนี้ตอบว่าทำไมมันเกิดขึ้น :) ดีกว่าโซลูชัน
Asim KT

คำอธิบายที่ดีมาก @Pekka 웃มีพฤติกรรมที่ไม่คาดคิดจาก CSS หวังว่าจะมีการแก้ไขในท่อ
Aaron Matthews

1
@Pekka 웃ฉันได้รับคำตอบที่ใกล้เคียงกับการทำสิ่งนี้อย่างหมดจดใน CSS มีข้อ จำกัด หนึ่งครั้งต่อบรรทัด แต่ฉันคิดว่าเหมาะสมกับกรณีส่วนใหญ่
JDuarteDJ

9

ฉันอยากจะแก้ปัญหาCSS บริสุทธิ์ที่มีประโยชน์มากกว่าตัวอักษรตัวแรกที่นำเสนอ แต่ก็คล้ายกันมาก

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

แม้ว่าสิ่งนี้จะถูก จำกัด อยู่ที่บรรทัดแรกมันอาจจะมีประโยชน์สำหรับกรณีการใช้งานมากกว่าโซลูชันตัวอักษรตัวแรกเนื่องจากมันใช้ตัวพิมพ์ใหญ่กับทั้งบรรทัดและไม่เพียงแค่คำแรก (ทุกคำในบรรทัดแรก) ในกรณีเฉพาะของ OP สิ่งนี้อาจแก้ไขได้

หมายเหตุ:ตามที่กล่าวไว้ในความคิดเห็นเกี่ยวกับการแก้ปัญหาตัวอักษรตัวแรกลำดับของกฎ CSS นั้นมีความสำคัญ! นอกจากนี้ทราบว่าผมเปลี่ยน<a>แท็กสำหรับ<div>แท็กเพราะเหตุผลบางอย่างหลอกองค์ประกอบ::first-lineไม่ได้ทำงานกับ<a>แท็กโดยกำเนิดแต่อย่างใดอย่างหนึ่ง<div>หรือ<p>จะมีการปรับ แก้ไข:<a>องค์ประกอบจะทำงานถ้าdisplay: inline-block;จะถูกเพิ่มใน.linkชั้นเรียน ขอบคุณเดฟแลนด์สำหรับการตรวจจับ!

ใหม่หมายเหตุ:หากข้อความที่ตัดคำจะทำให้การใช้อักษรตัวพิมพ์ใหญ่หลวมเพราะตอนนี้มันเป็นความจริงในบรรทัดที่สอง (บรรทัดแรกยังคงโอเค)


1
ของคุณ( not working )ตัวอย่างเช่นสามารถทำให้การทำงานโดยการเพิ่มdisplay: inline-block;กับ.linkสไตล์
Dave Land

ทางออกที่ดีผ่าน css ในกรณีที่ตัวอักษรทั้งหมดใน Caps เริ่มแรก
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; }

สิ่งที่ข่าน "ลงเอยด้วยการทำ" (ซึ่งสะอาดกว่าและเหมาะกับฉัน) ลงในความคิดเห็นของโพสต์ที่ทำเครื่องหมายว่าเป็นคำตอบ


4

captializeเอฟเฟกต์ตัวอักษรแรกของคำเท่านั้น http://www.w3.org/TR/CSS21/text.html#propdef-text-transform


1
คำตอบนี้ไม่สร้างสรรค์แม้จะมีข้อเท็จจริงที่ให้คำอธิบายว่าทำไม OP ถึงมีปัญหา
JDuarteDJ

@JDuarteDJ ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะรู้ว่าปัญหาที่มาซึ่งเป็นกรณี คำอธิบายภาพไม่ทำให้บรรทัดฐานเป็นปกติ แต่จะได้รับรายการแรกเท่านั้นและแปลงเป็นตัวอักษรตัวพิมพ์ใหญ่ ฉันพบว่าข้อมูลนี้มีประโยชน์จริง ๆ
Rodrigo Borba

3

อาจมีประโยชน์สำหรับ java และ jstl

  1. เริ่มต้นตัวแปรด้วยข้อความที่แปลแล้ว
  2. หลังจากนั้นก็เป็นไปได้ที่จะใช้มันในฟังก์ชั่น jstl toLowerCase
  3. แปลงด้วย CSS

ใน JSP

1

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

2

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

ใน CSS

3

.content {
  text-transform:capitalize;
}

ในกรณีของฉันฉันจะทำโดยตรงโดยไม่ต้องใช้${fn:toLowerCase(some.key)} fmt:messageขอบคุณ
RaphaelDDL

3

คุณสามารถทำได้ด้วย css ตัวอักษรแรก! เช่นฉันต้องการมันสำหรับเมนู:

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

มันจะทำงานกับองค์ประกอบบล็อกเท่านั้นดังนั้นบล็อกอินไลน์!


นี่ไม่ใช่สิ่งที่ OP ขอมาไม่ใช่ตัวพิมพ์เล็ก
JDuarteDJ

2

หากข้อมูลมาจากฐานข้อมูลเช่นเดียวกับในกรณีของฉันคุณสามารถลดข้อมูลลงก่อนที่จะส่งไปยังรายการที่เลือก / รายการแบบหล่นลง ความอัปยศที่คุณไม่สามารถทำได้ใน CSS


1

หลังจากค้นคว้ามากฉันพบว่าฟังก์ชั่น jquery / การแสดงออกเพื่อเปลี่ยนข้อความในตัวอักษรตัวแรกในตัวพิมพ์ใหญ่เท่านั้นฉันแก้ไขรหัสนั้นตามเพื่อให้สามารถใช้งานได้สำหรับการป้อนข้อมูล เมื่อคุณจะเขียนอะไรบางอย่างในฟิลด์อินพุตจากนั้นย้ายไปที่ไฟล์หรือองค์ประกอบอื่นข้อความของฟิลด์นั้นจะเปลี่ยนเป็นอักษรตัวพิมพ์ใหญ่ตัวที่หนึ่งเท่านั้น ไม่ว่าผู้ใช้จะพิมพ์ข้อความเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กทั้งหมด:

ทำตามรหัสนี้:

ขั้นตอนที่ 1: โทร jquery library ใน html head:

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

ขั้นตอนที่ 2: เขียนโค้ดเพื่อเปลี่ยนข้อความของฟิลด์อินพุต:

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

ขั้นตอนที่ 3: สร้างช่องป้อน HTML ด้วยรหัสเดียวกันกับที่คุณใช้ในรหัส jquery เช่น:

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

id ของฟิลด์อินพุตนี้คือ: edit-submitted-first-name (โดยใช้ในโค้ด jquery ในขั้นตอนที่ 2)

** ผลลัพธ์: ตรวจสอบให้แน่ใจว่าข้อความจะเปลี่ยนหลังจากคุณย้ายโฟกัสของคุณจากฟิลด์อินพุตนั้นไปยังองค์ประกอบอื่น เพราะเราใช้การเน้นเหตุการณ์ jquery ที่นี่ ผลลัพธ์ควรเป็นดังนี้: ประเภทผู้ใช้: "ขอบคุณ" มันจะเปลี่ยนเป็น "ขอบคุณ" **

ขอให้โชคดี



-1

ฉันรู้ว่านี่เป็นการตอบสนองที่ช้า แต่ถ้าคุณต้องการเปรียบเทียบประสิทธิภาพของโซลูชันต่างๆฉันมี jsPerf ที่ฉันสร้างขึ้น

โซลูชันของ Regex นั้นเร็วที่สุดอย่างแน่นอน

นี่คือ jsPerf: https://jsperf.com/capitalize-jwaz

มี 2 ​​โซลูชัน regex

/\b[a-z]/gคนแรกที่ใช้ ขอบเขตของคำจะใส่คำเช่นไม่เปิดเผยต่อการไม่เปิดเผย

หากคุณต้องการใช้อักษรตัวพิมพ์ใหญ่ที่นำหน้าด้วยช่องว่างให้ใช้ regex ตัวที่สอง

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

-1

หากคุณใช้ jQuery นี่เป็นวิธีหนึ่งในการทำ:

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

นี่คือเวอร์ชันที่อ่านง่ายกว่าที่ทำสิ่งเดียวกัน:

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

การสาธิต


ฉันไม่คิดว่า OP ใช้ jQuery
JDuarteDJ

-6

ผิดทั้งหมดมันมีอยู่ -> font-variant: small-caps;

ข้อความเปลี่ยน: ประโยชน์; แค่หมวกตัวอักษรตัวแรก


นั่นไม่ใช่สิ่งที่ OP ต้องการ เขาคาดว่าผลลัพธ์จะมีเพียงตัวอักษรตัวแรกของคำที่เป็นตัวพิมพ์ใหญ่ ไม่ใช่สตริงทั้งหมด
Andrew Barber

มีความแตกต่างกันเล็กน้อยในคำถามที่คุณไม่รับรู้: text-transform: capitalize;ไม่เปลี่ยนข้อความที่มีตัวพิมพ์ใหญ่ทั้งหมดอยู่แล้ว ดูคำถามอีกครั้ง: ผู้ใช้ทดลองใช้แล้ว
Andrew Barber เมื่อ

จากนั้นสามารถใช้ span tag เพื่อแยกคำที่พวกเขาต้องการตัวพิมพ์ใหญ่ทั้งหมดและตัวพิมพ์เล็ก
ออร์แลนโด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.