CSS przekształcanie tekstu z wielkimi literami


131

Oto mój kod HTML:

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

Oto mój CSS:

.link {text-transform: capitalize;}

Wynik to:

Small Caps & ALL CAPS

i chcę, aby wynik wyglądał następująco:

Small Caps & All Caps

Jakieś pomysły?


1
@Marcel - nie musi być, następuje po nim spacja, więc jest to całkowicie poprawny literał ampersand (chyba że dokument jest w formacie XHTML, ale nie ma sugestii, że tak jest)
Quentin

1
@David - Och, nie wiedziałem, że to też jest poprawna notacja. Dzięki, zawsze można się czegoś nowego nauczyć.
Marcel Korpel,

Odpowiedzi:


60

Nie ma sposobu, aby to zrobić za pomocą CSS, możesz do tego użyć PHP lub Javascript.

Przykład PHP:

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

Przykład jQuery (teraz jest to wtyczka!):

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

Tak, prawdopodobnie jedyny sposób, aby to zrobić.
Pekka

2
Może lepiej jest z wyrażeniami regularnymi zamiast tej pętli + podciągi - Ale jak możesz pisać wielką literę w wyrażeniach regularnych Javascript?
Harmen

3
Jeśli zamierzasz to zrobić po stronie serwera, możesz napisać cały ciąg małymi literami, a następnie pozwolić CSS na wielkie litery. Tylko myśl.
Stephen P,

16
Skończyło się na tym, że wykonałem .toLowerCase () na całym ciągu, a następnie użyłem CSS do kapitalizacji. Dzięki za radę!
Khan

1
@GlennFerrie Jakie jest jedyne rozwiązanie CSS, o którym mówisz, jeśli nie masz nic przeciwko udostępnieniu go nam? :-)
wodnisty

186

Możesz to prawie zrobić za pomocą:

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

Otrzymasz wynik:

Small caps
All caps

7
działa jak urok, dziękuję !, kolejność jest ważna, linia z: pierwsze litery muszą znajdować się po małej linii.
Steven Lizarazo

9
Wygląda na to, że elementy .link są wyświetlane jako elementy blokowe. (wyświetlanie: inline-block;) jsfiddle.net/7y7wqqhb/1
Torin Finnemann

1
Sprytne myślenie, dobra robota Philihp. Dobra robota, Torinowi za wskazanie „display: inline-block”.
Chris Mendes,

11
Ale to nie daje pożądanego rezultatu. Pierwsza litera elementu jest zapisywana wielką literą tylko wtedy, gdy pytanie dotyczy pierwszej litery każdego słowa. Produkuje „All Caps”, ale wymagane jest „All Caps”
manpreet singh

1
@manpreetsingh jest poprawne, dlatego powiedziałem, że prawie działa. Może to nie być dokładnie to, co zadawano pytanie, ale często Twoja specyfikacja jest elastyczna i preferowane jest prostsze rozwiązanie.
Philihp Busby

32

Konwertuj za pomocą JavaScript za pomocą .toLowerCase()i capitalizezrobi resztę.


1
Tak. Wykonałem iterację elementów w modelu i przekonwertowałem je naLowerCase, np. MyArray [i] .firstName = myArray [i] firstName.toLowerCase () Następnie w css, text-transform: capitalize
pdschuller

OP nie wspomina o JS.
JDuarteDJ

Dzięki za wkład, ale pytanie nie ograniczało podejścia tylko do CSS.
ronnyfm

Czy możesz usunąć @JDuarteDJ głos negatywny? Ponownie, moja odpowiedź jest zgodna z pytaniami. A jeśli zobaczysz, co zostało wybrane jako odpowiedź, również używa JavaScript, nawet jQuery. Dzięki.
ronnyfm

26

Interesujące pytanie!

capitalizeprzekształca każdą pierwszą literę słowa na wielką, ale nie przekształca pozostałych liter na małe. Nawet :first-letterpseudoklasa go nie przerwie (ponieważ dotyczy pierwszej litery każdego elementu, a nie każdego słowa) i nie widzę sposobu na połączenie małych i wielkich liter, aby uzyskać pożądany efekt.

O ile widzę, w przypadku CSS jest to rzeczywiście niemożliwe.

@Harmen w swojej odpowiedzi pokazuje dobrze wyglądające obejścia PHP i jQuery.


1
Dziwne, spodziewałem się, że zadziała dodanie „a {text-transform: lowercase}”. Ale tak nie jest.
Kwebble

1
Ta odpowiedź odpowiada, dlaczego tak się dzieje. :) To lepsze niż rozwiązania.
Asim KT

Bardzo dobre wyjaśnienie @Pekka 웃 nieoczekiwane zachowanie z CSS. Miejmy nadzieję, że szykuje się korekta.
Aaron Matthews

1
@Pekka 웃 Podałem odpowiedź, która jest bardzo bliska zrobienia tego wyłącznie w CSS. Istnieje ograniczenie raz na linię, ale myślę, że pasuje do większości przypadków.
JDuarteDJ

11

Chciałbym zasugerować czyste rozwiązanie CSS , które jest bardziej przydatne niż przedstawione rozwiązanie z pierwszej litery , ale jest również bardzo podobne.

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

Chociaż jest to ograniczone do pierwszej linii, może być przydatne w większej liczbie przypadków użycia niż pierwsza litera rozwiązanie , ponieważ stosuje wielkie litery do całej linii, a nie tylko do pierwszego słowa. (wszystkie słowa w pierwszym wierszu) W konkretnym przypadku PO mogło to rozwiązać problem.

Uwagi: Jak wspomniano w pierwszych uwagach do rozwiązania, kolejność reguł CSS jest ważna! Zwróć również uwagę, że zmieniłem <a>tag na <div>tag, ponieważ z jakiegoś powodu pseudoelement ::first-linenie działa z <a>tagami natywnie, ale albo <div>albo <p>są w porządku. EDIT:<a> elementem będzie działać , jeśli display: inline-block;jest dodany do .linkklasy. Dzięki Dave Landowi za to, że to zauważył!

Nowa uwaga: jeśli tekst zawija się , utraci wielkie litery, ponieważ w rzeczywistości znajduje się on teraz w drugiej linii (pierwsza linia jest nadal w porządku).


1
Twój ( not working )przykład może zadziałać, dodając display: inline-block;do .linkstylu.
Dave Land

1
Dobre rozwiązanie przez css w przypadku, gdy początkowo wszystkie litery w 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; }

To, co Khan „zrobił” (co jest dla mnie czystsze i działało), znajduje się w komentarzach do posta oznaczonego jako odpowiedź.


4

captializewpływa tylko na pierwszą literę słowa. http://www.w3.org/TR/CSS21/text.html#propdef-text-transform


1
Ta odpowiedź nie jest konstruktywna pomimo faktu, że wyjaśnia, dlaczego PO ma ten problem.
JDuarteDJ

@JDuarteDJ Myślę, że ważne jest, aby znać źródło problemu, który ma miejsce. captialize nie normalizuje ciągów, ale tylko pobiera pierwszy element i przekształca go w wielką literę. Znalazłem te informacje rzeczywiście przydatne
Rodrigo Borba

3

Może być przydatny dla java i jstl.

  1. Zainicjuj zmienną ze zlokalizowaną wiadomością.
  2. Następnie można go użyć w funkcji jstl toLowerCase.
  3. Przekształć za pomocą CSS.

W JSP

1.

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

2.

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

W CSS

3.

.content {
  text-transform:capitalize;
}

W moim przypadku mogłem to zrobić ${fn:toLowerCase(some.key)}bezpośrednio, bez konieczności używania fmt:message. Dzięki.
RaphaelDDL,

3

Możesz to zrobić za pomocą pierwszej litery CSS! np. chciałem to do Menu:

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

Działa tylko z elementami blokowymi - dlatego blok inline!


To nie jest to, o co prosił PO, nie są to małe kapitały.
JDuarteDJ

2

Jeśli dane pochodzą z bazy danych, tak jak w moim przypadku, możesz je obniżyć przed wysłaniem do listy wyboru / listy rozwijanej. Szkoda, że ​​nie możesz tego zrobić w CSS.


1

Po wielu badaniach odkryłem, że funkcja / wyrażenie jQuery zmienia tekst tylko na pierwszą literę wielką, odpowiednio modyfikuję ten kod, aby działał dla pola wejściowego. Kiedy napiszesz coś w polu wprowadzania, a następnie przejdziesz do innego pola lub elementu, tekst tego pola zmieni się tylko z wielkimi literami. Bez względu na tekst wpisywany przez użytkownika z małymi lub dużymi literami:

Postępuj zgodnie z tym kodem:

Krok 1: Wywołaj bibliotekę jquery w nagłówku html:

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

Step-2: Napisz kod, aby zmienić tekst pól wejściowych:

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

Krok 3: Utwórz pola wejściowe HTML z tym samym identyfikatorem, którego używasz w kodzie jQuery, takim jak:

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

Identyfikator tego pola wejściowego to: edit-submit-first-name (Używa go w kodzie jQuery w kroku 2)

** Wynik: upewnij się, że tekst zmieni się po przeniesieniu fokusu z tego pola wejściowego na inny element. Ponieważ używamy tutaj fokusu zdarzenia jquery. Wynik powinien wyglądać następująco: Typ użytkownika: „dziękuję”, zmieni się na „dziękuję”. **

Powodzenia


0

Rozwiązanie PHP w zapleczu:

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

-1

Wiem, że to późna odpowiedź, ale jeśli chcesz porównać wydajność różnych rozwiązań, mam jsPerf, który stworzyłem.

Rozwiązania Regex są na pewno najszybsze.

Oto jsPerf: https://jsperf.com/capitalize-jwaz

Istnieją 2 rozwiązania regex.

Pierwszy używa /\b[a-z]/g. Granica słów będzie wielkimi słowami, takimi jak nieujawnianie do nieujawniania.

Jeśli chcesz używać tylko wielkich liter, które są poprzedzone spacją, użyj drugiego wyrażenia regularnego

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

-1

jeśli używasz jQuery; oto jeden ze sposobów na zrobienie tego:

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

Oto łatwiejsza do odczytania wersja, która robi to samo:

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

Próbny


Myślę, że OP nie używa jQuery.
JDuarteDJ

-6

wszystko źle, że istnieje -> odmiana czcionki: kapitaliki;

text-transform: wielkie litery; tylko pierwsza litera


Wcale nie tego chciał PO. Oczekuje, że na wyjściu będą zapisane tylko pierwsze litery słów; nie cały ciąg.
Andrew Barber

W pytaniu jest niuans, którego nie dostrzegasz: text-transform: capitalize;nie zmienia tekstu, który już zawiera wielkie litery. Zobacz ponownie pytanie: użytkownik już to próbował.
Andrew Barber

następnie może użyć tagu span, aby rozdzielić, które słowa chcą, używając wielkich i małych liter.
Orlando,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.