Sollte der Randradius den Inhalt abschneiden?

74

Sollte der Inhalt meines Containers nicht abgeschnitten werden, wenn der Container hat border-radius?

Beispiel für HTML und CSS:

.progressbar { height: 5px; width: 100px; border-radius: 5px; }
.buffer { width: 25px; height: 5px; background: #999999; }
<div class="progressbar">
    <div class="buffer"></div>
</div>

Wie Sie sehen können, verwende ich border-radiusauf dem Container ( .progressbar), aber der Inhalt ( .buffer) geht 'außerhalb' des Containers . Ich sehe das auf Google Chrome.

Ist das das erwartete Verhalten?

PS Hier geht es nicht darum, wie man es behebt, sondern darum, ob es so funktionieren soll.

PeeHaa
quelle
2
@ CummmanderCheckov tnx für die Benachrichtigung. Lassen Sie es mich noch einmal einrichten. Obwohl alle Infos sind in meiner Frage (nur aus diesem Grunde) Ich habe es aktualisiert.
PeeHaa

Antworten:

100

Ist das das erwartete Verhalten?

Ja, so verrückt es auch klingt, es ist es tatsächlich. Hier ist der Grund:

Die Standardeinstellung overflowfür <div>Elemente (und die meisten anderen Dinge) ist visible, und die Spezifikation sagt Folgendes aus overflow: visible:

sichtbar
Dieser Wert gibt an, dass der Inhalt nicht abgeschnitten ist, dh außerhalb des Blockfelds gerendert werden kann.

In §5.3 Eckausschnitt im Modul Hintergründe und Rahmen heißt es wiederum:

Die Hintergründe einer Box, aber nicht das Rahmenbild, werden auf die entsprechende Kurve zugeschnitten (wie durch 'Hintergrund-Clip' bestimmt). Andere Effekte, die am Rand oder an der Auffüllkante befestigt werden (z. B. "Überlauf" außer "sichtbar"), müssen ebenfalls an der Kurve befestigt werden. Der Inhalt der ersetzten Elemente wird immer auf die Inhaltskantenkurve zugeschnitten. Außerdem akzeptiert der Bereich außerhalb der Kurve der Randkante keine Mausereignisse für das Element.

Der Satz , dass ich ausdrücklich erwähnt betonte , dass der overflowWert der Box etwas anderes sein muss als visible(das bedeutet auto, hidden, scrollund andere) , um für die Ecken ihrer Kinder zu befestigen.

Wenn für das Feld ein sichtbarer Überlauf definiert ist, der, wie gesagt, die Standardeinstellung für die meisten visuellen Elemente ist, sollte der Inhalt überhaupt nicht abgeschnitten werden. Und deshalb gehen die quadratischen Ecken von .bufferüber die abgerundeten Ecken von .progressbar.

Folglich ist der einfachste Weg, um .bufferinnerhalb .progressbarder abgerundeten Ecken zu schneiden, das Hinzufügen eines overflow: hiddenStils .progressbar, wie in dieser aktualisierten Geige gezeigt .

BoltClock
quelle
Toll! Schlechte Frage (ja, ich weiß, fragen Sie die Leute, die die Spezifikation erstellt haben), aber können Sie sich einen Grund vorstellen, warum ersetzte Elemente abgeschnitten werden? PS das ist eine
Bonusfrage
1
@PeeHaa: Der Inhalt, der ersetzt wird (z. B. das in einem Bild verknüpfte Bild <img src="...">), muss abgeschnitten werden, da diese Elemente nur den ersetzten Inhalt enthalten können. Wenn nicht, können Sie sich nicht border-radiusauf Bilder usw. bewerben .
BoltClock
12

Für alle, die sich fragen, was eine Lösung wäre. Am einfachsten wäre es, das CSS zu bearbeiten.

In dem angegebenen Beispiel wäre dies eine geeignete Lösung:

.progressbar { height: 5px; width: 100px; border-radius: 5px; overflow: hidden; }
Owen
quelle
4

Semantisch gesehen ist es am besten, dem inneren Div einfach eine Eigenschaft zum Erben eines Randradius hinzuzufügen, daher die neue Klassenaddition:

.buffer {
    border-radius: inherit;
}

Infolgedessen können Sie für andere Situationen die Verwendung von Überlauf beibehalten: Auto, wenn der Inhalt über Ihre Grenzen hinausgeht und Sie alles sehen möchten.

Stéphane de Luca
quelle
Ich fand dies nützlich für einige Inhalte, die nicht respektiert wurden overflow: hidden- viel sauberer als das Festlegen des Randradius für die Kinder nach Zahlen, was ich zu vermeiden gehofft hatte.
Iiridayn
4
Das ist falsch. Der untergeordnete Inhalt mit derselben border-radiusEigenschaft deckt manchmal nicht den übergeordneten Hintergrund ab. Versuchen Sie es mit einem blutroten Elternhintergrund, und Sie werden es sehen.
Rockallite
3

Diese Frage scheint auf denselben Fehler hinzuweisen, anscheinend handelt es sich um einen Fehler.

Probleme beim Abschneiden des CSS3-Rahmenradius

Bearbeiten

Eek! BoltClock hat erwähnt, dass dies indiziert ist, daher werde ich diese andere SO-Frage zum Thema posten, während ich auch nach einem speziellen Zitat zu diesem Thema suche. Wie verhindere ich mit CSS3, dass ein Bild über ein Feld mit abgerundeten Ecken läuft?

Spezifikationslink

Nur als Referenz werde ich den entsprechenden Link einfügen - aber ich kann nichts explizites zu dem Beispiel finden, das Sie gegeben haben.

CSS-Hintergründe - Abgerundete Ecken

isNaN1247
quelle
Der Fragesteller dieser Frage hat die CSS3-Spezifikation falsch interpretiert, und der Fehler, auf den verwiesen wird, betrifft einen overflowWert, der nicht vorhanden ist visible, was hier nicht der Fall ist.
BoltClock
In der Spezifikation habe ich gelesen: The content of replaced elements is always trimmed to the content edge curve.Was bedeuten würde, dass es den Inhalt abschneiden sollte. Oder lese ich es falsch: P
PeeHaa
2
@PeeHaa: divist kein ersetztes Element, daher ist dieses Bit irrelevant.
BoltClock
1
@ BoltClock vergib mir meine Unwissenheit. Aber was ist damit gemeint replaced elements?
PeeHaa
2

Dies ist, was die Spezifikationen sagen, so sollte es funktionieren. Das heißt aber nicht, dass Chrome das so macht.

5.3. Eckausschnitt

Die Hintergründe einer Box, aber nicht das Rahmenbild, werden auf die entsprechende Kurve zugeschnitten (wie durch 'Hintergrund-Clip' bestimmt). Andere Effekte, die am Rand oder an der Auffüllkante befestigt werden (z. B. "Überlauf" außer "sichtbar"), müssen ebenfalls an der Kurve befestigt werden. Der Inhalt der ersetzten Elemente wird immer auf die Inhaltskantenkurve zugeschnitten. Außerdem akzeptiert der Bereich außerhalb der Kurve der Randkante keine Mausereignisse für das Element.

http://www.w3.org/TR/css3-background/#border-radius

Filip
quelle
1

Die Kanten und Ecken des übergeordneten Containers sind von Quilt-Elementen bedeckt, sodass der Inhalt des übergeordneten Elements zugeschnitten werden muss, solange der overflowWert nicht festgelegt visibleist. Beispiel:

  .parent {
    overflow: hidden;
    border-radius: 5px;
  }
Cui Yang
quelle