Cách đặt min-font-size trong CSS


81

Tôi muốn đặt kích thước phông chữ tối thiểu cho mọi phần tử trong trang HTML của mình.

Ví dụ: nếu có các phần tử có kích thước phông chữ nhỏ hơn 12px, thì chúng sẽ thay đổi thành 12px.
Nhưng nếu có các phần tử có font-size grater thì 12px, chúng sẽ không thay đổi.

Có cách nào để làm điều đó với CSS không?

Câu trả lời:


3

Không. Mặc dù bạn có thể đặt kích thước phông chữ cơ sở khi bodysử dụng thuộc font-sizetính, nhưng bất kỳ thứ gì sau đó chỉ định kích thước nhỏ hơn sẽ ghi đè quy tắc cơ sở cho phần tử đó. Để thực hiện những gì bạn muốn, bạn sẽ cần sử dụng Javascript.

Bạn có thể lặp lại các phần tử trên trang và thay đổi các phông chữ nhỏ hơn bằng cách sử dụng một cái gì đó như sau:

$("*").each( function () {
    var $this = $(this);
    if (parseInt($this.css("fontSize")) < 12) {
        $this.css({ "font-size": "12px" });   
    }
});

Đây là Fiddle mà bạn có thể xem nó được thực hiện: http://jsfiddle.net/mifi79/LfdL8/2/


Có cách nào đơn giản để tìm các phần tử jQuery có kích thước nhỏ hơn 12px không?
nrofis

@nrofis - chắc chắn rồi, hãy xem phần chỉnh sửa cho câu trả lời của tôi ở trên. Chúc mừng!
mifi79

11
Lặp đi lặp lại TẤT CẢ các phần tử trên một trang và thay đổi thuộc tính CSS có vẻ như là một ý tưởng thực sự tồi từ quan điểm hiệu suất. Tôi không phải là chuyên gia về những gì kích hoạt các dòng lại nhưng bạn có thể vô tình chỉnh trang lại rất nhiều với cách tiếp cận này. Tôi không khuyến khích cách tiếp cận này.
Avand Amiri

Tôi với @AvandAmiri - đây là một cách tiếp cận tồi theo nghĩa là kiểu suy nghĩ này dẫn đến nhiều giải pháp khác như thế này trên một trang, sau đó dẫn đến các trang web không hoạt động và thậm chí là rò rỉ bộ nhớ sẽ làm ứng dụng của bạn bị hỏng. Câu trả lời thực sự cho điều này là (cho đến khi font-size max trở thành thứ có thể sử dụng hợp pháp) là thắt chặt kiến ​​trúc - thiết kế và triển khai một hệ thống tốt chỉ hoạt động đúng cách. Không được có kích thước phông chữ trên một trang là "ngẫu nhiên".
dudewad

1
@ AndersLindén Trong trường hợp đó, thiết lập một cỡ chữ tối thiểu trong một truy vấn phương tiện truyền thông, ví dụ, nếu bạn không muốn kích thước phông chữ của bạn để đi dưới 10px: p{ font-size: 1vw } @media (max-width: 1000px){ p{ font-size: 10px } }
nHaskins

210

Trong CSS3, có một thủ thuật đơn giản nhưng tuyệt vời cho điều đó:

font-size:calc(12px + 1.5vw);

Điều này là do phần tĩnh của calc () xác định mức tối thiểu. Mặc dù phần động có thể co lại gần 0.


19
hack tuyệt vời!

1
Tôi mến bạn. Điều này thật tuyệt.
Luke Taylor

4
@StefanSteiger, bạn có thể sử dụng các truy vấn phương tiện truyền thông cho việc này: (a) phương tiện truyền thông (max-width: 610px) ...
Adam Wallner

2
Xuất sắc! Chính xác những gì tôi cần. Cảm ơn bạn!
spedley

6
Mặc dù đây là một bản hack hay, nhưng tôi phải nói rằng đây không thực sự là một giải pháp vì nó ảnh hưởng đến kích thước phông chữ khi kích thước trên tối thiểu, vì vậy bạn phải luôn dùng thêm 12px(trong trường hợp này).
Tom Wyllie,

53

Kể từ giữa tháng 12 năm 2019, hàm tối thiểu / tối đa CSS4 chính xác là những gì bạn muốn:
(cẩn thận, đây là điều rất mới, các trình duyệt cũ hơn (hay còn gọi là IE & msEdge) chưa hỗ trợ)
(được hỗ trợ kể từ Chromium 79 & Firefox v75)

https://developer.mozilla.org/en-US/docs/Web/CSS/min
https://developer.mozilla.org/en-US/docs/Web/CSS/max

Thí dụ:

blockquote {
    font-size: max(1em, 12px);
}

Bằng cách đó, kích thước phông chữ sẽ là 1em (nếu 1em> 12px), nhưng ít nhất là 12px.

Rất tiếc, tính năng CSS3 tuyệt vời này chưa được bất kỳ trình duyệt nào hỗ trợ, nhưng tôi hy vọng điều này sẽ sớm thay đổi!

Biên tập:

Điều này từng là một phần của CSS3, nhưng sau đó đã được lên lịch lại cho CSS4.
Kể từ ngày 11 tháng 12 năm 2019 , hỗ trợ đã đến với Chrome / Chromium 79 (bao gồm cả trên Android và Android WebView) và như vậy cũng có trong Microsoft Chredge hay còn gọi là Anaheim, bao gồm Opera 66 và Safari 11.1 (bao gồm iOS)


7
nghiêm túc mà nói, tại sao các ủy ban tiêu chuẩn luôn loại bỏ những thứ thực sự khiến công việc của tôi có thể thực hiện được !?
Michael

2
@Michael, CSS WG xóa nội dung chủ yếu vì thiếu sự quan tâm hoặc mức độ ưu tiên của người triển khai. Nó cần hai lần triển khai độc lập để có được một tính năng CSS trong một Đề xuất W3C cuối cùng. Không có ích gì khi viết một bài báo và không ai muốn đưa nó vào phần mềm thế giới thực. Vì vậy, bạn nên hỏi các nhà cung cấp trình duyệt ...
jj

1
Tìm thấy tuyệt vời! Có thể sử dụng với các biến css để đặt min / max. Ví dụ: :root { --responsive-font-size-primary: min(2em, max(0.5em, 5vmin)); }làm cho việc sử dụng trở nên đơn giản:font-size: var(--responsive-font-size-primary);
Corey Alix

@Corey Alix: Tuyệt vời, chỉ cần nhận thấy hỗ trợ cho điều đó đã đến vào ngày 11 tháng 12 năm 2019. Hãy cẩn thận với chủ đề, tất cả các trình duyệt không dựa trên Chromium đều chưa hỗ trợ. Nhưng hỗ trợ cho nó trong Chrome là một tin rất thú vị.
Stefan Steiger

1
@Michael: Tin tốt - nó hiện đã được triển khai! (mỗi giữa tháng 12 năm 2019)
Stefan Steiger

8

Có vẻ như tôi hơi muộn nhưng đối với những người khác gặp sự cố này, hãy thử mã này

p { font-size: 3vmax; }

sử dụng bất kỳ thẻ nào bạn thích và kích thước bạn thích (thay thế 3)

p { font-size: 3vmin; }

được sử dụng cho kích thước tối đa.


5
vmax và vmin thực sự được sử dụng để xác định các giá trị liên quan đến chế độ xem / kích thước trang. Tối thiểu và tối đa đề cập đến chế độ xem tối thiểu / tối đa chứ không phải tối thiểu hoặc tối đa của kích thước phông chữ - đó là những gì op đã yêu cầu. (ví dụ: nếu chiều cao lớn hơn chiều rộng của khung nhìn so với vmax thì bằng 100vmax = chiều cao của khung nhìn và 100vmin = chiều rộng của khung nhìn)
Chaim

8

Sử dụng một truy vấn phương tiện. Ví dụ: Đây là một cái gì đó tôi đang sử dụng kích thước ban đầu là 1,0vw nhưng khi nó đạt đến 1000, chữ cái trở nên quá nhỏ nên tôi mở rộng quy mô

@media(max-width:600px){
    body,input,textarea{
         font-size:2.0vw !important;
    }
}

Trang web tôi đang làm việc này không đáp ứng cho> 500px nhưng bạn có thể cần thêm. Ưu điểm, lợi ích của giải pháp này là bạn giữ nguyên kích thước phông chữ mà không có các chữ cái siêu nhỏ và bạn có thể giữ cho nó miễn phí.


1
ugh. Điều này liên kết phần tử với độ phân giải của cửa sổ, phải không? có nghĩa là nói chung, bạn sẽ cần một truy vấn phương tiện riêng cho từng phần tử trên trang.
Michael

4

CSS có một hàm kẹp () giữ giá trị giữa giới hạn trên và giới hạn dưới. Hàm kẹp () cho phép chọn giá trị giữa trong phạm vi giá trị giữa giá trị tối thiểu và giá trị lớn nhất đã xác định.

Nó chỉ đơn giản là có ba chiều:

  1. Giá trị tối thiểu.
  2. Liệt kê mục
  3. Giá trị ưu tiên Giá trị cho phép tối đa.

hãy thử với mã bên dưới và kiểm tra thay đổi kích thước cửa sổ, điều này sẽ thay đổi kích thước phông chữ bạn thấy trong bảng điều khiển. tôi đặt giá trị lớn nhất 150pxvà giá trị nhỏ nhất 100px.

$(window).resize(function(){
    console.log($('#element').css('font-size'));
});
console.log($('#element').css('font-size'));
h1{
    font-size: 10vw; /* Browsers that do not support "MIN () - MAX ()" and "Clamp ()" functions will take this value.*/
    font-size: max(100px, min(10vw, 150px)); /* Browsers that do not support the "clamp ()" function will take this value. */
    font-size: clamp(100px, 10vw, 150px);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<center>
  <h1 id="element">THIS IS TEXT</h1>
</center>


3

Giải pháp CSS:

.h2{
  font-size: 2vw
}
@media (min-width: 700px) {
  .h2{
    /* Minimum font size */
    font-size: 14px
  }
}
@media (max-width: 1200px) {
  .h2{
    /* Maximum font size */
    font-size: 24px
  }
}

Chỉ trong trường hợp nếu một số người cần kết hợp scss:

///
/// Viewport sized typography with minimum and maximum values
///
/// @author Eduardo Boucas (@eduardoboucas)
///
/// @param {Number}   $responsive  - Viewport-based size
/// @param {Number}   $min         - Minimum font size (px)
/// @param {Number}   $max         - Maximum font size (px)
///                                  (optional)
/// @param {Number}   $fallback    - Fallback for viewport-
///                                  based units (optional)
///
/// @example scss - 5vw font size (with 50px fallback),
///                 minumum of 35px and maximum of 150px
///  @include responsive-font(5vw, 35px, 150px, 50px);
///

@mixin responsive-font($responsive, $min, $max: false, $fallback: false) {
  $responsive-unitless: $responsive / ($responsive - $responsive + 1);
  $dimension: if(unit($responsive) == 'vh', 'height', 'width');
  $min-breakpoint: $min / $responsive-unitless * 100;

  @media (max-#{$dimension}: #{$min-breakpoint}) {
    font-size: $min;
  }

  @if $max {
    $max-breakpoint: $max / $responsive-unitless * 100;

    @media (min-#{$dimension}: #{$max-breakpoint}) {
      font-size: $max;
    }
  }

  @if $fallback {
    font-size: $fallback;
  }

  font-size: $responsive;
}

1

AFAIK thì không thể với CSS đơn thuần,
nhưng bạn có thể thực hiện một thao tác jQuery khá tốn kém như:

jsBin demo

$('*').css('fontSize', function(i, fs){
  if(parseInt(fs, 10) < 12 ) return this.style.fontSize = "12px";
});

Thay vì sử dụng Global Selector, * tôi khuyên bạn (nếu có thể) nên cụ thể hơn với các bộ chọn của bạn.


1

Các thuộc tính font-min-sizefont-max-sizeCSS đã bị xóa khỏi thông số kỹ thuật Mô-đun Phông chữ CSS cấp 4 (và không bao giờ được triển khai trong các trình duyệt AFAIK). Và Nhóm công tác CSS đã thay thế các ví dụ CSS bằng các ví dụ font-size: clamp(...)chưa có hỗ trợ trình duyệt tốt nhất, vì vậy chúng tôi sẽ phải đợi các trình duyệt hỗ trợ nó. Xem ví dụ trong https://developer.mozilla.org/en-US/docs/Web/CSS/clamp#Examples .


0

Đánh giá nhận xét ở trên của bạn, bạn có thể làm điều này với jQuery - đây là:

// for every element in the body tag
$("*", "body").each(function() {
  // parse out its computed font size, and see if it is less than 12
  if ( parseInt($(this).css("font-size"), 10) < 12 )
    // if so, then manually give it a CSS property of 12px
    $(this).css("font-size", "12px")
});

Một cách rõ ràng hơn để làm điều này có thể là có lớp "min-font" trong CSS của bạn đặt font-size: 12px và thay vào đó chỉ cần thêm lớp:

$("*", "body").each(function() {
  if ( parseInt($(this).css("font-size"), 10) < 12 )
    $(this).addClass("min-font")
});

-1

Nó sẽ hoạt động hoàn hảo với 50px. Mà sẽ hoạt động như một tĩnh và do đó là chiều rộng tối thiểu.

font-size: calc(50px + 5vw);
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.