Biorąc pod uwagę ten HTML i CSS:
span {
display:inline-block;
width:100px;
background-color:palevioletred;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
W rezultacie między elementami SPAN będzie występować szerokość 4 pikseli.
Demo: http://jsfiddle.net/dGHFV/
Rozumiem, dlaczego tak się dzieje, a także wiem, że mogłem pozbyć się tego miejsca, usuwając białe spacje między elementami SPAN w kodzie źródłowym HTML:
<p>
<span> Foo </span><span> Bar </span>
</p>
Miałem jednak nadzieję na rozwiązanie CSS, które nie wymaga manipulacji kodem źródłowym HTML.
Wiem, jak to rozwiązać za pomocą JavaScript - usuwając węzły tekstowe z elementu kontenera (akapitu), tak:
// jQuery
$('p').contents().filter(function() { return this.nodeType === 3; }).remove();
Demo: http://jsfiddle.net/dGHFV/1/
Ale czy ten problem można rozwiązać za pomocą samego CSS?
Odpowiedzi:
Ponieważ ta odpowiedź stała się dość popularna, znacznie ją przepisuję.
Nie zapominajmy o samym pytaniu:
Możliwe jest rozwiązanie tego problemu za pomocą samego CSS, ale nie ma całkowicie niezawodnych poprawek CSS.
Rozwiązaniem, które miałem w mojej początkowej odpowiedzi było dodanie
font-size: 0
do elementu nadrzędnego, a następnie zadeklarowanie sensownościfont-size
dla dzieci.http://jsfiddle.net/thirtydot/dGHFV/1361/
Działa to w najnowszych wersjach wszystkich nowoczesnych przeglądarek. Działa w IE8. To nie działa w Safari 5, ale to nie praca w Safari 6. Safari 5 jest prawie martwy przeglądarka ( 0,33%, sierpień 2015 ).
Większość możliwych problemów z względnymi rozmiarami czcionek nie jest skomplikowana do rozwiązania.
Chociaż jest to rozsądne rozwiązanie, jeśli potrzebujesz tylko poprawki CSS, nie jest to zalecane, jeśli możesz swobodnie zmieniać kod HTML (jak większość z nas).
Oto, co właściwie jako doświadczony programista stron internetowych rozwiązuję ten problem:
Tak to prawda. Usuwam spacje w HTML między elementami bloku wstawianego.
To jest łatwe. To proste. Działa wszędzie. To pragmatyczne rozwiązanie.
Czasem trzeba dokładnie zastanowić się, skąd się bierze biała spacja. Czy dodanie kolejnego elementu z JavaScript doda białe spacje? Nie, jeśli zrobisz to poprawnie.
Udajmy się w magiczną podróż na różne sposoby, aby usunąć białe znaki, z nowym kodem HTML:
Możesz to zrobić, jak zwykle:
http://jsfiddle.net/thirtydot/dGHFV/1362/
Albo to:
Lub użyj komentarzy:
Lub, jeśli używasz PHP lub podobnego:
Lub możesz nawet całkowicie pominąć niektóre znaczniki zamykające (wszystkie przeglądarki mają się dobrze):
Teraz, gdy odszedłem i nudziłem cię na śmierć „tysiącem różnych sposobów na usunięcie białych znaków do trzydziestu kropek”, mam nadzieję, że o wszystkim zapomniałeś
font-size: 0
.Alternatywnie, możesz teraz użyć Flexboksa, aby uzyskać wiele układów, które wcześniej używałeś wbudowanego bloku dla: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
źródło
:(
font-size:0
sztuczka wcale nie jest taka dobra ...Dostępne są przeglądarki zgodne z CSS3
white-space-collapsing:discard
patrz: http://www.w3.org/TR/2010/WD-css3-text-20101005/#white-space-collapsing
źródło
trim-inner
raczej użyćdiscard
?text-space-collapse
:
discard
<p>A long text...</p>
, w których tagi otwierające i zamykające znajdują się w osobnych wierszach niż treść tekstowa. To coś, co robię cały czas, aby moje pliki HTML były uporządkowane i czytelne.float
EDYTOWAĆ:
dziś powinniśmy po prostu korzystać z Flexboksa .
STARA ODPOWIEDŹ:
OK, chociaż głosowałem zarówno na pytania, jak
font-size: 0;
inot implemented CSS3 feature
odpowiedzi, po wypróbowaniu dowiedziałem się, że żadne z nich nie jest prawdziwym rozwiązaniem .W rzeczywistości nie ma nawet jednego obejścia bez silnych efektów ubocznych.
Następnie postanowiłem usunąć spacje (ta odpowiedź dotyczy tego argumentu) między
inline-block
divami z mojegoHTML
źródła (JSP
), obracając to:do tego
to brzydkie, ale działa.
Ale chwileczkę ... co jeśli jestem generowania moje div wewnątrz
Taglibs loops
(Struts2
,JSTL
itp ...)?Na przykład:
Oznaczałoby to, że nie można tego wszystkiego wsadzić
nieczytelne, trudne do utrzymania i zrozumienia itp.
Rozwiązanie, które znalazłem:
W ten sposób będziesz mieć czytelny i poprawnie wcięty kod.
I, jako pozytywny efekt uboczny,
HTML source
choć zaatakowane pustymi komentarzami, spowodują prawidłowe wcięcie;weźmy pierwszy przykład. Moim skromnym zdaniem to:
jest lepszy niż to:
źródło
Dodawaj komentarze między elementami, aby NIE miały spacji. Dla mnie jest to łatwiejsze niż resetowanie rozmiaru czcionki do zera, a następnie ustawienie go z powrotem.
źródło
Wszystkie techniki eliminacji przestrzeni
display:inline-block
to paskudne włamania ...Użyj Flexbox
Jest niesamowity, rozwiązuje wszystkie te układy bloków wbudowanych, a od 2017 roku obsługuje 98% przeglądarek (więcej, jeśli nie obchodzi cię stare IE).
źródło
Dodaj
display: flex;
do elementu nadrzędnego. Oto rozwiązanie z prefiksem:Wersja uproszczona 👇
Napraw z prefiksem 👇
źródło
To jest ta sama odpowiedź, którą podałem w pokrewnej treści: Wyświetlanie: Blok wbudowany - co to za przestrzeń?
Jest naprawdę bardzo prosty sposób na usunięcie białych znaków z bloku wbudowanego, który jest łatwy i semantyczny. Nazywa się to czcionką niestandardową ze spacjami o zerowej szerokości, co pozwala zwinąć białe znaki (dodane przez przeglądarkę dla elementów wstawianych, gdy znajdują się w osobnych wierszach) na poziomie czcionki przy użyciu bardzo małej czcionki. Kiedy zadeklarujesz czcionkę, po prostu zmienisz
font-family
na pojemniku i ponownie na dzieciach i voila. Lubię to:Dopasuj do smaku. Oto pobranie czcionki, którą właśnie przygotowałem w font-forge i przekonwertowałem za pomocą generatora czcionek FontSquirrel. Zajęło mi to całe 5 minut.
@font-face
Deklaracja css jest dołączona: spakowana czcionka spacji o zerowej szerokości . Jest na Dysku Google, dlatego musisz kliknąć Plik> Pobierz, aby zapisać go na komputerze. Prawdopodobnie konieczna będzie również zmiana ścieżek czcionek, jeśli skopiujesz deklarację do głównego pliku css.źródło
flex-wrap
co najmniej v28 ( srsly? ), Ale do tego czasu jest to doskonała awaria.Dwie kolejne opcje oparte na module tekstowym CSS poziom 3 (zamiast tego,
white-space-collapsing:discard
który został usunięty z wersji specyfikacji):word-spacing: -100%;
Teoretycznie powinien robić dokładnie to, co jest potrzebne - skracać białe spacje między „słowami” o 100% szerokości znaku spacji, tj. Do zera. Ale wydaje się, że nigdzie nie działa, a ta funkcja jest oznaczona jako „zagrożona” (można ją również usunąć ze specyfikacji).
word-spacing: -1ch;
Skraca odstępy między wyrazami o szerokość cyfry „0”. W czcionce monospace powinna być dokładnie równa szerokości znaku spacji (i każdego innego znaku). Działa to w Firefox 10+, Chrome 27+ i prawie działa w Internet Explorerze 9+.
Skrzypce
źródło
' '
i'0'
. W czcionkach innych niż monospace nie ma odpowiedniej proporcji magicznej między szerokościami' '
i'0'
znakami, więcch
nie jest to wcale pomocne.word-spacing
moglibyśmy użyćletter-spacing
z dowolną dużą ujemną wartością, jak pokazano w mojej odpowiedziNiestety jest to rok 2019 i
white-space-collapse
nadal nie jest zaimplementowany.W międzyczasie podaj element nadrzędny
font-size: 0;
i ustawfont-size
elementy podrzędne. To powinno załatwić sprawęźródło
Użyj Flexboksa i zrób rezerwę (na podstawie powyższych sugestii) dla starszych przeglądarek:
źródło
Prosty:
Nie ma potrzeby dotykania elementu nadrzędnego.
Tutaj tylko warunek: rozmiar czcionki elementu nie może być zdefiniowany (musi być równy rozmiarowi czcionki rodzica).
0.25em
jest wartością domyślnąword-spacing
W3Schools - właściwość odstępów między wyrazami
źródło
rozmiar czcionki: 0; może być nieco trudniejszy w zarządzaniu ...
Myślę, że następujące kilka wierszy jest o wiele lepsze i bardziej przydatne do ponownego użycia, i oszczędza czas niż jakiekolwiek inne metody. Ja osobiście korzystam z tego:
Następnie możesz użyć go w następujący sposób ...
O ile wiem (mogę się mylić), ale wszystkie przeglądarki obsługują tę metodę.
OBJAŚNIENIE :
To działa (być może -3px może być lepsze) dokładnie tak, jak można się spodziewać.
class="items"
elementu nadrzędnego każdego bloku wbudowanego.NIE będziesz musiał wracać do css i dodawać kolejnej reguły css dla swoich nowych wbudowanych bloków.
Rozwiązywanie dwóch problemów jednocześnie.
Zwróć także uwagę na
>
(większy niż znak), co oznacza, że * / wszystkie dzieci powinny mieć blok wstawiany.http://jsfiddle.net/fD5u3/
UWAGA: Zmodyfikowałem, aby uwzględnić dziedziczenie odstępów między literami, gdy opakowanie ma opakowanie potomne.
źródło
-4px
dlaletter-spacing
których może nie wystarczyć dla dużych rozmiarów czcionek, np .: zobacz to skrzypce , moglibyśmy użyć większej wartości, jak w moim pościeChociaż technicznie nie jest to odpowiedź na pytanie: „Jak usunąć odstęp między elementami bloku wbudowanego?”
Możesz wypróbować rozwiązanie Flexbox i zastosować poniższy kod, a miejsce zostanie usunięte.
Możesz dowiedzieć się więcej na ten temat pod tym linkiem: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
źródło
Nie jestem całkiem pewien, czy chcesz zrobić dwa niebieskie przęsła bez odstępu, czy też chcesz obsłużyć inne białe spacje, ale jeśli chcesz usunąć odstęp:
I zrobione.
źródło
Zasadniczo takich elementów używamy w różnych liniach, ale w przypadku
display:inline-block
użycia tagów w tej samej linii usuniesz spację, ale w innej linii nie.Przykład z tagami w innej linii:
Przykład ze znacznikami w tej samej linii
Inną skuteczną metodą jest zadanie CSS, które wykorzystuje
font-size:0
element nadrzędny i dajefont-size
elementowi podrzędnemu tyle, ile chcesz.źródło
Miałem teraz ten problem i
font-size:0;
odkryłem, że w Internet Explorerze 7 problem pozostaje, ponieważ Internet Explorer myśli „Rozmiar czcionki 0?!?! WTF, czy jesteś szalony?” - Więc w moim przypadku Eric CS Meyer zresetował się ifont-size:0.01em;
mam różnicę 1 piksela od Internet Explorera 7 do Firefoksa 9, więc myślę, że to może być rozwiązanie.źródło
źródło
float
idisplay:inline-block
dlaspan
nich miały być awariami w przypadku, jeśliflex
nie są obsługiwane, alefloat
skutecznie odrzuciłyby efektinline-block
, więc ten drugi wydaje się zbędny.Ostatnio zmierzyłem się z tym i zamiast ustawić rodzica,
font-size:0
a następnie ustawić dziecko z powrotem na rozsądną wartość, uzyskuję spójne wyniki, ustawiając pojemnik nadrzędny,letter-spacing:-.25em
a następnie dziecko z powrotemletter-spacing:normal
.W alternatywnym wątku zauważyłem komentarz komentatora, który
font-size:0
nie zawsze jest idealny, ponieważ ludzie mogą kontrolować minimalne rozmiary czcionek w swoich przeglądarkach, całkowicie negując możliwość ustawienia rozmiaru czcionki na zero.Korzystanie z ems wydaje się działać niezależnie od tego, czy określony rozmiar czcionki to 100%, 15 punktów lub 36 pikseli.
http://cdpn.io/dKIjo
źródło
Myślę, że istnieje bardzo prosta / stara metoda, która jest obsługiwana przez wszystkie przeglądarki, nawet IE 6/7. Możemy po prostu ustawić
letter-spacing
dużą wartość ujemną w obiekcie nadrzędnym, a następnie ustawić ją z powrotemnormal
w elementach potomnych:źródło
letter-spacing:normal
we wszystkich elementach potomnych.letter-spacing
jest 99,99% razy tak jaknormal
. rozmiar czcionki nie ma takiej stałej wartości i bardzo zależy od projektu. może to być mała wartość lub duża wartość w oparciu o rodzinę czcionek i inne rzeczy ... Nigdy w życiu nie pamiętam, aby zobaczyć / użyć specjalnej wartości (innej niż 0 / normalna)letter-spacing
, więc myślę, że jest bezpieczniejsza i lepszy wybórNajprostszą odpowiedzią na to pytanie jest dodanie.
css
link codepen: http://jsfiddle.net/dGHFV/3560/
źródło
Ze wspornikami PHP:
źródło
Mam zamiar rozwinąć nieco odpowiedź user5609829, ponieważ uważam, że inne rozwiązania tutaj są zbyt skomplikowane / zbyt dużo pracy. Zastosowanie elementów
margin-right: -4px
do wbudowanych bloków usunie odstępy i jest obsługiwane przez wszystkie przeglądarki. Zobacz zaktualizowane skrzypce tutaj . Dla zainteresowanych z wykorzystaniem marże negatywne, spróbuj dając tym poczytać.źródło
Specyfikacja poziomu 4 modułu tekstowego CSS definiuje a
text-space-collapse
właściwość, która pozwala kontrolować, w jaki sposób przetwarzana jest biała przestrzeń wewnątrz i wokół elementu.Tak więc, jeśli chodzi o twój przykład, musisz po prostu napisać to:
Niestety żadna przeglądarka nie implementuje jeszcze tej właściwości (od września 2016 r.), Jak wspomniano w komentarzach do odpowiedzi HBP .
źródło
Znalazłem czyste rozwiązanie CSS, które działało dla mnie bardzo dobrze we wszystkich przeglądarkach:
źródło
Dodaj
white-space: nowrap
do elementu kontenera:CSS:
HTML:
Oto plunker .
źródło
Istnieje wiele rozwiązań, takich jak
font-size:0
,word-spacing
,margin-left
,letter-spacing
i tak dalej.Zwykle wolę używać,
letter-spacing
ponieważ-1em
.).word-spacing
imargin-left
kiedy ustawimy większą wartość jak-1em
.font-size
nie jest wygodne, gdy próbujemy użyćem
jakofont-size
jednostki.Tak więc,
letter-spacing
wydaje się być najlepszym wyborem.Jednak muszę cię ostrzec
kiedy używasz
letter-spacing
, lepiej korzystaj z innych-0.3em
lub-0.31em
nie.Jeśli używasz Chrome (wersja testowa 66.0.3359.139) lub Opera (wersja testowa 53.0.2907.99), możesz zobaczyć:
Jeśli używasz przeglądarki Firefox (60.0.2), IE10 lub Edge, możesz zobaczyć:
To interesujące. Sprawdziłem więc odstępy między literami mdn i znalazłem to:
Wydaje się, że to jest powód.
źródło
Dodaj
letter-spacing:-4px;
nadrzędnyp
css i dodajletter-spacing:0px;
do swojegospan
css.źródło
Pomyślałem, że dodam coś nowego do tego pytania, ponieważ chociaż wiele obecnie podanych odpowiedzi jest więcej niż adekwatnych i trafnych, istnieją pewne nowe właściwości CSS, które mogą osiągnąć bardzo czysty wynik, z pełną obsługą wszystkich przeglądarek i niewiele żadnych „hacków”. Odsuwa się
inline-block
to, ale daje takie same wyniki jak zadane pytanie.Te właściwości CSS to
grid
CSS Grid jest wysoce obsługiwany ( CanIUse ) oprócz IE, który potrzebuje tylko
-ms-
prefiksu, aby mógł działać.CSS Siatka jest bardzo elastyczna i ma wszystkie dobre części z
table
,flex
orazinline-block
elementy i przynosi je w jednym miejscu.Podczas tworzenia
grid
możesz określić odstępy między wierszami i kolumnami. Domyślna przerwa jest już ustawiona na,0px
ale możesz zmienić tę wartość na dowolną.Krótko mówiąc, oto odpowiedni przykład działania:
źródło
display:grid
elementu jest zablokowane, więc wyświetlanie nie jest tak bardzo ważne: grid pomaga pracować z układami bloków wbudowanych, ale raczej pozwala zastąpić pracęinline-block
z czymś, w czym można kontrolować „rynny”, ponieważ to pytanie chce. Jestem też naprawdę zaskoczony, że nikt wcześniej nie odpowiedział na rozwiązanie CSS Grid Layout.inline-block
. I tak, byłem również zaskoczony, domyślam się, że nikt zgrid
doświadczeniem tak naprawdę do tego nie doszedł.Innym sposobem, jaki znalazłem, jest zastosowanie marginesu po lewej jako wartości ujemnych, z wyjątkiem pierwszego elementu wiersza.
źródło
Każde pytanie, które próbuje usunąć przestrzeń między
inline-block
s, wydaje<table>
mi się ...Wypróbuj coś takiego:
źródło