Absolute Position trong thiết kế giao diện
- November 16, 2009
- 68 comments
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"> </div>
<div id="middle"> </div>
<div id="right"> </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.
Ở ví dụ trên thẻ div#wrapper có position: 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.
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
Anh DW oi! Em dang viet mot trang web bang thuoc tinh absolute position, lam sao de cai footer no nam cuoi trang ha anh?
àh e biết làm r a ơi. Thông qua nhiều video hướng dẫn của a DW e cũng tích lũy đc nhiều kiến thức mới .TKS a nhé
a DW ơi a có thể làm 1 video hướng dẫn cách sử dụng thẻ div kết hợp với thuộc tính padding và margin được không anh.Xét layout cho web khó wa
Các anh cho em hỏi:
ví dụ như ta xem 1 cái video Trong Video/css/html/Dropdown menu II !!!
vậy cho em hỏi muốn xem Dropdown menu I ở đâu anh!!
mong các anh chỉ dùm!!!
anh ơi em mới chuyển từ thiết kế giao diện bằng Table sang làm bằng div và CSS.nhưng mà thấy canh lề hơi khó.anh có thể làm 1 bài tut hướng dẫ về phần này được không ạ
DW bạn có thể hướng dẫn cao hơn một chút về việc sử dụng php với store procedure của Mysql không?
Sau một thời gian xem hướng dẫn của DW tôi rút ra được rất nhiều thứ để phát triển lập trình web, Thank you !
Rất hay đó bạn ah, tôi cũng cảm thấy thích vì đã tìm ra được trang này
Tôi rất thích xem các bài DW viết về CSS và PHP
Thanks bạn hi.Bài viết hay lắm
Hay quá, vừa hay vừa dễ hiểu , người hướng dẫn lại còn rất vui tính nữa
mới học thiết kế web, giờ vẫn chưa hình dung ra, thầy giáo thì chỉ mấy cái lắc nhắc trong designweb, giờ không biết phải làm như thế nào: dàn trang, sắp xếp bố cục, link trang này tranh kia, hình ảnh
( ôi mún stress với mấy cái này
Cho mình hỏi , nếu mình muốn chèn lời bình đè lên một bức ảnh thì chỉnh absolute position thế nào ??
Mình muốn như vầy : http://i.imgur.com/fEZ0R.png (giả dụ viền đen là ảnh)
Mình đã thử thành công với điều kiện ảnh ở vị trí cố định , còn nếu đưa vào bài đăng , chỉ cần xuống xòng cái là lệch ngay
Hên quá , vô tình mình vào được một site tuyệt thế này
, cũng do izwebz.com SEO tốt 
Bài viết bổ ích vô cùng mà lại mạch lạc , đọc là muốn đọc hết , cám ơn tác giả nhiều lắm !!
Good job, các bài viết trong này rất hay. Bạn hướng dẫn rất tỉ mỉ. Làm việc chuyên nghiệp. Lần đầu tiên ở Việt Nam mình mới thấy một website dành cho dân WebDesigner tốt như thế này. Cảm ơn BQT website rất nhiều. Chúc giáng sinh vui vẻ.
A ơi, e hỏi này tí, e có làm 1 trang web theo hướng dẫn của a, đúng là dùng position dễ và đẹp trên các trình duyệt, nhưng khi làm footer e cũng phải dùng position mới canh được nó xuống chân trang web, mà làm vậy thì khi nội dung thay đổi (thêm nội dung) thì cái footer cũng bị đè lên phần nội dung luôn do mình set vị trí nó cố định. Có cách nào làm web động vẫn xài được nó ko a?
Nếu em xem lại một trong những video của anh về cách dựng giao diện với HTML và CSS thì em sẽ hiểu cách ngay. Cách đó là tốt nhất, chứ giải thích cho em cũng dài dòng lắm. Em chịu khó xem lại các video anh đã post nhé! đặc biệt là những video chuyển PSD sang HTML.
Nếu toàn bộ em dùng position thì ko ổn, vì rất vất cả canh từng pixel và dữ liệu động thì rất khó, position chỉ hữu dụng trong các không gian nhỏ như là các nút, biểu tượng,v.v..
anh ơi trên hình ví dụ trên thẻ div đầu tiên(ô màu xanh) hinh như anh viết sai thi phải. em nghĩ phải là: Position: absolute, Top: 0px, Left:0px chứ nhỉ?
@pham linh
, cái quan trọng là bạn đã hiểu được lý thuyết, thực hành lại và biết được cái sai là tốt rồi .
Chắc viết nhiều nên lẫn
Bài viết hay thật . cảm ơn huynh nhìu nhé
Mình có những cái button có background là file png, đúng là khi dùng code hack file png trong IE6 thi chay rất tốt (ko còn bị lỗi hình nền). Nhưng code này có 1 vấn đề sau: làm cho hiệu ứng hover backgorund của button trên cả IE6,7 bị mất. Chỉ có IE8 là chạy được thôi.
Bạn có biết cách fix được vấn đề này ko DW!? Thanks nhé!
Nếu bạn viết xi-đu class trên các thẻ khác thẻ a thì IE6/IE7 có vấn đề, chứ position thì liên quan gì đâu.
Trang nầy hình như toàn con trai nói chuyện với nhau cả hihi!
(Cảm ơn anh nhiều )mũ mười tỉ linh 1.
anh giúp em phần này với em đang tìm hiểu về css và có làm thử 1 bài nhưng chẳng hiểu sao cứ rối quá. anh xem lại code css giùm em nhé và cái phần post-center của em đang bị lỗi mà ko biết chỉnh sửa thế nào mong anh giúp đỡ. em cảm ơn rất nhiều
đây là link download bài của em: http://www.mediafire.com/?e3b5e88ac6iguv0
Em set giá trị z-index của li a cao hơn là được. Nếu em chưa dùng z-index thì anh có video hướng dẫn rồi đó.
Anh ơi! hai cái menu cuối (clients với contact us) trong bài ví dụ bị cái tấm hình che mất nên mất tác dụng làm sao khắc phục được anh?
Đú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
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?
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
@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ử đó “
Mình làm được rùi, thanks.
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
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
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.