Entfernen von Leerzeichen zwischen HTML-Elementen bei Verwendung von Zeilenumbrüchen

110

Ich habe eine Seite mit einer Zeile von ca. 10 imgs. Zur besseren Lesbarkeit des HTML-Codes möchte ich zwischen jedem imgTag einen Zeilenumbruch einfügen, aber dadurch wird ein Leerzeichen zwischen den Bildern gerendert, was ich nicht möchte. Kann ich etwas anderes tun, als in der Mitte der Tags zu brechen, anstatt zwischen ihnen?

Bearbeiten: Hier ist ein Screenshot von dem, was ich bisher habe. Ich möchte, dass die Bilder des Buchrückens in zufälligen Kombinationen mit PHP angezeigt werden. Deshalb brauche ich separate imgTags.

Bildschirmfoto

Skilldrick
quelle
Wenn Sie Smarty verwenden , können Sie verwenden {strip}. Andere Template-Engines sollten ähnliche Tags haben.
Benutzer

Antworten:

68

Sie könnten CSS verwenden. Wenn Sie display: block oder float: links auf den Bildern einstellen, können Sie Ihren eigenen Abstand definieren und den HTML-Code nach Ihren Wünschen formatieren, das Layout jedoch auf eine Weise beeinflussen, die möglicherweise angemessen ist oder nicht.

Andernfalls handelt es sich um Inline-Inhalte, sodass die HTML-Formatierung wichtig ist, da sich die Bilder effektiv wie Wörter verhalten.

edeverett
quelle
Dies ist mein Lieblingsansatz. Es kann jedoch manchmal zu Fragen führen, warum kein Text angezeigt wird, wenn ich später vergesse, eine Schriftgröße für untergeordnete Elemente zu definieren.
Astrotim
159

Entschuldigung, wenn dies alt ist, aber ich habe gerade eine Lösung gefunden.

Versuchen Sie, den font-sizeWert auf 0 zu setzen. Daher sind die Leerzeichen zwischen den Bildern 0 breit und die Bilder sind nicht betroffen.

Ich weiß nicht, ob dies in allen Browsern funktioniert, aber ich habe es mit Chromium und einigen <li>Elementen mit versucht display: inline-block;.

opatut
quelle
9
Ich kann bestätigen, dass dies in Firefox und Safari unter Mac OS X sowie in Chrome funktioniert. Ich kann nicht glauben, dass dies nicht die beste Antwort ist. Was für eine großartige Idee, die einzige, von der ich denke, dass sie die Frage wirklich beantwortet / dem Fragesteller gibt, wonach er sucht.
Doug
16
Nur dass dadurch Layouts, die emEinheiten verwenden , beschädigt werden .
Devius
6
Wenn font-sizeSie den Wert auf 0 setzen, können Sie das emGerät nach diesem Zeitpunkt nicht mehr für skalierbares Design verwenden. Für manche Menschen ist diese Antwort nutzlos.
LB
3
Ich würde auch Chris Coyiers Analyse auf seiner Seite unter dem Abschnitt "Setzen Sie die Schriftgröße auf Null" überprüfen, um einige Details zu anderen Fällen zu erhalten, in denen dies möglicherweise nicht funktioniert: css-tricks.com/fighting-the-space-between -inline-block-elements
Chris Kempen
Und jetzt, wo wir Flexbox haben, ist das alles nicht mehr erforderlich :) Endlich gutes Layout: css-tricks.com/snippets/css/a-guide-to-flexbox
opatut
70

Sie könnten Kommentare verwenden.

 <img src="..." alt="..."><!--
 --><img src="..." alt="..."><!--
 --><img src="..." alt="..."><!--
 --><img src="..." alt="...">

Ich würde mir allerdings Sorgen um die Semantik machen, eine Reihe von Bildern nebeneinander zu haben.

QUentin
quelle
1
Gute Idee. Die Bilder dienen der Dekoration - ist das semantisch wichtig?
Skilldrick
13
Dekorationsbilder gehören in das CSS, nicht in das HTML!
Konrad Rudolph
11
Es kommt darauf an, wie dekorativ die Bilder sind. Eine hübsche Grenze? Das sollte in CSS sein. Eine Reihe kleiner Fotos von Flugzeugen auf einer Website über das Fliegen? Möglicherweise Inhalt ohne Textäquivalent.
Quentin
1
@ MihaiAlexandruBîrsan - font-size:0ist in vielen Fällen schrecklich, weil Sie die Erbschaft verlieren. Ja, Sie könnten remEinheiten verwenden, aber dennoch werden Ihre Medienabfragen die Funktion für dieses Element stoppen und Sie müssen sie alle ändern
vsync
1
Ich habe gerade diesen kleinen Trick entdeckt und dann deine Antwort gesehen. Ein bisschen Cruft, aber es ist ein langer Weg, um den HTML-Code nicht alle in einer langen Zeile zusammenzufassen.
Nick Bedford
26

Sie haben zwei Möglichkeiten, ohne ungefähre Aufgaben mit CSS zu erledigen. Die erste Option besteht darin, Javascript zu verwenden, um nur untergeordnete Leerzeichen aus Tags zu entfernen. Eine schönere Option ist jedoch die Tatsache, dass Leerzeichen in Tags vorhanden sein können, ohne dass diese eine Bedeutung haben. Wie so:

<div id="[divContainer_Id]"
    ><img src="[image1_url]" alt="img1"
    /><img src="[image2_url]" alt="img2"
    /><img src="[image3_url]" alt="img3"
    /><img src="[image4_url]" alt="img4"
    /><img src="[image5_url]" alt="img5"
    /><img src="[image6_url]" alt="img6"
/></div>
Paul de Vrieze
quelle
2
Eigentlich bevorzuge ich diesen Stil. Ja, es ist hässlich, aber es erfordert keine CSS-Hacks, die alle möglichen Nebenwirkungen haben können.
Stijn de Witt
24

Flexbox kann dieses alte Problem leicht beheben:

.image-wrapper {
  display: flex;
}

Weitere Informationen zu Flexbox: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

William Grasel
quelle
4
Heutzutage ist Flexbox die sauberste und einfachste Lösung. Ich denke, das sollte hier die beste Antwort sein. { flex-direction: row; flex-wrap: nowrap; }könnte für mehr Lesbarkeit hinzugefügt werden.
Robert Kusznier
2
Dies ist die beste moderne Antwort
Nate
@ RobertKusznier Ich bin nicht einverstanden mit der Angabe flex-direction: rowund flex-wrap: nowrapsie sind sowieso die Standardeinstellung. Halten Sie es einfach ist in der Regel am besten! Außerdem wird der Benutzer in den meisten Fällen tatsächlich dies wünschen flex-wrap: wrap.
März 2377
13

Nach viel zu viel Recherche, Versuch und Irrtum habe ich einen Weg gefunden, der gut zu funktionieren scheint und bei dem die Schriftgröße für die untergeordneten Elemente nicht manuell neu eingestellt werden muss, sodass ich eine standardisierte em-Schriftgröße für das gesamte Dokument habe .

In Firefox ist dies ziemlich einfach. Legen Sie einfach word-spacing: -1emdas übergeordnete Element fest. Aus irgendeinem Grund ignoriert Chrome dies (und soweit ich es getestet habe, ignoriert es den Wortabstand unabhängig vom Wert). Abgesehen davon füge ich letter-spacing: -.31emden Eltern und letter-spacing: normalden Kindern hinzu. Dieser Bruchteil eines Em ist NUR WENN die Größe Ihres Em standardisiert ist . Firefox ignoriert seinerseits negative Werte für den Buchstabenabstand, sodass es nicht zum Wortabstand hinzugefügt wird.

Ich habe dies auf Firefox 13 (Win / Ubuntu, 14 auf Android), Google Chrome 20 (Win / Ubuntu), Android Browser auf ICS 4.0.4 und IE 9 getestet. aber ich weiß es nicht wirklich ...

Hier ist eine Demo http://jsbin.com/acucam

Nulllinie
quelle
1
Dies ist meiner Meinung nach die beste Lösung. Ich habe es in Safari 5 und 6 auf dem Desktop sowie in Mobile Safari auf einem iPad der zweiten Generation getestet. Es funktioniert jedoch, wenn Sie den Buchstabenabstand bei einem Kind zurücksetzen, müssen Sie auch den Wortabstand einschließen: normal; wie Safari es ehrt. Großartige Arbeit, Flatline!
hndcrftd
2
Der word-spacing: -1emStil scheint Wörter in der aktuellen Version von Chrome überlappen zu lassen.
Sam
@Sam Entschuldigung für die unglaublich lange Verzögerung: PI hat den Wortabstand auf 0,05 geändert. Es scheint, dass neue Versionen von Firefox dieses Attribut nicht weniger interessieren könnten, da der Buchstabenabstand ausreicht. Ich bin gerade auf Ubuntu, daher habe ich es nicht unter Windows getestet. Hier ist die aktualisierte Version jsbin.com/acucam/14
Flatline
1
Haben Sie dies mit verschiedenen Schriftarten versucht? Dies scheint unglaublich unkonventionell und sehr, sehr wahrscheinlich zu brechen.
Dudewad
12

Ich bin zu spät (ich habe gerade eine Frage gestellt und finde sie in einem verwandten Abschnitt dünn), aber ich denke, Anzeige: Tabellenzelle; ist eine bessere Lösung

<style>
img {display:table-cell;}
</style>

<img src="img1.gif">
<img src="img2.gif">
<img src="img3.gif">

Das einzige Problem ist, dass es unter IE 7 und früheren Versionen nicht funktioniert, aber das kann mit einem Hack behoben werden

Vladimir
quelle
Das ist gut, aber der einzige Fehler ist, dass Elemente ihre Fähigkeit verlieren, in der Mitte zu schweben, wenn sie übergeordnetes Text-Align haben: center;
Mladen Janjetovic
Funktioniert, aber für den Fall, dass Sie Bilder einfach mit Textausrichtung auf der rechten Seite ausrichten möchten: rechts (auf übergeordnetem und ohne Float) - Die Lösung passt leider nicht.
Herr Hansen
2
Könnte funktionieren, aber einige Screenreader interpretieren display: table-*semantisch und lesen vor, als würde der Benutzer in einer Tabelle navigieren.
Tarka
5

Verwenden Sie das CSS-Stylesheet, um dieses Problem wie im folgenden Code zu lösen.

[divContainer_Id] img
{
    display:block;
    float:left;
    border:0;
}

Alternativtext http://rabu4g.bay.livefilestore.com/y1pWoAOBMiLumd2iQTAreYjQCDIkHImh2g_b2g9k4AnxtDNrCjvzL6bK7skG8QKMRNWkMG7N8e5Xm7pgle3Gn

Testen auf Firefox 3.5 Final!

PS. Ihr HTML sollte dies gefallen.

<div id="[divContainer_Id]">
    <img src="[image1_url]" alt="img1" />
    <img src="[image2_url]" alt="img2" />
    <img src="[image3_url]" alt="img3" />
    <img src="[image4_url]" alt="img4" />
    <img src="[image5_url]" alt="img5" />
    <img src="[image6_url]" alt="img6" />
</div>
Seelen Meister
quelle
Er sagte "Zeile", nicht "Spalte" und Ihr HTML-Beispiel ist ungültig.
Quentin
3
Er möchte eine einzelne Zeile mit mehreren Bildern in "Spalten". Diese Antwort löst das Problem tatsächlich, obwohl "display: block" redundant ist.
Bobby Jack
3

Kann ich etwas anderes tun, als in der Mitte der Tags zu brechen, anstatt zwischen ihnen?

Nicht wirklich. Da <img>s Inline-Elemente sind, werden Leerzeichen zwischen diesen Elementen vom HTML-Renderer als echte Leerzeichen in Text betrachtet. Redundante Leerzeichen (und Zeilenumbrüche) werden abgeschnitten, einzelne Leerzeichen werden jedoch in die Zeichendaten des Textelements eingefügt.

Das Positionieren der <img>Tags kann dies absolut verhindern, aber ich würde davon abraten, da dies bedeuten würde, jedes der Bilder manuell auf ein Pixelmaß zu positionieren, was eine Menge Arbeit bedeuten kann.

Konrad Rudolph
quelle
1

Eine andere Lösung wäre die Verwendung unkonventioneller Zeilenumbrüche an Stellen von Räumen. Dies ähnelt den ersten paar Antworten und ist eine alternative Möglichkeit, Elemente auszurichten. Es ist auch eine Super-Edge-Optimierungstechnik, da Leerzeichen in Ihrem Markup durch Wagenrückläufe ersetzt werden.

<img
src="image1.jpg"><img
src="image2.jpg"><img
src="image3.jpg"><img
src="image4.jpg">

Beachten Sie, dass in keinem dieser Codes Leerzeichen enthalten sind. Stellen, an denen normalerweise Leerzeichen in HTML verwendet werden, werden durch Zeilenumbrüche ersetzt. Es ist weniger ausführlich als die Verwendung von Kommentaren und Leerzeichen, wie von Paul de Vrieze empfohlen.

Dank an tech.co für diesen Ansatz.

user1214836
quelle
1

Leerraum: initial; Funktioniert bei mir.

Artur
quelle
0

Das Leerzeichen zwischen den Elementen wird vom HTML-Editor nur zu visuellen Formatierungszwecken dort abgelegt. Sie können jQuery verwenden, um das Leerzeichen zu entfernen:

$("div#MyImages").each(function () {

    var div = $(this);
    var children= div.children();
    children.detach();
    div.empty();
    div.append(children);

});

Dadurch werden die untergeordneten Elemente entfernt und verbleibende Leerzeichen gelöscht, bevor die untergeordneten Elemente wieder hinzugefügt werden.

Im Gegensatz zu den anderen Antworten auf diese Frage stellt die Verwendung dieser Methode sicher, dass das geerbte CSS displayund die geerbten font-sizeWerte beibehalten werden. Es gibt auch keine Notwendigkeit zu verwenden floatund die umständliche clear, die dann erforderlich ist. Natürlich müssen Sie jQuery verwenden.

Oundless
quelle
10
Obwohl diese Lösung funktioniert. Ich denke, es ist übertrieben, Leerzeichen mit Javascript zu entfernen.
Lashae
1
Tut mir leid, aber uggghhhh ... Man sollte zuerst versuchen, HTML richtig zu codieren, und es nicht nachträglich mit JS entstellen. Letzteres fördert nur schlampige Praktiken mit der Idee, dass das [Husten-] Wunder von JS es später beheben kann.
underscore_d
0

Persönlich mag ich die akzeptierte Antwort, dass es keinen genauen Weg gibt, dies zu tun, ohne einen Trick irgendeiner Form anzuwenden.

Für mich ist es ein ärgerliches Problem, bei dem Sie manchmal eine Stunde damit verschwenden können, sich zu fragen, warum beispielsweise eine Reihe von Kontrollkästchen nicht alle richtig ausgerichtet sind. Daher musste ich schnell bei Google und mir selbst überprüfen, ob es eine CSS-Regel gab das habe ich nicht erinnert ... aber scheint nein :(

Was die nächstbeste Antwort auf die Verwendung der Schriftgröße betrifft ... für mich ist dies ein böser Hack, der Sie später beißen wird, wenn Sie sich fragen, warum Ihr Text nicht angezeigt wird.

Ich entwickle im Allgemeinen viel mit PHP und wenn ich ein Raster von Kontrollkästchen generiere, beseitigt der von PHP generierte Inhalt dieses Problem, da keine Abstände / Unterbrechungen eingefügt werden.

Ich würde einfach vorschlagen, entweder die Bilder in einer einzigen Zeile zusammen zu bearbeiten oder ein serverseitiges Skript zu verwenden, um den Inhalt / die Bilder zu generieren.

Wütend 84
quelle
0

Anstatt ein CR / LF zwischen Elementen zu entfernen, verwende ich die SGML-Verarbeitungsanweisung, da Minifahrer häufig die Kommentare entfernen, nicht jedoch den XML-PI. Wenn der PHP-PI von PHP verarbeitet wird, hat dies den zusätzlichen Vorteil, dass der PI zusammen mit dem dazwischen liegenden CR / LF vollständig entfernt wird, wodurch mindestens 8 Bytes eingespart werden. Sie können einen beliebigen gültigen Befehlsnamen verwenden, z. B. zwei Bytes in X (HT) ML speichern.

John Freeman
quelle
0

Inspiriert von Quentins Antwort können Sie auch das schließende> neben dem Anfang des nächsten Tags platzieren.

 <img src="..." alt="..."
 /><img src="..." alt="..."
 /><img src="..." alt="..."
 /><img src="..." alt="..."/>
Tiago Martins Peres 李大仁
quelle
-1

Wäre es semantisch gesehen nicht am besten, eine geordnete oder ungeordnete Liste zu verwenden und sie dann mithilfe von CSS entsprechend zu gestalten?

<ul id="[UL_ID]">
    <li><img src="[image1_url]" alt="img1" /></li>
    <li><img src="[image2_url]" alt="img2" /></li>
    <li><img src="[image3_url]" alt="img3" /></li>
    <li><img src="[image4_url]" alt="img4" /></li>
    <li><img src="[image5_url]" alt="img5" /></li>
    <li><img src="[image6_url]" alt="img6" /></li>
</ul>

Mit CSS können Sie dies nach Ihren Wünschen gestalten und das Leerzeichen zwischen den Büchern entfernen.

Cyfer13
quelle
4
Das Einfügen der Bilder in Listenelemente hat keine Auswirkungen auf den Leerraum, auch wenn dieser semantischer ist.
gefährliche