post image

Vertical-align trong CSS

Tính năng Vertical-align trong CSS được kế thừa từ “thời đại” sử dụng bảng để thiết kế giao diện. Hiện tại tính năng valign trong table đã bị “đào thải” và không còn được sử dụng đúng chuẩn web nữa. Nhưng thay vào đó CSS lại giới thiệu một tính năng khác nghe tên hoàn toàn giống với valign là Vertical-align. Chính vì điều này nên đã gây ra một số hiểu lầm về nó. Trong bài này chúng ta sẽ xem xét cách sử dụng vertical-align trong CSS.

Trên thực tế rất ít khi bạn phải sử dụng tính năng vertical-align trong CSS trừ khi bạn đang thiết kế bảng với dữ liệu cần căn chỉnh vào giữa dòng. Nhưng theo kinh nghiệm cá nhân tôi, khi làm giao diện tôi rất ít khi sử dụng vertical-align bởi vì nó thực sự không cần thiết. Do chúng ta có thể sử dụng padding và margin để điều khiển nó tới vị trí mà mình muốn. Nhưng với những người mới học CSS và vừa thoát ra khỏi cách thiết kế bằng bảng thì cái “lối mòn” cũ vẫn chưa hoàn toàn bỏ được. Chính vì vậy nhiều người mới hỏi tại sao khi sử dụng vertical-align: middle trong thẻ div nó lại không cho kết quả như mong muốn.

Nói chung cách sử dụng vertical-align trong CSS để căn chỉnh một thành phần không phải là table cell cũng không hề đơn giản mà cũng lắm nhiêu khê. Có nhiều cách hoàn toàn không tương thích với các trình duyệt đặc biệt là IE (kể cả IE 8). Vậy nên khi quyết định sử dụng vertical-align để căn chỉnh thành phần trong block element như <div> bạn nên suy nghĩ cho kỹ. Tuy nhiên vì bạn vẫn muốn làm hoặc bắt buộc phải làm thì dưới đây là một số cách bạn có thể áp dụng được.

Cách 1: Biến <div> thành table cell

Trong cách này chúng ta sẽ biến một thẻ <div> thành một table cell và do đó có thể áp dụng vertical-align bình thường. Cái hay của cách này là ngắn gọn và lẹ nhưng nó không tương thích với trình duyệt IE (kể cả IE 8 beta). Cho nên bạn cũng cần suy nghĩ ở đây.

<div id="container">
   <div id="content">
     <p>Lorem ipsum dolor sit amet.</p>
   </div>
</div>
#container {display: table;}
#content {display: table-cell; vertical-align: middle;}
Cách 2: Sử dụng margin và absolute position

Trong cách này chúng ta sẽ sử dụng absolute position để định vị thành phần và dùng margin giá trị âm để bù lại khoảng mình đẩy xuống. Cái hay trong cách này là tương thích với mọi trình duyệt, không cần thêm một thẻ div nữa. Nhưng mỗi khi trình duyệt bị thu nhỏ quá, nội dung sẽ biến mất.

<div id="container">
   <div id="content">
    <p> Lorem ipsum dolor sit amet.</p>
   </div>
</div>
#container {position: relative;}
#content {
position:absolute;
top:50%; height:200px;
margin-top:-100px; /* giá trị âm bằng một nửa chiều cao */
}
Cách 3: sử dụng line-height

Đây là cách có khi được sử dụng nhiều nhất bởi vì nó đơn giản nhất và tương thích với mọi trình duyệt. Nhưng nó chỉ có thể áp dụng với những thành phần chỉ có một dòng chữ và thành phần chứa nó có độ cao cụ thể.

<div id="content">
     Lorem ipsum dolor sit amet.
   </div>
#content {
 height:200px;
#content p {
line-height: 200px;
}
Kết luận

Ở bài này tôi giới thiệu với bạn 3 cách để căn chỉnh theo chiều dọc một thành phần. Cách nào cũng có điểm mạnh và điểm yếu và bạn hãy tùy từng trường hợp mà áp dụng sao cho hợp lý. Nhưng trên thực tế một đoạn văn không nhất thiết phải nằm giữa một thẻ div mới đẹp. Chính vì thế trừ trường hợp bắt buộc, tránh sử dụng vertical-align cho nó đỡ rắc rối.

«

»

17 Comments

( Comment bài này )
  1. hien says:

    Đối với cách thứ 3 mình thấy như vầy:
    - Chỉ định chiều cao cố định cho #container
    - đặt top của #content là 50%
    cũng ra được kết quả.

  2. Crazy KV says:

    Đã có padding và margin rồi, ko chơi cái này. Hehe!

  3. Cường says:

    mấy thẻ imgs, để tag html nên bị xoá

  4. Cường says:

    Chào các bạn, mình đang tìm cách CSS để Vertical Align mấy thẻ vào bottom của Div. Mình thì ko muốn dùng vertical-align và display:table vì ko tương thích với IE6/7, dùng position:absolute với bottom:0 thì chỉ áp được 1 hình thôi, nhiều hình thì các hình nó nằm chồng lên nhau. Không biết các bạn có cách nào để Align các tấm hình vào bottom của Div ko? Các tấm hình có chiều cao khác nhau, muốn Align bottom để cạnh dưới của chúng ngang hàng nhau, cạnh trên thì cho nó cao thấp ko đều. Nhờ các bạn tìm cách giúp, mình tìm Google cũng nhiều rồi, giống giống như bài Tut này của chủ trang thôi. Cám ơn trước nhá.

  5. VanTan says:

    Giá trị âm chỉ sử dụng được đối với thẻ “margin”. Nó cũng không khác gì mấy so với giá trị dương, cũng giống như là ” 1 va -1 ” thôi.

  6. Thử đoạn code này xem sao

    .center {
       width: 300px;
       height: 300px;
       position: absolute;
       left: 50%;
       top: 50%;
       margin-left: -150px;
       margin-top: -150px;
    }

    Mà những cách trên không cách nào giúp được bạn à?

  7. phangiatuananh says:

    Xin cho mình hỏi, có 1 thẻ div background màu đỏ, width:300px và height 300px.
    Làm sao để có thể canh giữa nó theo chiều dọc trên mọi độ phân giải màn hình???
    Thanks

  8. kollein says:

    mình cũng xin góp ý nho nhỏ: học css thì có w3schools.com
    muốn tay nghê cao hơn thì: Mò code của các trang web linh động như: youtube.com , mp3.zing.vn , hmall.com
    VD(*CSS – Mp3.zing.vn):
    http://static.mp3.zing.vn/skins/gentle/css/screen_2010_06_04.css

  9. kollein says:

    ==> Anh có thể chỉ em cách show sản phẩm bằng css không.show 2 sản phẩm trên cùng 1 dòng giống như của thế giới di động vậy đó.cái này thì liên quan đến csdl là web động.em dùng code asp javacript,em thử nhiều cách mà vẫn chưa được mong anh giup đỡ !!!!!!!!
    –> Thực ra thì bạn chỉ cần dùng {displayinline-block;} trong thẻ div.:D chúc bạn thành công!

  10. Đây là đoạn coding canh giữa theo chiều dọc nhưng không phục thuộc vào bất kỳ 1 trình duyệt nào kể cả IE. Ở trang web http://ictexpress.com cũng sử dụng cái này bạn vào tham khảo nhé

    http://forum.aspvn.net/tm.aspx?m=22467

  11. Đây là đoạn coding canh giữa theo chiều dọc nhưng không phục thuộc vào bất kỳ 1 trình duyệt nào kể cả IE. Ở trang web http://ictexpress.com cũng sử dụng cái này bạn vào tham khảo nhé

    any text
    any height
    any content, for example generated from DB
    everything is vertically centered

  12. chào anh Demon Warlock .mấy tháng trước đây khi mới bắt đầu tìm hiểu về website ,thật tình cờ và thú vị khi đến với izweb. izweb đã cho em những giải đáp về những tò mò (về làm thế nào để có được trang web,domain là gì? hót là gì?…).
    thật sự cám anh về những video clip .chúc anh luôn có 1 sức khỏe tốt để có thể làm ra thêm nhiêu clip khac nữa.

  13. Linh says:

    Anh có thể chỉ em cách show sản phẩm bằng css không.show 2 sản phẩm trên cùng 1 dòng giống như của thế giới di động vậy đó.cái này thì liên quan đến csdl là web động.em dùng code asp javacript,em thử nhiều cách mà vẫn chưa được mong anh giup đỡ !!!!!!!!

  14. A ơi cho em hỏi về cách sử dụng các giá trị âm trong css. Có một số giá trị CSS lại phải dùng giá trị âm. Còn giá trị dương thì em đã hiểu
    Ví dụ : margin-top:-100px; hay paddding-left : -50px v.v…
    Anh có biết khi nào sử dụng giá trị âm và giá này có tác dụng gì trong việc thiết kế không anh

    • VanTan says:

      Chỉ có margin là có giá trị âm thôi. Và giá trị của nó cũng không khác mấy so với dương đâu, chỉ là ngược lại thôi

  1. BB
  2. BB
  3. BB

arrow

Lưu ý khi post comment:

  • Không "bóc tem" topic
  • Dùng lời lẽ có văn hoá và lịch sự
  • Xem trang FAQs trước khi hỏi
  • Bạn có thể dùng thẻ HTML như:<strong>, <em>, <a>
  • Đặt code trong thẻ [php],[html],[javascript],[css]

Chọn kiểu gõ: Tự động TELEX VNI Tắt