dr. no: Spalt zwischen DIV-Elementen

Hi.

Für Euch wahrscheinlich trivial, für mich unglaublich merkwürdig: liegen zwei DIV-Bereiche nebeneinander, entsteht ein winziger Spalt zwischen beiden, obwohl ein margin von 0px angegeben.

Wie kann man das - BROWSERÜBERGREIFEND - verhindern?

Thanx!

  1. Die beiden div's verbinden geht nicht?

    1. Ungern. Ein bißchen Struktur sollte schon erhalten bleiben ...

      1. Ungern. Ein bißchen Struktur sollte schon erhalten bleiben ...

        <table>?

    2. Du hast natürlich recht. Aber mich erinnert das immer an Flickschusterei. Es muß doch möglich sein, die beiden DIVs bündig aneinander zu bekommen.

      Oder nicht?

      Trotzdem besten Dank ...

      1. Nun ja wenn das mit margin nicht funktioniert ...
        Andere Möglichkeiten gehen vermutlich nicht?!
        position:absolute;
        Wahrscheinlich nicht aber versuch ist es ja wert

        1. Im HTML-Text endet das obere DIV und das nächste schließt sich sofort an. Mittels CSS bekommt oberes DIV einen margin-bottom von 0px und unteres ein entsprechendes mrgin-top von ebenfalls 0px. Trotzdem bleibt dieser verflixte Rand ...

          1. Im HTML-Text endet das obere DIV und das nächste schließt sich sofort an. Mittels CSS bekommt oberes DIV einen margin-bottom von 0px und unteres ein entsprechendes mrgin-top von ebenfalls 0px. Trotzdem bleibt dieser verflixte Rand ...

            Hast du schon alle möglichen Ursachen abgeklappert?

            Machmal einen Test:

              
            <div>text1</div><div>text2</div>  
            
            

            natürlich mit css-border

            1. Sorry ob der harschen Unterbrechung von gestern. Mein Internet streikte.

              Also ... hab Deinen Vorschlag ausprobiert und siehe da: alles gut. Beim weiteren Rumspielen ist mir aufgefallen: ich arbeite viel mit Strukturen aus separaten Bildern, die ich als Hintergrundbild fürs DIV verwende.

              Binde ich diese mittels "background: url ... " über CSS ein, entsteht besagter Spalt. "margin" und "padding" bringen hier keine Abhilfe. Auch eine separate Regel für img mit "border: 0px" bringt nix.

              Ich bin verzweifelt. Wie kann ich diesen nervigen Spalt verbannen?

              Danke!

            2. Das eben beschrieben Problem tritt übrigens auch dann auf, wenn ich zwar kein Hintergrundbild verwende, aber statt dessen innerhalb des DIVs ganz normal ein Bild anzeige, daß (in meinem Fall) dessen ganze festgelegte Breite (und nicht näher bestimmt Höhe) einnimmt. Ob es sich ändert, wenn das DIV größer als das Bild ist, hab ich nicht ausprobiert. In diesem Fall müßte sich jedoch zwangsläufig ein Spalt ergeben.

  2. Hi.

    Für Euch wahrscheinlich trivial, für mich unglaublich merkwürdig: liegen zwei DIV-Bereiche nebeneinander, entsteht ein winziger Spalt zwischen beiden, obwohl ein margin von 0px angegeben.

    Wie kann man das - BROWSERÜBERGREIFEND - verhindern?

    Thanx!

    Hallo,

    brwoserübergreifend wird schwer: Der Internet Explorer nutzt extensiv
    DOCTYPE-Deklaration zur Art der Interpretation von CSS, also auch Style. Der Internet Explorer unterstützt CSS (Style) divergent zu anderen Brwosern und innerhalb IE-Versionen.

    Für Infos zur Hobby-Programmierung mit dem Internet Explorer per JavaScript siehe www.twseiten.de.

    Für Infos zu Opera und Firefox bitte nach Gecko googlen (Gecko-Maschine der Browser und die Umsetzung HTML-DOM).

    Gruss Tom

    P.S.: Tippfehler ignorieren aber nicht meine Antwort :-)

  3. Hallo dr. no

    Für Euch wahrscheinlich trivial, für mich unglaublich merkwürdig: liegen zwei DIV-Bereiche nebeneinander, entsteht ein winziger Spalt zwischen beiden, obwohl ein margin von 0px angegeben.

    Wie kann man das - BROWSERÜBERGREIFEND - verhindern?

    Wie hast du die Div-Bereiche nebeneinandergelegt?
    Welche Doctype-Deklaration hat deine Seite?
    Ist das (X)HTML valide oder enthält es eventuell noch Fehler?
    Welche CSS-Eigenschaften haben die Div-Bereiche?
    Welche die darin enthaltenen Elemente?
    In welchen Browsern genau tritt das Problem auf?

    Am besten wäre es, du postest einen Link auf die Seite und schreibst dazu, in welchem (bzw. welchen) Browser(n) das Problem auftritt.

    Auf Wiederlesen
    Detlef

    --
    - Wissen ist gut
    - Können ist besser
    - aber das Beste und Interessanteste ist der Weg dahin!
    1. n'Abend Detlef.

      Ich füge einfach mal den betrffenden Abschnitt aus dem Quelltext ein, ok? Leider habe ich keine Mögichkeit, besagte Files hochzuladen.

      Also, los gehts. Zuerst HTML ...

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/html4/transitional.dtd">

      <html xmlns="http://www.w3.org/1999/xhtml">

      <head>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
       <meta http-equiv="imagetoolbar" content="false">

      <title</title>

      <link rel="stylesheet" type="text/css" href="../css/styles.css" media="all" />

      <script src="../js/script.js" type="text/javascript">
       </script>

      <script type="text/javascript" language="JavaScript">
       <!--
       //-->
       </script>
      </head>

      <body>

      <div id="topFrame">
       </div>

      <!-- | INHALT | -->

      <div id="imageFrame">
        <img src="../images/dummy.jpg" border="0" />
       </div>

      <div id="contentFrame">

      <div id="menuBar">
         <a href="../../home/home.html"><img src="../images/menu.gif" border="0" /></a>
        </div>

      .
      .
      .

      Das wäre die betreffenden Stelle. "imageFrame" enthält ein 850px breites Bild. Der Spalt tritt zwischen dem unteren Rand von "dummy.jpg" und dem oberen Rand von "menu.gif" auf. Wie Du aus dem nachfolgenden CSS erkennen kannst, enthält "contentFrame" ein Hintergrundbild. Dies ist aber zwischen beiden images nicht zu sehen, sondern lediglich die Hintergrundfarbe des BODY-Tags. Deshalb tippe ich halt auf die DIVs als Fehlerquelle.

      Nun zum CSS (in Auszügen):
      body
      {
       margin: 0px;
       font-size: 9px;
       background-color: #8d0003;
      }

      img
      {
       border: none;
      }

      #contentFrame
      {
       position: relative;
       width: 850px;
       margin: 0 auto;
       background: url(../images/bkg_main.jpg) repeat-x top left;
       /* Verlauf */
       background-color: #fdf3d5;
      }

      #imageFrame
      {
       width: 850px;
       margin: 0 auto;
       border: 0px;
       padding: 0px;
      }

      #menuBar
      {
       width: 850px;
       margin: 0px auto;
       margin-top: 0px;
       border: 0px;
       padding: 0px;
      }

      Ich arbeite gerade im Internet Explorer 6. Ich weiß, ich weiß ... aber auch dort sollte es funktionieren.

      Nochmals vielen Dank und einen schönen Abend.

      1. Hallo dr. no

        Ich füge einfach mal den betrffenden Abschnitt aus dem Quelltext ein, ok?

        Dürfte in diesem Fall reichen.

        Leider habe ich keine Mögichkeit, besagte Files hochzuladen.

        Das solltest du ändern, billiger oder kostenloser Webspace um mal ein paar Beispiele abzulegen dürfte doch kein Problem darstellen.

        <div id="imageFrame">
          <img src="../images/dummy.jpg" border="0" />
        </div>

        dummy.jpg klingt für mich seltsam. Soll das Seiteninhalt sein oder Design? Wenn es Inhalt sein soll braucht es noch ein sinnvolles Alt-Attribut, wenn Design, dann gehört es als Hintergrund.

        <a href="../../home/home.html"><img src="../images/menu.gif" border="0" /></a>

        Wieder fehlt das Alt-Attribut.

        Das wäre die betreffenden Stelle. "imageFrame" enthält ein 850px breites Bild. Der Spalt tritt zwischen dem unteren Rand von "dummy.jpg" und dem oberen Rand von "menu.gif" auf.

        Ein Bild (img) steht wie Schrift auf der Grundlinie des Textes. Bei Text werden die notwendigen Unterlängen (g, j, p, q, y) berücksichtigt. Der IE berücksichtigt diese auch, wenn überhaupt kein Text im betreffenden Elternelement vorkommt.
        Um das zu vermeiden kannst du dafür sorgen, dass:

        • keine Whitespaces (Leerzeichen, Tabulatoren, Zeilenumbrüche) zwischen den Tag sind, oder
        • dem Bild einen passenden Wert für vertical-align geben, oder
        • dafür sorgen, dass es sich wie ein Blockelement verhält (display).

        Auf Wiederlesen
        Detlef

        --
        - Wissen ist gut
        - Können ist besser
        - aber das Beste und Interessanteste ist der Weg dahin!
        1. Hi Detlef,

          bin zwar gerade etwas im Streß, werde Deinen Tips aber mal nachgehen. Noch eine Anmerkung: habe dieses Problem auch bei nebeneinander stehenden DIVs (bspw. mehrspaltiges Layout, wobei jedes DIV ein Hintergrundbild beinhaltet). Hierbei kommen ja nun keine Unterlängen zum Tragen. Würde hier "display" und entsprechend "text-align" helfen?

          Viele Dank und Grüße,
          Dr. No

          1. habe dieses Problem auch bei nebeneinander stehenden DIVs (bspw. mehrspaltiges Layout, wobei jedes DIV ein Hintergrundbild beinhaltet). Hierbei kommen ja nun keine Unterlängen zum Tragen.

            Wer sagt das?

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hi Struppi.

              Hab es gerade mal ausprobiert. Liegen die DIVs im dreispaltigen Layout mit Hintergrundbild nebeneinander, so entsteht im IE 6 wieder besagter Spalt. vertical-align und display helfen hier nix.

              Übrigens besten Dank mit dem Tip der Unterlängen bei den aufeinander stehenden DIVs. Hat bestens geklappt. Aber wie bekomme ich jetzt obiges Problem in den Griff?

              Schönes Wochenende.

              1. Hallo dr. no

                Hab es gerade mal ausprobiert. Liegen die DIVs im dreispaltigen Layout mit Hintergrundbild nebeneinander, so entsteht im IE 6 wieder besagter Spalt. vertical-align und display helfen hier nix.

                Wo ist der Link zu deiner Problemseite oder zu einem Beispiel, bei dem das Problem auftritt?

                Auf Wiederlesen
                Detlef

                --
                - Wissen ist gut
                - Können ist besser
                - aber das Beste und Interessanteste ist der Weg dahin!
                1. Hi Detlef,

                  ich schick mal wieder den betreffenden Quellcode.

                  Der HTML-Ausschnitt
                  .
                  .
                  .
                  <body>

                  <div id="bkgShade">

                  <div class="left"></div>
                    <div class="right"></div>
                    <div class="middle"></div>

                  </div>

                  .
                  .
                  .

                  Wunder Dich bitte nicht - in das CSS-File hab ich alles reingepackt, was mir so eingefallen oder ich als Tip bekommen habe. Mit Sicherhheit ist die Hälfte unnütz aber so bin ich wenigstens sicher, nix vergessen zu haben.

                  Das CSS-File

                  #bkgShade
                  {
                   position: absolute;
                   width: 850px;
                   margin: 0 auto;
                   margin-top: 38px;

                  display: block;
                   vertical-align: bottom;
                  }

                  #bkgShade .left
                  {
                   float: left;
                   width: 20px;
                   height: 600px;

                  display: block;
                   text-align: right;
                   vertical-align: bottom;
                   background: url(../images/bkg_content_left.jpg) no-repeat top left;
                  }

                  #bkgShade .middle
                  {
                   height: 600px;
                   margin: 0px;

                  display: block;
                   vertical-align: bottom;
                   background: url(../images/bkg_content_main.jpg) repeat-x top left;
                  }

                  #bkgShade .right
                  {
                   float: right;
                   width: 25px;
                   height: 600px;

                  display: block;
                   text-align: left;
                   vertical-align: bottom;
                   background: url(../images/bkg_content_right.jpg) no-repeat top left;
                  }

                  Nochmal kurz zur Erklärung: der DIVs liegen nebeneinander. Die beiden äußeren enthalten als Hintergrundbild jeweils einen Seitenrand, das breite DIV in der Mitte - ebenfalls als background image - den eigentlichen Hintergrund. An den zwei inneren Kanten finden sich 2px oder 3px breite Spalte.

                  Besten Dank.

                  1. Hallo dr. no

                    ich schick mal wieder den betreffenden Quellcode.

                    Ich hasse solche Quelltextschnipsel, weil in ihnen oft wichtiges fehlt, weil man mit diesen nie den Gesamteindruck bekommt, und weil ich diese meist erst noch selbst in eine Beispielseite einfügen muss, um das Problem wirklich nachvollziehen zu können.

                    Wunder Dich bitte nicht - in das CSS-File hab ich alles reingepackt, was mir so eingefallen oder ich als Tip bekommen habe. Mit Sicherhheit ist die Hälfte unnütz aber so bin ich wenigstens sicher, nix vergessen zu haben.

                    Hälfte unnütz, nix vergessen?
                    Wenn du alles mögliche hineinschreibst, ohne zu wissen, wofür es überhaupt gut ist, dann kann es dir leicht passieren, dass du mit einer Angabe einen Bug auslöst, den du mit einer anderen zu beseitigen versuchst.

                    Was ich an deinen Quelltextstückchen sehe:
                    Du denkst in Tabellen!
                    Das kann für vernünftig funktionierende CSS-Layouts tödlich sein!
                    Bei einem Tabellenlayout setzt du das Layout aus Tabellenzellen zusammen. Alles ist nebeneinander, in Zeilen und Spalten sortiert.
                    Bei CSS-Layout gibt es keine Spalten sondern rechteckige Bereiche, die (fast) beliebig angeordnet werden können, die nicht zwangsläufig nebeneinander sondern auch inneinander sein können. Ein Designelement braucht vielleicht ein extra Element (z.B. weil einem Element nur _ein_ Hintergrundbild zugewiesen werden kann), aber keine extra Spalte nur für sich selbst.

                    So weit zur Vorrede, nun zu deinem CSS:

                    #bkgShade
                    {
                    position: absolute;

                    Wozu das?
                    Zitat Nummer 87
                    Nur position:absolute, keine Angaben wo es positioniert werden soll, dürfte also unnütz oder sogar schädlich sein.

                    width: 850px;
                    margin: 0 auto;

                    Ist wirkungslos, aufgrund der absoluten Positionierung.

                    margin-top: 38px;

                    Das würde einfacher gehen:

                    margin: 38px auto 0 auto;

                    display: block;

                    Unnötig, weil Defaulteigenschaft von Div-Elementen.

                    vertical-align: bottom;

                    Wirkungslos, weil nur auf Inlineelemente und Tabellenzellen anwendbar.

                    #bkgShade .left
                    {
                    ...
                    width: 20px;
                    ...
                    text-align: right;

                    Ich kann mir kaum vorstellen, dass in 20px wirklich Text stehen könnte.
                    Enthält das Element Text oder weitere Inhalte, oder ist es nur für den linken Rahmen?

                    #bkgShade .middle
                    {
                    height: 600px;

                    Hiermit löst du im IE Hashlayout aus. Das bedeutet, dass das Element nicht mehr von gefloateten Elementen überlappt werden kann, sondern immer daneben oder darunter angezeigt wird. Dabei lässt er ein paar Pixel Abstand. Wie dieser wegzubekommen ist, ohne die Höhenangabe diese Elements wegzulassen, weiß ich auch nicht.

                    So, nun zu einer möglichen Lösung des Problems:

                    HTML wie bei dir, und das CSS:

                    body {  
                     text-align: center;  /* damit auch ältere IEs den Block zentrieren */  
                    }  
                    #bkgShade  
                    {  
                     width: 850px;  
                     margin: 38px auto 0 auto ;  
                     height: 600px;  
                     background: url(../images/bkg_content_main.jpg) repeat-x top left; /* noch eine zur Grafik passende Hintergrundfarbe angeben, die angezeigt wird, wenn die Grafik noch nicht geladen ist; statt top left wäre auch 20px 0 denkbar */  
                     text-align: left;   /* wieder zurück zur Standardausrichtung */  
                    }  
                      
                    #bkgShade .left  
                    {  
                     float: left;  
                     width: 20px;  
                     height: 600px;  
                     text-align: right;  
                     background: url(../images/bkg_content_left.jpg) no-repeat top left;  
                    }  
                      
                    #bkgShade .middle  
                    {  
                     margin: 0 20px 0 25px;  
                    }  
                    #bkgShade .right  
                    {  
                     float: right;  
                     width: 25px;  
                     height: 600px;  
                     background: url(../images/bkg_content_right.jpg) no-repeat top left;  
                    }
                    

                    Wenn .left und .right nur das jeweilige Hintergrundbild und keinen Inhalt haben, gäbe es noch einfachere und in der Höhe flexible Möglichkeiten.

                    Auf Wiederlesen
                    Detlef

                    --
                    - Wissen ist gut
                    - Können ist besser
                    - aber das Beste und Interessanteste ist der Weg dahin!
                    1. Hi,

                      Ich hasse solche Quelltextschnipsel, weil in ihnen oft wichtiges fehlt,

                      So wie hier. Es ist nicht erkennbar, ob die Seite eine Chance hat, im Standard-Modus gerendert zu werden oder nicht.

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      O o ostern ...
                      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                    2. Hallo Ihr beiden.

                      Detlef, besten Dank. Prima Idee: einfach, aber wirkungsvoll. Wieso diese blöden Spalten auftauchen, würde mich ja prinzipiell schon interessieren.

                      Die Quelltextkopiererei hat ihre Ursache in fehlendem eigenem Webspace. Das werd ich aber mal korrigieren.

                      Noch was zur Nachricht:

                      Wenn .left und .right nur das jeweilige Hintergrundbild und keinen Inhalt haben, gäbe es noch einfachere und in der Höhe flexible Möglichkeiten.

                      Ja, das ist tatsächlich der Fall. Wie ließe sich denn das ganze "höhenflexibler" angehen?

                      Nochmals besten Dank & schönes Wochenende.

                      1. Hallo dr. no

                        ... Wieso diese blöden Spalten auftauchen, würde mich ja prinzipiell schon interessieren.

                        Du kannst ja mal die IE-Programmierer fragen. ;-)

                        Wenn .left und .right nur das jeweilige Hintergrundbild und keinen Inhalt haben, gäbe es noch einfachere und in der Höhe flexible Möglichkeiten.

                        Ja, das ist tatsächlich der Fall. Wie ließe sich denn das ganze "höhenflexibler" angehen?

                        Eine Möglichkeit ist in diesem Artikel beschrieben.
                        Bitte tue dir aber selbst den Gefallen, das Beispiel von dort nicht einfach auf deine Seite zu kopieren, sondern dich wirklich damit zu beschäftigen.
                        Wenn du das Prinzip verstanden hast, brauchst du auch nicht so viele ineinandergeschachtelte Divs, indem du nur die Elemente verwendest, die für die gewünschte Anzeige wirklich nötig sind und/oder Elemente dafür nimmst, die sowieso schon vorhanden sind.

                        Auf Wiederlesen
                        Detlef

                        --
                        - Wissen ist gut
                        - Können ist besser
                        - aber das Beste und Interessanteste ist der Weg dahin!
      2. Hi,

        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

        Ah, also XHTML 1.0

        "http://www.w3.org/TR/html4/transitional.dtd">

        Äh doch nicht, hier ist's HTML 4

        <html xmlns="http://www.w3.org/1999/xhtml">

        Jetzt doch wieder XHTML

        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <meta http-equiv="imagetoolbar" content="false">

        Und hier wieder HTML.

        <title</title>

        Das ist auch kaputt.

        <link rel="stylesheet" type="text/css" href="../css/styles.css" media="all" />

        Zur Abwechslung mal wieder XHTML.

        Das wäre die betreffenden Stelle. "imageFrame" enthält ein 850px breites Bild. Der Spalt tritt zwischen dem unteren Rand von "dummy.jpg" und dem oberen Rand von "menu.gif" auf.

        Du hattest was von nebeneinander liegenden Elementen erwähnt, diese Beschreibung klingt danach, als würden die Elemente untereinander liegen.
        Das CSS sieht auch nicht nach nebeneinander aus.

        Was willst Du eigentlich?

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Du hattest was von nebeneinander liegenden Elementen erwähnt, diese Beschreibung klingt danach, als würden die Elemente untereinander liegen.
          Das CSS sieht auch nicht nach nebeneinander aus.

          Sie liegen übereinander. Kleiner Tippfehler. Ändert ja aber am Problem grundsätzlich nichts.

          Hast Du eine Idee?

          Danke.

      3. Das wäre die betreffenden Stelle. "imageFrame" enthält ein 850px breites Bild. Der Spalt tritt zwischen dem unteren Rand von "dummy.jpg" und dem oberen Rand von "menu.gif" auf.

        Das Problem ist kein Abstand zwischen den Elementen, wie du feststellen kannst, wenn du dem imageFrame mal eine andere Hintergrundfarbe gibst, sondern die Unterlängen, siehe http://www.dodabo.de/html+css/img-table/

        Struppi.

        --
        Javascript ist toll (Perl auch!)