Est-il possible de faire quelque chose comme ça
max-width: calc(max(500px, 100% - 80px))
ou
max-width: max(500px, calc(100% - 80px)))
en CSS?
Est-il possible de faire quelque chose comme ça
max-width: calc(max(500px, 100% - 80px))
ou
max-width: max(500px, calc(100% - 80px)))
en CSS?
Réponses:
min(),, max()et clamp()sont enfin disponibles!
À partir de Firefox 75, Chrome 79 et Safari 11.1 (sauf clamp).
min()et max()prenez n'importe quel nombre d'arguments.
clamp()a une syntaxe clamp(MIN, VAL, MAX)et équivaut à max(MIN, min(VAL, MAX)).
min()et max()peut être imbriqué. Ils peuvent être utilisés à l' calc()intérieur comme à l'extérieur de celui-ci, ils peuvent également contenir des expressions mathématiques, ce qui signifie que vous pouvez les éviter calc()lorsque vous les utilisez.
Par conséquent, l'exemple original peut être écrit comme suit:
max-width: max(500px, 100% - 80px);
Une solution css `` pure '' est en fait possible maintenant en utilisant des requêtes multimédias:
.yourselector {
max-width: calc(100% - 80px);
}
@media screen and (max-width: 500px) {
.yourselector {
max-width: 500px;
}
}
max-height
Non tu ne peux pas. max()et min()ont été supprimés des valeurs et unités CSS3. Cependant, ils peuvent être réintroduits dans les valeurs et unités CSS4 . Il n'y a actuellement aucune spécification pour eux, et la calc()spécification ne mentionne pas qu'ils sont valides dans une calc()fonction.
Une solution de contournement serait de widths'utiliser.
max-width: 500px;
width: calc(100% - 80px);
500pxou l' autre 100% - 80px. Votre solution limite la largeur maximale 500pxmême si elle 100% - 80pxest plus grande.
min()donc peut-être utile aux autres.
Alors que la réponse de @ david-mangold ci - dessus était "proche", elle était incorrecte.
(Vous pouvez utiliser sa solution si vous voulez une largeur minimale , au lieu d'une largeur maximale ).
Cette solution démontre que @ gert-Sønderby commentaire à cette réponse ne travail:
La réponse aurait dû utiliser min-width, non max-width.
Voici ce qu'il aurait dû dire:
min-width: 500px;
width: calc(100% - 80px);
Oui, utilisez min-width plus width pour émuler une fonction max () .
Voici le codepen (plus facile de voir la démo sur CodePen, et vous pouvez le modifier pour vos propres tests).
.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>
Cela dit, la réponse de @ andy ci - dessus peut être plus facile à raisonner et peut être plus appropriée dans de nombreux cas d'utilisation.
Notez également que finalement une fonction max()et une min()fonction peuvent être introduites dans CSS, mais qu'en avril 2019, elles ne font pas partie de la spécification.
Ici, vous pouvez vérifier la max()compatibilité du navigateur:
https://developer.mozilla.org/en-US/docs/Web/CSS/max#Browser_compatibility .
Voici le brouillon de la proposition:
https://drafts.csswg.org/css-values-4/#comp-func .
Faites défiler vers le haut de la page pour voir la dernière date de révision (à partir d'aujourd'hui, elle a été révisée pour la dernière fois le 5 avril 2019).
@Amaud Existe-t-il une alternative pour avoir le même résultat?
Il existe une approche css pure non-js qui permettrait d'obtenir des résultats similaires. Vous devrez ajuster le remplissage / la marge du conteneur des éléments parents.
.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>