[TỔNG HỢP] Kỹ thuật căn giữa trong CSS

Ngày đăng: 07/04/2021   -    Cập nhật: 08/04/2021
Căn giữa mọi thứ trong CSS là một công việc mà bất kỳ lập trình viên Front end nào cũng phải làm. Nhưng rất nhiều người gặp khó trong vấn đề này.


Mình nghĩ vấn đề không phải là khó thực hiện căn giữa trong CSS, mà ở chỗ có rất nhiều cách thực hiện khác nhau, tùy thuộc vào tình huống, thế nên cũng thật khó để biết cách nào là tốt nhất.


Chính vì thế, hôm nay mình sẽ tổng hợp lại các kỹ thuật căn giữa trong CSS để giúp bạn tiện tra cứu.



 Kỹ thuật căn giữa trong CSS


I. Căn giữa theo chiều ngang



Căn giữa các phần tử theo chiều ngang trong CSS thì khá là đơn giản:


I.1. Căn giữa nội dòng hoặc căn giữa phần tử inline



Bạn có thể căn giữa các phần tử nội tuyến (text hoặc link...) theo chiều ngang của trong phần tử cha (block-level), bằng cách đặt vào phần tử cha đoạn code CSS này:



.center-children {
    text-aligncenter;
}
 


Ví dụ: Căn giữa nội dung của thẻ p, hoặc thẻ a bên trong nav




Cách này sẽ hoạt động cho inline, inline-block, inline-table, inline-flex, v.v.


> Lưu ý: Nếu bạn không thấy được ví dụ trong Codepen thì bạn phải vào Codpen.io -> Vượt captcha -> Đăng nhập tài khoản -> Sau đó quay lại đây và bấm F5



I.2. Căn giữa phần tử block



Bạn có thể căn giữa một phần tử block bằng cách thiết lập:


  • margin-leftmargin-right thành auto


Và lưu ý là phải thiết lập width cho nó, nếu không thì chiều rộng của nó là 100% (bằng phần tử cha) và không cần căn giữa (Giải pháp này không áp dụng căn giữa cho nội dung bên trong nó)


Căn giữa theo cách này thường được viết tắt như thế này:




.center-block {
    margin0 auto;
}
 


Ví dụ: Căn giữa thẻ div được đặt bên trong thẻ main.



Điều này sẽ hoạt động bất kể chiều rộng của phần tử block mà bạn đang căn giữa hay phần tử cha là bao nhiêu.


I.3. Căn giữa nhiều phần tử block



Nếu bạn có hai hoặc nhiều phần tử block cần được căn giữa theo chiều ngang trong một hàng, bạn có thể dễ dàng làm điều đó bằng cách đổi kiểu hiển thị (thuộc tính display).


Dưới đây là một ví dụ về sử dụng flexbox để căn giữa (cách làm này rất đơn giản và phổ biến nhất):





Nếu bạn vẫn muốn mỗi phần tử block là một hàng thì sử dụng margin: 0 atuo; vẫn tốt:




II. Căn giữa theo chiều dọc



Căn giữa các phần tử theo chiều dọc trong CSS thì phức tạp hơn một chút.


  • Và nếu đó là inline hoặc inline-* element:


II.1. Căn giữa theo chiều dọc (sigle line)



Đôi khi, phần tử inline hoặc text có thể được căn giữa theo chiều dọc bằng cách sử dụng padding bằng nhau, ví dụ:



.center {
    padding-top30px;
    padding-bottom30px;
}
 



Ví dụ: Căn text ở giữa theo chiều dọc của thẻ a




Nếu không sử dụng padding vì một lý do nào đó, thì có một mẹo là làm cho chiều cao của dòng (line-height) bằng chiều cao của phần tử đó (nếu nội dung không dài và không cần xuống dòng).


Ví dụ: Nếu phần tử có height: 100px thì chúng ta đặt line-height100px để text bên trong đó tự động vào giữa theo chiều dọc.





II.2. Căn giữa theo chiều dọc (multipe lines)



Phần đệm (padding) bằng nhau ở trên và dưới cũng có thể tạo hiệu ứng căn giữa cho nhiều dòng văn bản.


Trong trường hợp này, bạn có thể sử dụng thuộc tính vertical-align cho kiểu table (thực hoặc được thay đổi display)


Nếu phần tử là table thì mặc định nó sẽ căn giữa ô bảng (table-cell).


Còn nếu bạn thiết lập từ CSS thì bạn cần phải chỉ định vertical-align: middle; như trong ví dụ sau:




Nếu trong trường hợp không thể biến nó thành table, có lẽ bạn có thể sử dụng flexbox:



.flex-center {
    displayflex;
    flex-directioncolumn;
    justify-contentcenter;
}
 


Cách làm này đơn giản hơn rất nhiều.


Một phần tử flex con có thể được căn giữa trong một phần tử flex cha khá dễ dàng như sau:





> Lưu ý: Nó chỉ thực sự có liên quan nếu container mẹ có chiều cao cố định (px, %, v.v.), đó là lý do tại sao container ở đây có thiết lập chiều cao.


Nếu cả hai kỹ thuật này vì lý do nào đó mà không hiệu quả, bạn có thể sử dụng thủ thuật "Amazing Gút chóp" này:



  • Tạo một tử giả có chiều cao 100% được đặt bên trong container
  • Sau đó văn bản được căn chỉnh theo chiều dọc với nó.

Nhìn chung kỹ thuật sẽ như thế này:



.container {
    positionrelative;
}
 
/* Tạo phần tử giả */
.container::before {
    content" ";
    displayinline-block;
    height100%;
    width1%;
    vertical-alignmiddle;
}
 
/* Căn giữa dựa vào phần tử giả */
.container p {
    displayinline-block;
    vertical-alignmiddle;
}
 


Ví dụ:




  • Còn nếu đó là block-level:


II.3. Căn giữa block-level nếu biết chiều cao



Khá phổ biến khi không biết chiều cao trong bố cục trang web, vì nhiều lý do:


  • Chiều rộng thay đổi, văn bản không xuống hàng cũng có thể thay đổi chiều cao. Sự khác nhau trong kiểu dáng của văn bản có thể thay đổi chiều cao.
  • Sự khác nhau về số lượng văn bản có thể thay đổi chiều cao.
  • Các phần tử có tỷ lệ khung hình cố định, như hình ảnh, có thể thay đổi chiều cao khi thay đổi kích thước.
  • ...


Nhưng nếu bạn đã biết chiều cao, bạn có thể căn giữa theo chiều dọc như:



.parent {
    positionrelative;
}

.child {
    positionabsolute;
    top50%;
    height100px;
    margin-top-50px;
    /* Tính đến padding và border nếu không sử dụng box-sizing: border-box; */
}
 


Ví dụ:




II.4. Căn giữa block-level nếu chưa biết chiều cao



Nếu chưa biết chiều cao, bạn vẫn có thể căn giữa nó bằng cách di chuyển nó lên 50% chiều cao của nó sau khi di chuyển nó xuống 50%:



.parent {
    positionrelative;
}

.child {
    positionabsolute;
    top50%/* Cách top 50% */
    /* Tại vị trí này, dịch chuyển lên trên theo chiều Y 50% */
    transformtranslateY(-50%);
}
 


Ví dụ:





II.4. Căn giữa block-level theo chiều dọc với flexbox



Căn giữa theo chiều dọc một block-level rất dễ dàng với flexbox.



.parent {
    displayflex;
    flex-directioncolumn;
    justify-contentcenter;
}
 


Ví dụ:



Bạn cũng có thể căn giữa trong flexbox bằng cách sử dụng margin: auto; trên phần tử con.


III. Căn giữa theo cả chiều ngang và chiều dọc trong CSS



Bạn có thể kết hợp các kỹ thuật trên theo bất kỳ cách nào để có được các yếu tố chính giữa một cách hoàn hảo.


Tuy nhiên, ba nhóm này là cách thường làm:



III.1. Căn giữa hoàn toàn nếu chiều rộng và chiều cao là cố định



Nếu chiều rộng và chiều cao là cố định, chúng ta có thể sử dụng margin âm bằng một nửa chiều rộng và chiều cao đó.


Sau đó position: absolute và dịch chuyển top: 50%left: 50% để căn giữa nó với sự hỗ trợ tốt trên nhiều trình duyệt.


Về cơ bản là như thế này:




.parent {
    positionrelative;
}

.child {
    width200px;
    height100px;
    padding20px;

    positionabsolute;
    top50%;
    left50%;

    margin-70px 0 0 -120px;
}
 


Ví dụ:




III.2. Căn giữa hoàn toàn nếu chưa biết chiều rộng và chiều cao



Nếu bạn không biết chiều rộng hoặc chiều cao, bạn có thể sử dụng thuộc tính transformtranslate -50% theo cả hai hướng (dựa trên chiều rộng / chiều cao hiện tại của phần tử) để căn giữa:



.parent {
    positionrelative;
}

.child {
    positionabsolute;
    /* Dịch chuyển 50% theo theo phần tử định vị*/
    top50%;
    left50%;
    /* Dịch chuyển ngược lại 50% theo chiều rộng và chiều cao */
    transformtranslate(-50%-50%);
}
 


Ví dụ:




III.3. Căn giữa hoàn toàn với flexbox



Để căn giữa theo cả hai hướng với flexbox, bạn cần sử dụng hai thuộc tính căn giữa như thế này:



.parent {
    displayflex;
    justify-contentcenter;
    align-itemscenter;
}
 


Ví dụ:




III.4. Căn giữa hoàn toàn với Grid



Hoặc bạn cũng có thể sử dụng tính năng CSS GRID để căn giữa hoàn toàn.



body,
html {
    height100%;
    /* Thay đổi kiểu hiển thị thành GRID */
    displaygrid;
}

span {
    /* Căn giữa phần tử cần căn giữa */
    marginauto;
}
 


Ví dụ:




Tổng kết về căn giữa trong CSS



Đó, đó là tất cả các kỹ thuật căn giữa trong CSS mà mình nghĩ đầy đủ để bạn sử dụng.


Hi vọng nó giúp ích trong quá trình học lập trình Front end của bạn.



> Nếu bạn yêu thích mảng Front end và muốn học để đi thực tập / đi làm sớm thì tham gia HỌC FRONT END ngay đi thôi!


---

HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python

Bình luận Facebook
Khóa học liên quan đến bài viết

KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS

56 giờ
Học Lập trình Front end hiện đại với ReactJS. Học làm chủ HTML, CSS, JS và thư viện JavaScript phổ biến nhất hiện nay. Sẵn sàng đi thực tập / đi làm ngay sau khóa học.

Khóa học PHP Full stack [2023] cho người mới bắt đầu

96 giờ
Khóa học Lập trình PHP Full stack, phiên bản cập nhật lần thứ 8. Dạy Lập trình PHP bài bản từ Front end đến Back end + Laravel. Hướng dẫn làm 2 Dự Án Web lớn

KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG

50 giờ
Khóa học giúp học viên sử dụng thành thạo ngôn ngữ Lập trình Python (3x). Hiểu và phát triển được Ứng dụng Web với Django Framework. Học thực hành với Giảng viên cao cấp.

Lập trình PHP với Laravel Framework

42 giờ
Khóa học Lập trình PHP với Laravel Framework được NIIT - ICT HÀ NỘI xây dựng nhằm hoàn thiện kỹ năng lập trình web các các bạn đã biết Lập trình Web PHP thuần.

Khóa học Java Full stack (IJFD)

104 giờ
Học lập trình Java Fullstack với khóa học được xây dựng theo lộ trình bài bản, từ JAVA CƠ BẢN đến JAVA WEB và nâng cao về JAVA FRAMEWORK như: Spring Boot, Hibernate
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!