Ist es möglich so etwas zu tun?
max-width: calc(max(500px, 100% - 80px))
oder
max-width: max(500px, calc(100% - 80px)))
in CSS?
Ist es möglich so etwas zu tun?
max-width: calc(max(500px, 100% - 80px))
oder
max-width: max(500px, calc(100% - 80px)))
in CSS?
Antworten:
min(),, max()und clamp()sind endlich verfügbar!
Ab Firefox 75, Chrome 79 und Safari 11.1 (außer clamp).
min()und max()nehmen Sie eine beliebige Anzahl von Argumenten.
clamp()hat Syntax clamp(MIN, VAL, MAX)und entspricht max(MIN, min(VAL, MAX)).
min() und max() kann verschachtelt sein. Sie können sowohl innerhalb calc()als auch außerhalb verwendet werden. Sie können auch mathematische Ausdrücke enthalten, was bedeutet, dass Sie sie vermeiden können, calc()wenn Sie sie verwenden.
Daher kann das ursprüngliche Beispiel wie folgt geschrieben werden:
max-width: max(500px, 100% - 80px);
Nein, du kannst nicht. max()und min()wurden aus CSS3-Werten und -Einheiten entfernt. Sie können jedoch in CSS4-Werten und -Einheiten wieder eingeführt werden . Derzeit gibt es keine Spezifikation für sie, und in der calc()Spezifikation wird nicht erwähnt, dass beide innerhalb einer calc()Funktion gültig sind .
Eine Problemumgehung wäre, sich selbst zu verwenden width.
max-width: 500px;
width: calc(100% - 80px);
500pxoder 100% - 80px. Ihre Lösung begrenzt die maximale Breite auf, 500pxselbst wenn sie 100% - 80pxgrößer ist.
min()daher vielleicht hilfreich für andere.
Während die Antwort von @ david-mangold oben "nah" war, war sie falsch.
(Sie können seine Lösung verwenden, wenn Sie eine minimale Breite anstelle einer maximalen Breite wünschen ).
Diese Lösung zeigt, dass der Kommentar von @ gert-sønderby zu dieser Antwort funktioniert :
Die Antwort hätte verwendet werden sollen min-width, nicht max-width.
Das hätte es sagen sollen:
min-width: 500px;
width: calc(100% - 80px);
Ja, verwenden Sie min-width plus width , um eine max () -Funktion zu emulieren .
Hier ist der Codepen (die Demo auf CodePen ist einfacher zu sehen und Sie können sie für Ihre eigenen Tests bearbeiten).
.parent600, .parent500, .parent400 {
height: 80px;
border: 1px solid lightgrey;
}
.parent600 {
width: 600px;
}
.parent500 {
width: 500px;
}
.parent400 {
width: 400px;
}
.parent600 .child, .parent500 .child, .parent400 .child {
min-width: 500px;
width: calc(100% - 80px);
border: 1px solid blue;
height:60px;
}
.ruler600 {
width: 600px;
border: 1px solid green;
background-color: lightgreen;
height: 20px;
margin-bottom: 40px;
}
.width500 {
height: 20px;
width: 500px;
background-color: lightyellow;
float: left;
}
.width80 {
height: 20px;
width: 80px;
background-color: green;
float: right;
}
.parent600 .wrong, .parent500 .wrong, .parent400 .wrong {
max-width: 500px;
width: calc(100% - 80px);
border: 1px solid red;
height:60px;
}
<h2>(Min) min-width correctly gives us the Larger dimension: </h2>
<div class="parent600">
600px parent
<div class="child">child is max(500px, 600px - 80px) = max(500px, 520px) = 520px</div>
</div>
<div class="ruler600"><div class="width500">500px</div>20<div class="width80">80px</div></div>
<div class="parent500">
500px parent
<div class="child">child is max(500px, 500px - 80px) = max(500px, 420px) = 500px</div>
</div>
<div class="ruler600"><div class="width500">500px</div><div class="width80">80px</div></div>
<div class="parent400">
400px parent (child expands to width of 500px)
<div class="child">child is max(500px, 400px - 80px) = max(500px, 320px) = 500px</div>
</div>
<div class="ruler600"><div class="width500">500px</div><div class="width80">80px</div></div>
<h2>(Max) max-width <em>incorrectly</em> gives us the Smaller dimension: </h2>
<div class="parent400">
400px parent
<div class="wrong">child is min(500px, 400px - 80px) = min(500px, 320px) = 320px</div>
</div>
<div class="ruler600"><div class="width500">500px</div><div class="width80">80px</div></div>
<div class="parent500">
500px parent
<div class="wrong">child is min(500px, 500px - 80px) = min(500px, 420px) = 420px</div>
</div>
<div class="ruler600"><div class="width500">500px</div><div class="width80">80px</div></div>
<div class="parent600">
600px parent
<div class="wrong">child is min(500px, 600px - 80px) = min(500px, 520px) = 500px</div>
</div>
<div class="ruler600"><div class="width500">500px</div>20<div class="width80">80px</div></div>
Das heißt, @ andys Antwort oben über einfache Grund sein kann, und besser geeignet in vielen Anwendungsfällen sein.
Beachten Sie auch, dass möglicherweise eine max()und eine min()Funktion in CSS eingeführt werden, diese jedoch ab April 2019 nicht mehr Teil der Spezifikation ist.
Hier können Sie die Browserkompatibilität überprüfen max():
https://developer.mozilla.org/en-US/docs/Web/CSS/max#Browser_compatibility .
Hier ist der Entwurf des Vorschlags:
https://drafts.csswg.org/css-values-4/#comp-func .
Scrollen Sie zum Anfang der Seite, um das Datum der letzten Überarbeitung anzuzeigen (ab heute wurde es zuletzt am 5. April 2019 überarbeitet).
@Amaud Gibt es eine Alternative, um das gleiche Ergebnis zu erzielen ?
Es gibt einen reinen CSS-Ansatz, der nicht js ist und ähnliche Ergebnisse erzielt. Sie müssten die Auffüllung / den Rand des übergeordneten Elementcontainers anpassen.
.parent {
padding: 0 50px 0 0;
width: calc(50%-50px);
background-color: #000;
}
.parent .child {
max-width:100%;
height:50px;
background-color: #999;
}
<div class="parent">
<div class="child"></div>
</div>