13 Stimmen

Mysteriöser vertikaler CSS-Raum

Von dieser einfachen html.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

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

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Hello</title>
  <style type="text/css" media="screen">
    .t1 {
      padding: 0px;
      margin: 0px;
    }
    .popup {
      display: inline-block;
      position: relative;
      width: 0px;
      padding: 0px;
      margin-left: -0.5em;
    }
    .hint {
      position: absolute;
      z-index: 1;
      width: 20em;
      background-color: white;
      border: 1px solid green;
      padding: 0.5em;
      margin-top: 1em;
    }
    .list {
      padding: 0px;
      padding-left: 1em;
      margin: 0px;
    }
  </style>
</head>

<body>

<!-- properly layout -->
<div style="height: 10em;">
  <span class="t1">MyObject o = www.mycompany.project.ObjectFactory.</span>
  <div class="popup">
    <div class="hint">
      <ul class="list">
        <li>NewSimpleObject(int x);</li>
        <li>NewComplexObject(int x, int y);</li>
        <li>NewComplicateObject(int x, int y, intz);</li>
      </ul>
    </div>
    <div>&nbsp;</div>  <!-- no idea why, but ending space is required for proper layout -->
  </div>
</div>

<!-- incorrect layout -->
<div style="height: 10em;">
  <span class="t1">MyObject o = www.mycompany.project.ObjectFactory.</span>  
  <!-- mysterious vertical space appear here -->
  <div class="popup">
    <div class="hint">
      <ul class="list">
        <li>NewSimpleObject(int x);</li>
        <li>NewComplexObject(int x, int y);</li>
        <li>NewComplicateObject(int x, int y, intz);</li>
      </ul>
    </div>
    <!-- <div>&nbsp;</div>  -->
  </div>
</div>

</body>

</html>

Hier ist das Ergebnis:

Alt-Text http://img23.imageshack.us/img23/6224/resultrendering.png

Das Ergebnis ist bei allen Browsern ähnlich. Ich glaube also, dass es sich nicht um einen Browserfehler handelt.

Woher kommt der vertikale Abstand zwischen der Textzeile und dem Popup-Hinweis im zweiten Rendering? Und wie kann der <div> </div> dieses Problem lösen?

AKTUALISIERT:

Schlussfolgerungen aus Richard M. Antwort. Ein Feld ohne Inhalt hat keine Dimension (mit Ausnahme von Inline ). Die Website <div> </div> die Dimension "Popup" existiert.

Die bessere Lösung, so Richard, ist die Verwendung von inline anstelle von inline-block. Da die vertikale Abmessung von inline ist unabhängig von ihrem Inhalt gleich

Aus irgendeinem Grund, den ich noch nicht kenne, ist die Rand oben: 1em ist nicht mehr erforderlich, wenn auf "inline" umgeschaltet wird

AKTUALISIERT 2:

OH NEIN.. Dieses Thema kann noch nicht abgeschlossen werden. Die Änderung, die Richard M. vorschlagen (verwenden inline und entfernen margin-top ) würde nur mit Webkit-Browsern (Chrome, Safari) funktionieren. Im IE und Firefox funktioniert die popup Box nicht an der Textzeile, sondern an der linken Seite ausrichten.

Das erste Beispiel in der Frage (inline-block & non-empty content) ist wahrscheinlich die zuverlässigste Option für jetzt.

AKTUALISIERT 3:

Schlussfolgerung! Die eigentliche Ursache für dieses Problem liegt in der Tatsache, dass non-inline Block ohne Inhalt hat keine Dimension. Richard M. empfehlen die Verwendung von inline um dieses Problem zu vermeiden. Leider habe ich festgestellt, dass diese Lösung nicht mit allen Browsern kompatibel ist. Ich habe eine andere Option in die entgegengesetzte Richtung gefunden, indem ich inline-block mit erzwungener Dimension über height: 1px; Dies funktioniert in jedem Browser korrekt.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

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

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Hello</title>
  <style type="text/css" media="screen">
    .t1 {
      padding: 0;
      margin: 0;
      width: 0em;
    }
    .popup {
      display: inline-block;
      padding: 0;
      margin: 0; 
      position: relative;
      width: 0;
      height: 1px;  <!-- force vertical dimension -->
    }
    .hint {
      position: absolute;
      z-index: 1;
      padding: 0;
      margin: 0;
      margin-top: 1px;  <!-- compensate for the setup dimension -->
      width: auto;
      white-space: nowrap;
      background-color: white;
      border: 1px solid green;
    }
    .list {
      padding: 0;
      padding-left: 1em;
      margin: 0.5em;
    }
  </style>
</head>

<body>

  <!-- properly layout -->
  <div style="height: 10em;">
    <span class="t1">MyObject o = www.mycompany.project.ObjectFactory.</span><!-- 
      whitespace is not welcome
    --><div class="popup">
      <div class="hint">
        <ul class="list">
          <li>NewSimpleObject(int x);</li>
          <li>NewComplexObject(int x, int y);</li>
          <li>NewComplicateObject(int x, int y, int z);</li>
        </ul>
      </div>
    </div><!--
      whitespace is not welcome
    --><span>(1, 2, ...</span>
  </div>

</body>

</html>

4voto

Pekka Punkte 429407

Es hat damit zu tun, dass die div mit der Klasse popup ist nicht derjenige mit der position: absolute sondern sein Kind, hint .

Aus der Sicht des Browsers ist die popup div, wenn es nur hint hat kein Inhalt und somit keine Abmessungen. Die <div>&nbsp;</div> gibt ihm Inhalt und bewirkt, dass die hint Popup richtig am oberen Rand des Bildschirms zu starten div - aber warum das so ist, ist mir immer noch schleierhaft, obwohl ich sicher bin, dass es dafür eine ganz logische Erklärung gibt :)

3voto

bcosca Punkte 17013

Könnte es sein, dass das die eigentliche Absicht ist?

<div style="clear:both;"></div>

statt nur:

<div>&nbsp;</div>

3voto

Richard M Punkte 13954

Votre .hint div hat einen oberen Rand von 1em, um es unter die Textzeile zu "schieben", aber in Ihrem zweiten Fall hat Ihr .popup div enthält nichts (da absolut positionierte Elemente keinen Platz beanspruchen). Ein inline-block div ohne Inhalt hat weder Höhe noch Breite und sitzt auf der Grundlinie einer Textzeile. Sie "schieben" also eher den unteren als den oberen Rand der Zeile ab, und daher der zusätzliche vertikale Abstand von 1em. Ich verstehe nicht wirklich, warum Sie inline-block verwenden, inline würde genauso gut funktionieren, da der Inhalt des Divs absolut positioniert ist.


Um Ihre Frage zu beantworten, bearbeiten Sie: Mit display inline, wie ich vorgeschlagen habe, sollte es funktionieren, aber Sie müssen die linken und oberen Werte Ihrer absolut positioniert setzen .hint div auf Null. Außerdem müssen Sie Ihre <div>&nbsp;</div> Element, da sonst an dieser Stelle ein Zeilenumbruch entsteht (weil es nicht inline ist).

0voto

Sie können den oberen Rand auf der Registerkarte Hinweis . Sie können den Wert auf einen negativen Wert setzen, um die Ausrichtung zu korrigieren.

0voto

Burntime Punkte 2304

Wenn Sie margin-top: 1em; löschen, wird das zweite Layout funktionieren.

EDIT: ersetzen Rand oben: 1em; mit Überlauf: auto; und Sie brauchen das Div nicht mehr.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X