Calc tối đa hoặc tối đa calc trong CSS


122

Có thể làm điều gì đó như thế này không

max-width: calc(max(500px, 100% - 80px))

hoặc là

max-width: max(500px, calc(100% - 80px)))

trong CSS?


Bạn đã tự mình thử chúng chưa?
Kyle G.

5
Như @ gert-sønderby đã nói, chỉ cần sử dụng hai cái này: min-width: 500px; chiều rộng: calc (100% - 80px);
paulie 4

Câu trả lời:


11

min(), max()clamp()cuối cùng đã có sẵn!

Bắt đầu từ Firefox 75, Chrome 79 và Safari 11.1 (ngoại trừ clamp).

min()max()lấy bất kỳ số đối số nào.

clamp()có cú pháp clamp(MIN, VAL, MAX)và tương đương với max(MIN, min(VAL, MAX)).

min()max()có thể được lồng vào nhau. Chúng có thể được sử dụng trong calc()cũng như bên ngoài nó, chúng cũng có thể chứa các biểu thức toán học, điều đó có nghĩa là bạn có thể tránh calc()khi sử dụng chúng.

Do đó, ví dụ ban đầu có thể được viết là:

max-width: max(500px, 100% - 80px);

1
Đối với những gì nó đáng giá, MS Edge cho macOS (Phiên bản 81.0.416.68) cũng cho phép những điều này. Người ta sẽ cho rằng phiên bản Windows cũng hoạt động. Không biết phiên bản tối thiểu được hỗ trợ.
jhelzer

1
Edge mới về cơ bản là Chrome, các phiên bản của nó tuân theo Chrome. Dữ liệu tương thích đầy đủ của trình duyệt nằm ở cuối các trang được liên kết.
người dùng

115

Một giải pháp css 'thuần túy' thực sự hiện có thể sử dụng các truy vấn phương tiện:

.yourselector {
  max-width: calc(100% - 80px);
}

@media screen and (max-width: 500px) {
  .yourselector {
    max-width: 500px;
  }
}

3
Giải pháp tuyệt vời! Tôi đã thực sự sử dụng nó cho chiều cao tối thiểu, có vẻ như bạn cũng có thể sử dụng các truy vấn phương tiện cho max-height+1
avishic

102

Không, bạn không thể. max()min()đã bị loại khỏi Giá trị và Đơn vị CSS3. Tuy nhiên, chúng có thể được giới thiệu lại trong Giá trị và Đơn vị CSS4 . Hiện tại không có thông số kỹ thuật cho chúng và calc()thông số kỹ thuật không đề cập đến việc một trong hai hàm này hợp lệ trong một calc()hàm.


1
Bạn có thể sử dụng JavaScript để lấy kiểu tính toán (thực sự là kiểu được sử dụng) của phần tử. Xóa 80px khỏi nó và so sánh nó với 500 để xem cái nào lớn hơn. Một cái gì đó như var val = parseInt (window.getComputedStyle (el, null) .getPropertyValue ("width")) - 80) để lấy chiều rộng - 80 và el.style.maxWidth để đặt chiều rộng tối đa.
David Storey

10
Cảm ơn bạn. Tuy nhiên, tôi thích một giải pháp CSS thuần túy hơn.
Arnaud

41
Bất cứ khi nào có câu hỏi CSS và câu trả lời bắt đầu bằng "Bạn có thể sử dụng JavaScript", điều đó không chính xác. Có nhiều lý do hợp lệ để muốn giữ tất cả mã bản trình bày trong CSS. Tất cả-- không phải hầu hết.
b264,

8
Có vẻ như min () và max () đã trở lại trong Mô-đun Đơn vị và Giá trị CSS cấp 4 (Bản nháp của người biên tập, ngày 1 tháng 9 năm 2017) Liên kết: drafts.csswg.org/css-values/#calc-notation
Jakob E

5
NHƯNG có một giải pháp cho vấn đề, hãy tiếp tục cuộn đến câu trả lời @andy bên dưới
Offirmo

44

Một giải pháp thay thế sẽ là sử dụng widthchính nó.

max-width: 500px;
width: calc(100% - 80px);

3
Đây là một ý kiến ​​hay, nhưng nếu tôi hiểu câu hỏi của @ Arnaud một cách chính xác, thì anh ấy muốn chiều rộng tối đa của một trong hai 500pxhoặc 100% - 80px. Giải pháp của bạn giới hạn chiều rộng tối đa cho 500px100% - 80pxlớn hơn.
Theophilus

2
Nhưng nó cũng giống như việc sử dụng min()do đó có thể hữu ích cho người khác.
Seika85

17
Đối với tôi, dường như việc sử dụng chiều rộng tối thiểu thay vì chiều rộng tối đa trong ví dụ trên có thể tương đương với hành vi được hỏi cho.
Gert Sønderby

1
Câu trả lời đã giúp tôi thêm lề vào vùng chứa linh hoạt khi chiều rộng trang nhỏ. codepen.io/OBS/pen/wGrRJV
ofer.sheffer

Tôi đã đăng một giải pháp chứng minh nhận xét của @ GertSønderby thực sự là giải pháp chính xác.
SherylHohman

13

Trong khi câu trả lời của @ david-mangold ở trên , là "gần" thì nó không chính xác.
(Bạn có thể sử dụng giải pháp của anh ấy nếu bạn muốn chiều rộng tối thiểu , thay vì chiều rộng tối đa ).

Giải pháp này chứng minh rằng bình luận @ gert-sønderby cho câu trả lời đó hoạt động:
Câu trả lời lẽ ra nên sử dụng min-width, không phải max-width.

Đây là những gì nó đáng lẽ phải nói:

min-width: 500px;
width: calc(100% - 80px);

Có, sử dụng chiều rộng tối thiểu cộng với chiều rộng để mô phỏng hàm max () .

Đây là codepen (dễ dàng hơn để xem bản demo trên CodePen và bạn có thể chỉnh sửa nó để thử nghiệm của riêng mình).

.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>

Điều đó nói rằng, câu trả lời của @ andy ở trên có thể dễ dàng hơn để suy luận và có thể phù hợp hơn trong nhiều trường hợp sử dụng.

Cũng lưu ý rằng cuối cùng a max()và một min()hàm có thể được đưa vào CSS, nhưng kể từ tháng 4 năm 2019, nó không phải là một phần của thông số kỹ thuật.


1
Tại sao lại ủng hộ? Mọi thứ đã nêu đều đúng, và tất cả các nguồn đã được liên kết và ghi có.
SherylHohman

1

@Amaud Có giải pháp thay thế nào để có cùng kết quả không?

Có một cách tiếp cận css thuần túy không phải js sẽ đạt được kết quả tương tự. Bạn sẽ cần điều chỉnh padding / margin vùng chứa phần tử gốc.

.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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.