Ukryj tekst za pomocą css

306

Mam tag w moim html:

<h1>My Website Title Here</h1>

Za pomocą css chcę zamienić tekst na moje rzeczywiste logo. Mam logo, że nie ma problemu, zmieniając rozmiar tagu i umieszczając obraz tła za pomocą css. Nie mogę jednak wymyślić, jak pozbyć się tekstu. Widziałem to wcześniej, po prostu wypychając tekst z ekranu. Problem polega na tym, że nie pamiętam, gdzie to widziałem.

Micheasz
źródło
3
istnieje wiele nieaktualnych odpowiedzi: rozważ głosowanie nad nowszą odpowiedzią stackoverflow.com/a/27769435/2586761, aby ją
opublikować

Odpowiedzi:

426

To jest jeden sposób:

h1 {
    text-indent: -9999px;                 /* sends the text off-screen */
    background-image: url(/the_img.png);  /* shows image */
    height: 100px;                        /* be sure to set height & width */
    width: 600px;
    white-space: nowrap;            /* because only the first line is indented */
}

h1 a {
    outline: none;  /* prevents dotted line when link is active */
}

Oto kolejny sposób, aby ukryć tekst, unikając ogromnego pola 9999 pikseli, które utworzy przeglądarka:

h1 {
    background-image: url(/the_img.png);  /* shows image */
    height: 100px;                        /* be sure to set height & width */
    width:  600px;

    /* Hide the text. */
    text-indent: 100%;
    white-space: nowrap;
    overflow: hidden;
}
nicholaides
źródło
5
długie tytuły będą miały problem z tą metodą, ponieważ tylko tekst przed zawijaniem wyrazów jest wcięty, a specyfikacja W3C nie określa sytuacji dla ujemnego wcięcia, więc może to mieć nieprzewidywalne wyniki
Chris Farmiloe 23.01.2009
3
Jeśli użyjesz tej metody, powinieneś dodać „przepełnienie: ukryte”, aby zapobiec strzelaniu w pole wyboru seirda w lewo (szczególnie z linkami)
willoller 23.01.2009
4
Jeśli masz jakieś linki w elementach z ujemnym wcięciem w tekście, upewnij się, że podałeś także „zarys: brak”, w przeciwnym razie po lewej stronie ekranu pojawi się kropkowana ramka.
nickf
9
Wolę używać „wcięcia tekstu: -9999px;” tylko po to, aby upewnić się, że tekst jest naprawdę daleko od ekranu. Trochę defensywnej paranoi.
Andy Ford
4
Dodaj także „spację: teraz”, aby być po bezpiecznej stronie, jeśli tekst jest długi, ponieważ wcięty jest tylko pierwszy wiersz.
Andrew Moore,
177

Dlaczego nie po prostu użyć:

h1 { color: transparent; }
nesono
źródło
16
Dlaczego nie? Ponieważ Google tego nie lubi.
alekwisnia
32
Walidacja (CSS 2.1): „transparent” nie jest prawidłową wartością właściwości „color”.
HasanG,
15
Tekst stanie się widoczny, jeśli użytkownik go wybierze (STRG + A itp.) - Wygląda to bardzo nieprofesjonalnie! Pozdrowienia Christopher
Christopher Stock
24
@ HasanGürsoy i przyszli pracownicy Google - „CSS3 rozszerza wartość koloru o słowo kluczowe„ przezroczyste ”....”
ABMagil
11
color: transparent;współpracuje z user-select: none;, chyba że zastąpisz kolor.
stan-z
162

Po prostu dodaj font-size: 0;do elementu zawierającego tekst.

.hidden { font-size: 0; }
  font-size: 0; hides text. <span class="hidden"> You can't see me :) </span>

dzielności
źródło
1
Właśnie tego potrzebowałem. Chciałem ukryć to, co było w div, ale pokazać, co było w rozpiętości dzieci (aby ukryć interpunkcję między nimi).
mskfisher
2
To wydaje się być najbardziej logiczną (czytaj: co najmniej dziwną) metodą - zastanawiam się jednak, jak dobrze jest obsługiwana w różnych przeglądarkach? (Potwierdzam, że działa w przeglądarce Firefox).
Brian Lacy
1
Nadal pokazuje tekst bardzo mały w większej liczbie przeglądarek niż tylko IE7, nie jest to kompletne rozwiązanie dla wielu przeglądarek.
macguru2000,
8
Przetestowałem sztuczkę {font-size: 0} w Chrome 27, Firefox 17, Safari dla Windows 5.1.7, Opera 12.12, IE8, IE9, IE10 - działa we wszystkich tych przeglądarkach. Ta sztuczka jest najlepsza, jeśli nie możesz ustawić obrazu tła na samym elemencie (np. Ponieważ używasz ciasno upakowanego obrazu duszka, a wymagana ikona nie ma wystarczającej ilości pustych wypełnień wokół niego) i musisz użyć pseudo selektora , np. element: po, aby wyświetlić obraz tła.
beluga
1
To również zmienia rozmiar div, więc nie polecam tego.
Stephan Bijzitter
30

Najbardziej przyjaznym dla różnych przeglądarek sposobem jest napisanie HTML jako

<h1><span>Website Title</span></h1>

następnie użyj CSS, aby ukryć zakres i zastąpić obraz

h1 {background:url(/nicetitle.png);}
h1 span {display:none;}

Jeśli możesz użyć CSS2, istnieje kilka lepszych sposobów korzystania z tej contentwłaściwości, ale niestety sieć nie jest jeszcze w 100% dostępna.

Chris Farmiloe
źródło
Pamiętaj jednak, aby ustawić atrybut szerokości i wysokości również dla obrazu - i upewnij się, że ustawione są „dopełnianie” i „margines”, ponieważ przeglądarki mają różne pomysły na to, ile dopełnienia / marginesu musi mieć znacznik H1.
Wadą jest to, że jeśli obrazy są wyłączone lub jeśli pojawia się bot obsługujący css, tytuł nie będzie widoczny.
willoller
13
Ważny tekst na wyświetlaczu prawdopodobnie nie zostanie pominięty przez boty wyszukiwarek i czytniki ekranu. Zamiast tego użyj wcięcia tekstu.
dylanfm
1
To nic nie da, OP może równie dobrze usunąć tekst w tytule. Czytniki ekranu nic nie robią z żadnym wyświetlaniem ...
Idris Dopico Peña
23

Ukrywanie tekstu z myślą o ułatwieniach dostępu:

Oprócz innych odpowiedzi, oto inne przydatne podejście do ukrywania tekstu.

Ta metoda skutecznie ukrywa tekst, ale pozwala pozostać widocznym dla czytników ekranu. Jest to opcja do rozważenia, czy dostępność stanowi problem.

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0,0,0,0);
    border: 0;
}

Warto zauważyć, że ta klasa jest obecnie używana w Bootstrap 3 .


Jeśli chcesz przeczytać o dostępności:

Josh Crozier
źródło
Działa to dobrze w przypadku dodawania elementu jest tylko czytnikiem ekranu; jednak nie działa z oryginalnym pytaniem, gdzie obraz ma być wyświetlany przez obraz tła określony w css.
vossad01
@ vossad01 - Jeśli nie możesz dodać kolejnego elementu i utkniesz w jednym elemencie (jak w przypadku, o którym wspomniałeś), dobrym rozwiązaniem byłoby użycie pseudoelementu ... również opublikowałem to odpowiedź 6 lat po zadaniu pierwszego pytania, a moja odpowiedź była skierowana do szerszego grona odbiorców, ponieważ pytanie to wydaje się popularne.
Josh Crozier
14

Zobacz mezzoblue, aby uzyskać ładne podsumowanie każdej techniki, z mocnymi i słabymi stronami, a także przykładowy HTML i CSS.

darasd
źródło
10

Tak wiele skomplikowanych rozwiązań.

Najłatwiej jest po prostu użyć:

color:rgba(0,0,0,0)
Molo
źródło
Świetny! Działa to dla dowolnego koloru tła. Dzięki.
Sandeep Amarnath
8

możesz po prostu ukryć tekst, dodając ten atrybut:

font size: 0 !important;
Omid Ahmadyani
źródło
Warto również sprawdzić, czy !importantklauzula jest rzeczywiście potrzebna w twoim przypadku. W moim przypadku bez niego też działało dobrze.
Eerik Sven Puudist
6

Nie używaj { display:none; }Powoduje, że treść jest niedostępna. Chcesz, aby czytniki ekranu widziały Twoje treści i wizualnie je stylizowały, zastępując tekst obrazem (np. Logo). Korzystając text-indent: -999px;z podobnej metody, tekst nadal tam jest - tylko wizualnie. Użyj display:none, a tekst zniknie.

jensimmons
źródło
5
<style>
body {
     visibility:hidden
}
body .moz-signature p{
    visibility:visible
}
</style>

Powyższe działa również w najnowszym Thunderbirdzie.

kamalesh
źródło
Zauważ, że użycie tej metody powoduje, że tekst nie jest czytelny dla większości czytników ekranu - patrz stackoverflow.com/questions/1755656/...
Jordan Lev
5

możesz użyć background-imagewłaściwości css i z-indexupewnić się, że obraz pozostaje przed tekstem.

Jobo
źródło
Przykład? Nie rozumiem, jak to z-indexdotyczy background-image.
Martynas Jusevičius
5

Dlaczego nie używasz:

<li><a href="#">bla</a></li>

a {
    opacity: 0.0;
    font-size: 1px;
}

li {
    background-image: url('test.jpg');
}

Jeśli nie masz żadnego elementu span lub div, działa idealnie dla linków.

Hans
źródło
4

Odpowiedzią jest utworzenie zakresu z właściwością

{display:none;}

Możesz znaleźć przykład na tej stronie

Andrei Krotkov
źródło
1
Niektóre opinie negatywne prawdopodobnie dotyczą problemów związanych z dostępnością - ważny punkt. Ale w moim przypadku ściągam menu z serwisu menu restauracji na stronę internetową za pośrednictwem ich serwisu internetowego. Właściciel restauracji nie chce, aby ceny były wyświetlane (ale ta sama usługa jest używana do drukowania rzeczywistych menu). W takiej sytuacji w ogóle nie chce się cen w witrynie. Dobrze jest znać wszystkie możliwe podejścia.
Marvo
4

W rzeczywistości jest to obszar dojrzały do ​​dyskusji, z wieloma dostępnymi subtelnymi technikami. Ważne jest, aby wybrać / opracować technikę spełniającą Twoje potrzeby, w tym: czytniki ekranu, kombinacje włączania / wyłączania skryptów, obrazy / css / skrypty, seo itp.

Oto kilka dobrych zasobów na początek standardowych technik zastępowania obrazów:

http://faq.css-standards.org/Image_Replacement

http://www.alistapart.com/articles/fir

http://veerle.duoh.com/blog/links/#l-10

willoller
źródło
3

Użyj znacznika Warunek dla innej przeglądarki i używając css musisz umieścić, height:0pxa width:0pxtakże musisz umieścić font-size:0px.

kedar
źródło
3

Jeśli chodzi o to, aby tekst wewnątrz elementu był niewidoczny, ustaw atrybut koloru tak, aby miał 0 krycia, używając wartości rgba, takiej jak color:rgba(0,0,0,0);czysty i prosty.

Cafe Coder
źródło
3

Nie pamiętam, gdzie to wziąłem, ale z powodzeniem go używam od wieków.

  =hide-text()
    font: 0/0 a
    text-shadow: none
    color: transparent

Mój mixin jest w sass, jednak możesz go używać w dowolny sposób. Dla pewności trzymam .hiddenklasę gdzieś w moim projekcie, aby dołączyć do elementów, aby uniknąć powielania.

jego odświeżony
źródło
Myślę, że gdzieś przeczytałem, że ta wersja jest preferowana, ponieważ ujemne wcięcie w tekście spowoduje, że przeglądarka wyświetli pole o długości 10000 pikseli (lub jakikolwiek inny przykład użyjesz). Zmiana czcionki, jak w tym przykładzie, nie spowoduje, że przeglądarka utworzy duże pole, które próbuje wyrenderować.
Gambo
2
h1 {
    text-indent: -3000px; 
    line-height: 3000px;
    background-image: url(/LOGO.png);
    height: 100px; width:  600px;  /* height and width are a must */

}
Vcedor
źródło
3
Dlaczego istnieje wysokość linii?
SandRock
2

Wypróbuj ten kod, aby skrócić i ukryć tekst

.hidetxt{

  width: 346px;
  display: table-caption;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  cursor: no-drop;
  
}

.hidetxt:hover { 

  visibility: hidden;
  
}
<div class="hidetxt">
<p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when</p>
</div>

lub aby ukryć użycie w swojej klasie css .hidetxt { visibility: hidden; }

omar kerr
źródło
2

repalce treści za pomocą CSS

 h1{  font-size: 0px;}
 h1:after {
    content: "new content";
    font-size: 15px;
  }
Hossein Hajizadeh
źródło
1

Zwykle używam:

span.hide
{
  position:fixed;
  right:-5000px;
}
Anze
źródło
1

Jeśli możemy edytować znaczniki, życie może być łatwiejsze, wystarczy usunąć tekst i być szczęśliwym. Ale czasami znaczniki zostały umieszczone przez kod JS lub po prostu nie możemy go w ogóle edytować, szkoda, że ​​css okazało się jedyną bronią, jaką mamy do dyspozycji.

Nie możemy umieścić <span>zawijania tekstu i ukryć całego tagu. Nawiasem mówiąc, niektóre przeglądarki nie tylko ukrywają elementy, display:noneale także wyłączają elementy wewnątrz.

Zarówno font-size:0pxi color:transparentmoże być dobre rozwiązania, ale niektóre przeglądarki nie ich zrozumieć. Nie możemy na nich polegać.

Sugeruję:

h1 {
  background-image: url(/LOGO.png);  /* Our image */
  text-indent: -3000px;  /* Send text out of viewable area */
  height: 100px; width: 600px;  /* height and width are a must, agree */
  overflow:hidden;  /* make sure our size is respected */
}

Korzystanie overflow:hiddenwymusza naszą szerokość i wysokość. Niektóre przeglądarki (nie będą ich nazywać ... IE ) mogą odczytywać szerokość i wysokość jako min-widthi min-height. Chcę zapobiec powiększeniu pudełka.

Francisco
źródło
1

Użycie wartości zerowej dla elementu font-sizei line-heightw elemencie robi dla mnie lewę:

<style>
    .text {
        display: block;
        width: 200px;
        height: 200px;

        font-size: 0;
        line-height: 0;
    }
</style>

<span class="text">
    Invisible Text
</span>
HelpNeeder
źródło
1

Aby ukryć tekst przed HTML, użyj właściwości wcięcia tekstu w css

.classname {
 text-indent: -9999px;
 white-space: nowrap; 
}

/ * w przypadku tekstu dynamicznego należy dodać spację, aby zastosowany css nie przeszkadzał. nowrap oznacza, że ​​tekst nigdy nie będzie zawijany do następnego wiersza, tekst będzie kontynuowany w tym samym wierszu, aż do <br>napotkania znacznika

urmila manjarikar
źródło
1

Jednym ze sposobów, w jaki to osiągam, jest użycie :beforelub :after. Stosowałem to podejście od kilku lat, a szczególnie dobrze działa z ikonami wektorowymi glifów.

h1 {
    position: relative;
    text-indent: -9999px;                 /* sends the text off-screen */
    }
h1:before {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    display: block;
    width: 600px;
    height: 100px;
    content: ' ';
    background: transparent url(/the_img.png) 0 0 no-repeat;
    }
Pegues
źródło
0

To działało dla mnie z rozpiętością (walidacja nokautu).

<span class="validationMessage">This field is required.</span>

.validationMessage {
    background-image: url('images/exclamation.png');
    background-repeat: no-repeat;
    margin-left: 5px;
    width: 16px;
    height: 16px;
    vertical-align: top;

    /* Hide the text. */
    display: inline-block;
    overflow: hidden;
    font-size: 0px;
}
Karson
źródło
0

Rozwiązanie, które działa dla mnie:

HTML

<div class="website_title"><span>My Website Title Here</span></div>

CSS

.website_title {
    background-image: url('../images/home.png');
    background-repeat: no-repeat;
    height: 18px;
    width: 16px;
}

.website_title span {
    visibility: hidden;
}
Sébastien Gicquel
źródło
-1

Najlepsza odpowiedź działa w przypadku krótkiego tekstu, ale jeśli tekst jest zawijany, po prostu pojawia się na obrazie.

Jednym ze sposobów na to jest łapanie błędów w module obsługi jquery. Spróbuj załadować obraz, jeśli się nie powiedzie, pojawi się błąd.

$('#logo img').error(function(){
    $('#logo').html('<h1>My Website Title Here</h1>');
});

Zobacz PRZYKŁADOWY KOD

Shanimal
źródło
-1
h1{
   background:url("../images/logo.png") no-repeat;
   height:180px;
   width:200px;
   display:inline-block;
   font-size:0px !important;
   text-intent:-9999999px !important;
   color:transparent !important;
 }
Harden Rahul
źródło
3
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
Benjamin W.