post image

Absolute Position trong thiết kế giao diện

Có một thực tế rằng Absolute Position tuy rất hay và mạnh nhưng lại chưa được sử dụng đúng với “thực lực” của nó. Đa phần người ta thường sử dụng Float và dùng Padding hoặc Margin để căn chỉnh các thành phần trong giao diện với nhau. Nhưng như bạn cũng đã biết, giao diện với Float rất mong manh. Chỉ cần sai chút xíu là cả giao diện có thể bị vỡ.

Đó là chưa kể đến những bất cập của Float như phải clear float và đôi khi nó thực sự rất khó quản lý. Nhưng không hiểu vì lý do tại sao Float được sử dụng rất rộng rãi và vượt ra ngoài dự định ban đầu của những người phát triển CSS. Đầu tiên Float chỉ được thiết kế để đưa hình ảnh vào những vị trí thích hợp. Nhưng dần dà nó được sử dụng khá phổ biến trong thiết kế giao diện.

Nói vậy không phải là tôi không thích Float hoặc sử dụng Float là không tốt, mà sự thực thì tôi cũng sử dụng Float khá nhiều trong thiết kế giao diện. Nhưng nếu dùng nó kết hợp với Absolute Position trong CSS thì giúp giao diện của bạn có thể tương thích với nhiều trình duyệt mà không cần phải áp dụng hack cho IE.

Trong bài này chúng ta sẽ tìm hiểu sơ qua về Absolute Position trong Relative Position. Tôi đã có một video về Contextual Positioning nói rất rõ về mối liên hệ giữa Relative Position và Absolute Position. Nhưng vì đây là khái niệm hết sức quan trọng do vậy trong bài này tôi cũng nói lại một chút.

Ở ví dụ dưới đây tôi sử dùng Absolute Position để định vị 3 thẻ div nằm trong thẻ div lớn là #wrapper.

<div id="wrapper">
        <div id="left">&nbsp;</div>

        <div id="middle">&nbsp;</div>

        <div id="right">&nbsp;</div>
    </div>

Với Absolute Position bạn có thể sử dụng các giá trị: px, em và % và với các vị trí: top, right, bottom và left. Tuy nhiên trong thực tế bạn chỉ cần 2 giá trị là top và left (hoặc right) thì cũng đủ để định vị một thành phần rồi.

Mẹo nhỏ: Nếu trong quá trình định vị tọa độ với Absolute bạn phải làm đi làm lại nhiều lần. Thì nay bạn có thể sử dụng addon Firebug để định vị chính xác đến từng Pixel. Tôi có làm một video hướng dẫn cách sử dụng Firebug.

Absolute Position

Ở ví dụ trên thẻ div#wrapperposition: relative, nó sẽ đóng vai trò làm thành phần bao quanh cho 3 thẻ div có position: absolute nằm bên trong nó. Nếu ta bỏ giá trị position: relative ở thẻ div#wrapper đi thì 3 thẻ div ở trong sẽ như “hươu lạc mẹ” và chạy toán loạn hết. Uhm! thực ra cũng không toán loạn mà nó sẽ nhận body làm mẹ nuôi và định vị theo “bà mẹ” mới này.

Absolute Position

Chính vì thế điều quan trọng nhất trong khi sử dụng Absolute Position là xác định thành phần bao quanh và đặt position của nó thành relative

Nghe cũng hay mà bạn có ví dụ trong thực tế không?

Tôi biết là bạn sẽ hỏi do vậy tôi đã chuẩn bị trước một giao diện được sử dụng Absolute Position cho bạn tham khảo. Bạn sẽ dễ dàng nhận thấy ở giao diện này có một tấm hình lớn choán hết phần Header và nó nằm “chông chênh” ở giữa. Đây là ví dụ hoàn hảo về sử dụng Absolute Position để định vị các thành phần.

Ngoài ra các thành phần còn lại như thanh di chuyển ở trên và dưới, logo và phần Featured đều được sử dụng Absolute Position. Tôi đã thử trong IE 6, 7 và 8 và hầu như không phải hack bất cứ phần nào ngoại trừ phần PNG hack cho IE 6. Nếu giao diện này làm bằng Float thì sẽ ít nhất là cũng phải hack cái Double Margin của IE.

Bạn có thể download ví dụ này về để xem phần code HTML và CSS

«

»

41 Comments

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

    Dùng Absolute Position trong thiết kế giao diện rất hay, nhưng khó xác định các tọa độ cho đúng vị trí, phải thử nhiều lần mới Siết. Nếu em dùng thì khi Absolute poítion thành phần trong div này sẽ lấy vị trí theo div#sidebar hay div#wrapper ạ?

  2. Nếu theo ví dụ trên sẽ là theo div#wrapper.

    Việc xác định tọa độ không có gì khó nếu sử dụng addon Firebug. Ban đầu chỉ cần cho tọa độ bất kỳ sau đó cho hiển thị lên firebug và chỉnh sửa. Em có thể xem thêm video về firebug để biết thêm chi tiết.

  3. xuantruong89 says:

    link ví dụ lỗi rồi anh ơi, up lại đi

  4. Trung says:

    anh ơi, nhiều tài liệu nói đến việc sử dụng kéo thả trong dreamweaver . em thấy code toàn table là table. cách đấy công nhận là rất nhanh so với sử dụng css. em muốn hỏi là sau này để đi làm thì người ta hay dùng cách nào hả anh :-s . giờ em băn khoăn quá.

  5. Nếu nói về thiết kế giao diện thì em nên tránh hoàn toàn phương pháp sử dụng Table và cũng nên tránh luôn cả những chương trình WYSIWYG Editor như Dreamweaver.

    Anh biết anh nói điều này có nhiều người sẽ không đồng tình về việc sử dụng trình Dreamweaver. Nhưng cá nhân anh không thích những chương trình to, cồng kềnh và nặng máy.

    Hơn nữa những chương trình này khi cho ra code HTML cực kỳ khó hiểu và nhiều “rác rưởi”. Em chỉ nên sử dụng Table cho dạng Data Tabular.

  6. Quốc Anh says:

    Cho em hỏi trong CSS ngoài thành phần con ra còn có các thành phần cháu. Cái khó ở đây là khi có các thành phần nhỏ hơn nữa.
    Ví dụ như trong #Wrapper>#sidebar>#(…), #(…)
    Cái div (…)là đồng cấp với nahu giờ em ko rõ đặt cái position của cái sidebar như nào nữa nó cứ loạn lên.

  7. Trung Hiếu says:

    Anh ơi, trong ví dụ mà anh upload ở cuối bài này, trong đoạn code css có phần:

    #featured img.featuredImg {
    position: absolute;
    top: -192px; right: -4px;
    }

    Em không hiểu tại sao la` -192 và -4px. Anh có thể giải thích giùm em không ạ.

  8. Cái đó là tọa độ X và Y của tấm hình position absolute thôi em. Nếu thích em có thể chỉnh sửa lại giá trị đó rồi xem trên trình duyệt sẽ rõ.

  9. (^-^) says:

    Em đang làm ví dụ về absolute cho bức ảnh, kết quả tuy tốt nhưng khi em kéo giao diện trình duyệt nhỏ lại thì hình ảnh không bị cắt đi như các bức hình khác mà nó đẩy các phần khác trong trang web. Ngồi hoài không biết làm thế nào để cho nó bị cắt khi kéo nhỏ giao diện trình duyệt. Anh có cách nào không??? chỉ cho em với. Thanks

  10. Em có ví dụ cụ thể không? hình chụp hoặc link đến trang đó không?

  11. (^-^) says:

    Anh cho em email đi. Em sẽ gữi cho anh, vì ví dụ này em đang làm để chuẩn bị nộp bài tập cho thầy. Em phải tự mày mò lấy nên không hiểu cho lắm. Nhờ có website của anh nên em cũng đỡ nhiều.

  12. (^-^) says:

    Anh cho em email đi. Em sẽ gữi cho anh như vậy anh sẽ biết được code em viết, vì ví dụ này em đang làm để chuẩn bị nộp bài tập cho thầy. Em phải tự mày mò lấy nên không hiểu cho lắm. Nhờ có website của anh nên em cũng đỡ nhiều.

  13. (^-^) says:

    oh.sao gữi nhiều comment thế không biết. Xin lỗi anh nhé.

  14. Demon Warlock says:

    Em vào phần contact có email của Anh đó

  15. (^-^) says:

    Em da gui email cho anh rui, mong anh giup do. thanks

  16. Nhìn qua code thì biết em khai báo không đúng phần Position Relative. Cho nên khi kéo trình duyệt tấm hình nó định vị theo thành phần body nên gây ra hiệu ứng như thế.

    Code HTML của em nhìn giống “ma trận” ghê :D

  17. (^-^) says:

    hi. Em mới tìm hiểu thôi nên cũng hơi giống ma trận thật,nhưng em đã khai báo position relative ở thẻ div chứa bức ảnh rùi sau đó em mới sử dụng position absolute cho thẻ div chứa image mà.
    Anh xem kỹ lại giúp em với em hết cách rùi.

  18. Quốc Anh says:

    Cho em hỏi trong CSS ngoài thành phần con ra còn có các thành phần cháu. Cái khó ở đây là khi có các thành phần nhỏ hơn nữa.
    Ví dụ như trong #Wrapper>#sidebar>#(…), #(…)
    Cái div (…)là đồng cấp với nahu giờ em ko rõ đặt cái position của cái sidebar như nào nữa nó cứ loạn lên.

  19. kimsangyoo says:

    Bác DW cho em hỏi xíu nha: Absolutionz-index hình như giống nhau về chức năng phải không vậy Bác. Em đang tò hai thành phần đó khác nhau ở điểm nào?

  20. Giống làm sao được chú! Absolute là để định vị thành phần còn Z-index để xác định thành phần nào nằm trên, thành phần nào nằm dưới như lớp vậy.

  21. @kimsangyoo : DW nói tới lớp mới nhớ, giải thích thế này nhé, tính từ cầu thang về phía tay phải của 1 dãy lớp học. Lớp đầu tiên gặp là lớp trên cùng, lớp thứ 2… cho đến lớp cuối như vậy đó là z-index, giá trị z-index càng lớn thì lớp đó nằm trên. Trong lớp có 45 chỗ ngồi, mỗi học sinh có một chỗ ngồi riêng, chẳng ai chồng chất lên ai, từ cửa lớp tính vào thì học sinh thứ nhất sẽ đến học sinh thứ 2, chẳng phải hai học sinh ngồi cùng 1 chỗ, ngồi lên nhau, đó được coi như là vị trí được định sẵn như là Position. Cái lớp có Position : Relative, mỗi học sinh mang Position : Absolute. hihi.

    @DW : Tiện thể muốn hỏi DW em có đoạn code thế này :
    <div id="header">
    <div id="in_header">
    <img src="..." />
    </div><!--End #in_header -->
    </div><!--end #header -->

    - Position cho #header : Relative
    - Position cho #in_header : Absolute. đó là điều hiển nhiên, nhưng em muốn cái #in_header của em có Position là Relative để em có thể định dạng cho thẻ IMG trong nó là Absolute thì làm sao ?, trong khi bản thân nó là Absolute và được điều chỉnh theo #header ^^

  22. Cái đó thì anh nghĩ cũng như bình thường thôi. Bởi vì nếu em đã đặt thẻ div#header có position là Relative thì 2 cái con đều có thể là Absolute. Cả cái #in_header và img đều là absolute. Nhưng cái #in_header thì định vị tương đối với #header còn img thì tương đối với #in_header. Trong trường hợp này sử dụng giá trị âm là được hết.

    Mà ít khi có trường hợp này xảy ra hỉ? trên lý thuyết thôi chứ hỉ?

    • Văn Đức says:

      Anh ơi ! Em muốn học hướng đối tượng bằng php nhưng em không biết phải xuất phát từ đâu.Em cũng có chút kiến thức về php rồi.Mong anh góp ý chỉ đường giùm em cái.Em sẻch trên mạng không có tài liệu tiếng việt.Tiếng anh thì em học ko tốt lắm

  23. Emily Pham says:

    Truoc gio minh toan tan dung FLOAT. Doc xong bai nay thi co the ap dung Position thoai mai hon. Cam on Tac Gia nhieu lam nghen.

  24. Sad Angel says:

    Thank a nhìu. Chúc a sẽ có nhìu video tutorial hay hơn nữa.
    .:: HAVE A NICE DAY! ::.

  25. e thích web của anh rồi đấy ủng hộ anh :”>

  26. Sad Angel says:

    A ui,làm thế nào cóa đc hình đại diện vậy a?

  27. :) em đã có rồi đó mà ^^

  28. Sad Angel says:

    Ơ…đc òi kìa,Hjhj bjt sai ở đâu òi :D .::: CHúc a 1 vui vẻ:::.

  29. Mr Truyen says:

    Anh thật tuyệt. em đang lơ mơ phần này ..dùng float ảnh của em nó cứ nhảy lên tận trời xanh à..thanks anh nhiêu .. yêu anh :D

  30. nguyen_linh1987 says:

    Anh ơi …Nhưng em sử dụng thuộc tính Absolute của position thì khi co kéo lại khung trình duyệt em thấy nó khác so với float…nếu m kết hợp cả với float thì có vẻ ai đó ko xem fullscreen thì sẽ bị khác ở vài chỗ :-ss….m pải có 1 khung bao những cái Absolute và đặt positon của nó là Relative hả anh

  31. TT97IT says:

    Mình nghĩ ở cái trang demo Absolute Position:
    —> http://www.izwebz.com/wp-content/uploads/2009/08/demo/absolute/ <—
    của Demon Warlock không ổn nếu dữ liệu động, ví dụ ở phần ul trong div "featured" thêm mấy thể "li" với nội dung tương tự thì lập tức sẽ bị "tràn dữ liệu ra ngoài"….
    Absolute Position có lẽ không phù hợp với dữ liệu động dài ngắn thay đổi nên nó không được dùng nhiều bằng float.

  32. tuânnh says:

    troi oi, sao bây giờ tôi mới biết có trang tutorial tuyệt voi the nay ?!
    thanks bạn rất nhiều ;)

  33. Tuan Vy says:

    Cho mình hỏi, nếu div một định position:relative; div thứ hai (phụ thuộc vị trí div một) định position:absolute rồi, dậy nếu có thêm dic thứ ba (phụ thuộc vị trí div hai) thì vị trí định sao nữa? lập cái position sao dậy? Thanks

  34. nhtera says:

    @Tuan Vy
    Bạn đọc kĩ câu này sẽ hiểu ngay thôi :
    “Khi một phần tử có position absolute nằm trong một phần tử khác có position (relative,absolute) thì nó lấy gốc tọa độ là góc trên bên trái của phần tử đó “

  35. Ngo Cham says:

    Trời ơi, may quá, Đúng là “buồn ngủ gặp chiếu manh”. Tìm mãi mới thấy 1 website hướng dẫn CSS ngắn gọn và ngôn ngữ dịch chính xác. Mấy cái bài giảng ở các website khác dịch cứ sao ý.. Cám ơn tác giả, cám ơn Google vì nhờ có nó tớ mới tìm ra cái website này. Phải bookmark nó lại mới được

  36. phongt94 says:

    Tôi biết: absolute position (AP) nó không phổ biến bằng float và clear (FC) là vì:
    Dùng khi div1 không có độ cao cố định mà position: relative thì div tiếp theo dùng tiếp postion: relative thì nó bị đè lên nhau. Nó không nhảy xuống dưới như dùng clear.
    Có đúng không DW?

  37. ltbinh says:

    Đúng là position dùng thì hay thật,nhưng dùng để chia layout thì ko thể được
    vì khi chia cột chưa có chiều cao thì những thằng bên dưới sẽ nhảy lên,tóm lại vẫn phải dùng foat.cái này chỉ dùng để định vị những cái có kích thước cố định thôi(chẳng hạn chèn ảnh vào vị trí nào đấy

  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>
  • Wrap code trong dấu `backtick` (dấu trên phím Tab)

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