Cách căn giữa div theo chiều dọc, cách trái/phải 10px và chiều cao bằng một nửa chiều rộng

Để tạo một khối div có chiều cao luôn bằng một nửa chiều rộng, đồng thời căn giữa theo chiều dọc và cách hai bên trái/phải 10px, có thể áp dụng hai phương pháp CSS hiệu quả như sau:

Phương pháp 1: Dùng padding-bottom: 50% kết hợp Flexbox

Do giá trị phần trăm của paddingmargin trong CSS luôn tính theo chiều rộng của phần tử cha, nên padding-bottom: 50% sẽ tạo ra chiều cao bằng 50% chiều rộng. Kết hợp với định vị tuyệt đối cho nội dung bên trong để lấp đầy vùng này.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Vertical Center with Aspect Ratio</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    html, body {
      height: 100%;
      width: 100%;
    }
    .container {
      margin: 0 10px;
      height: 100%;
      display: flex;
      align-items: center;
    }
    .aspect-box {
      width: 100%;
      height: 0;
      padding-bottom: 50%;
      position: relative;
      background: red;
    }
    .content {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 20px;
      color: white;
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="aspect-box">
      <div class="content">A</div>
    </div>
  </div>
</body>
</html>

Phương pháp 2: Sử dụng calc() và đơn vị vw

Đơn vị vw (viewport width) cho phép tính toán kích thước dựa trên chiều rộng cửa sổ trình duyệt. Dùng calc(100vw - 20px) để xác định chiều rộng (trừ đi 10px mỗi bên), và chiều cao bằng một nửa giá trị đó. Căn giữa theo chiều dọc bằng top: 50%transform: translateY(-50%).

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Aspect Ratio with vw</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
    html, body {
      height: 100%;
      width: 100%;
    }
    .viewport {
      position: relative;
      width: 100%;
      height: 100%;
    }
    .dynamic-box {
      position: absolute;
      left: 10px;
      width: calc(100vw - 20px);
      height: calc((100vw - 20px) / 2);
      top: 50%;
      transform: translateY(-50%);
      background: red;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 20px;
      color: white;
    }
  </style>
</head>
<body>
  <div class="viewport">
    <div class="dynamic-box">A</div>
  </div>
</body>
</html>

Thẻ: css flexbox responsive design

Đăng vào ngày 10 tháng 9 lúc 03:57