Vị trí tương đối vs tuyệt đối?


155

Sự khác biệt giữa position: relativeposition: absolutetrong CSS là gì? Và khi nào bạn nên sử dụng?


2
Tôi đã cung cấp một số giải thích chi tiết ở đây về cách họ làm việc
Ông Alien

w3schools hướng dẫn về vị trí giải thích điều này độc đáo.
gnsb

1
Một yếu tố tương đối định vị được định vị so với vị trí bình thường của nó. Phần tử được định vị tuyệt đối có liên quan đến thùng chứa cha đầu tiên có định vị tuyệt đối hoặc tương đối. Có một bài viết tuyệt vời ở đây kolosek.com/css-poseition-relative-vs-poseition-absolute giải thích chi tiết các vị trí tương đối và tuyệt đối.
Nesha Zoric

Câu trả lời:


160

Định vị CSS tuyệt đối

position: absolute;

Định vị tuyệt đối là dễ hiểu nhất. Bạn bắt đầu với thuộc tính CSS position:

position: absolute;

Điều này cho trình duyệt biết rằng bất cứ điều gì sẽ được định vị nên được loại bỏ khỏi luồng thông thường của tài liệu và sẽ được đặt ở một vị trí chính xác trên trang. Nó sẽ không ảnh hưởng đến cách các yếu tố trước nó hoặc sau nó trong HTML được định vị trên trang Web tuy nhiên nó sẽ chịu sự định vị của cha mẹ trừ khi bạn ghi đè lên nó.

Nếu bạn muốn định vị một phần tử 10 pixel từ đầu cửa sổ tài liệu, bạn sẽ sử dụng phần topbù cho positionnó ở đó với absoluteđịnh vị:

position: absolute;
top: 10px;

Phần tử này sau đó sẽ luôn hiển thị 10pxtừ đầu trang bất kể nội dung nào đi qua, bên dưới hoặc bên trên phần tử (trực quan).

Bốn thuộc tính định vị là:

  1. top
  2. right
  3. bottom
  4. left

Để sử dụng chúng, bạn cần nghĩ về chúng như các thuộc tính bù. Nói cách khác, một yếu tố định vị right: 2pxkhông được di chuyển đúng 2px. Phía bên phải của nó được bù từ phía bên phải của cửa sổ (hoặc vị trí của nó ghi đè lên cha mẹ) bằng 2px. Điều tương tự cũng đúng với ba người kia.

Định vị tương đối

position: relative;

Định vị tương đối sử dụng bốn thuộc tính absoluteđịnh vị giống như định vị. Nhưng thay vì dựa vào vị trí của phần tử trên cổng xem trình duyệt, nó bắt đầu từ vị trí của phần tử nếu nó vẫn ở trong luồng bình thường .

Ví dụ: nếu bạn có ba đoạn trên trang Web của mình và đoạn thứ ba có position: relativekiểu được đặt trên đó, vị trí của nó sẽ được bù dựa trên vị trí hiện tại của nó - không phải từ các mặt ban đầu của cổng xem.

Đoạn 1.

Đoạn văn bản 2.

Đoạn 3.

Trong ví dụ trên, đoạn thứ ba sẽ được định vị 3emtừ phía bên trái của phần tử container, nhưng vẫn sẽ nằm dưới hai đoạn đầu tiên. Nó sẽ vẫn ở trong dòng chảy bình thường của tài liệu và chỉ được bù một chút. Nếu bạn thay đổi nó thành position: absolute;, bất cứ điều gì theo sau nó sẽ hiển thị trên đầu trang, bởi vì nó sẽ không còn nằm trong luồng thông thường của tài liệu.

Ghi chú:

  • mặc định widthcủa một yếu tố được định vị tuyệt đối là chiều rộng của nội dung bên trong nó, không giống như một yếu tố được định vị tương đối trong đó mặc định width100%không gian mà nó có thể lấp đầy.

  • Bạn có thể có các yếu tố trùng lặp với các yếu tố được định vị tuyệt đối, trong khi bạn không thể thực hiện việc này với các yếu tố được định vị tương đối (nghĩa là không có sử dụng lề / định vị âm)


rất nhiều từ: tài nguyên này


159
Các tuyên bố về định vị tuyệt đối là sai lệch. Các yếu tố có định vị tuyệt đối được đặt tương đối so với cha mẹ đầu tiên với định vị tương đối hoặc tuyệt đối. Điều này có thể hoặc không thể là phần tử bên ngoài nhất (<html>). Tất cả phụ thuộc vào vật phẩm nào chứa vật phẩm định vị tuyệt đối. Một sự khác biệt lớn nữa là các yếu tố định vị tuyệt đối được loại bỏ khỏi luồng tài liệu thông thường và các mục được định vị tương đối thì không. Vì vậy, nếu bạn có ba <div> s chồng lên nhau và bạn đặt vị trí giữa ở vị trí tuyệt đối, <div> s trên cùng và dưới cùng sẽ sụp đổ.
d512

10
@ user1334007 bạn rất chính xác, cứ thoải mái chỉnh sửa bài viết của tôi vì hiện tại tôi quá nôn nóng để tự mình làm điều đó.
Michael Zaporozhets

@ user1334007 vâng vì vậy tôi không thể chấp nhận đánh giá hoặc bất cứ điều gì nhưng tôi sẽ tự thực hiện một số chỉnh sửa tối nay vì một số điểm bạn đã cố gắng nêu ra. Tôi giải thích mọi thứ theo một cách rất tình cờ bởi vì nó giữ cho mọi thứ không quá 'sách giáo khoa' tuy nhiên nội dung tôi đồng ý phải chính xác nhất có thể.
Michael Zaporozhets

2
Câu trả lời này không thể hiện rõ vị trí đó: tuyệt đối; là vị trí tương đối so với tổ tiên vị trí tốt gần
Sava Jcript

@AndreyMarushkevych vui lòng đề xuất một chỉnh sửa cho câu trả lời.
Michael Zaporozhets

52

Cả hai vị trí tuyệt đối của mối quan hệ và các khu vực khác nhau của người dùng đều thực sự tương đối, chỉ với các khung khác nhau. Định vị tuyệt đối của hoàng liên quan đến vị trí của một yếu tố kèm theo khác. Định vị tương đối của hoàng tử Vị trí liên quan đến vị trí mà phần tử sẽ có mà không có định vị.

Nó phụ thuộc vào nhu cầu và mục tiêu của bạn mà bạn sử dụng. Vị trí tương đối của hoàng tử phù hợp khi bạn muốn thay thế một phần tử từ vị trí mà nó có trong dòng các phần tử, ví dụ để làm cho một số ký tự xuất hiện ở vị trí siêu ký tự. Định vị tuyệt đối của hoàng tử phù hợp để đặt một phần tử trong một số hệ tọa độ được đặt bởi một phần tử khác, ví dụ như để overprint của một hình ảnh với một số văn bản.

Một cách đặc biệt, hãy sử dụng định vị của người thân có mối quan hệ trực tuyến, không có sự dịch chuyển (chỉ cài đặt position: relative) để biến phần tử thành một khung tham chiếu, để bạn có thể sử dụng định vị tuyệt đối của LINE cho các phần tử bên trong nó (trong đánh dấu).


Relative positioning is relative to the position that the element itself would have without positioning?? Phần tử không có định vị sẽ là "tĩnh" theo mặc định nhưng không tương đối
kittu

21

Một điều cần lưu ý là nếu bạn muốn một phần tử tuyệt đối được giới hạn trong một phần tử cha thì bạn cần đặt vị trí của phần tử cha thành tương đối. Điều đó sẽ giữ cho phần tử con có trong phần tử cha và nó sẽ không "tương đối" với toàn bộ cửa sổ.

Tôi đã viết một bài đăng trên blog đưa ra một ví dụ đơn giản tạo ra ảnh hưởng sau:

nhập mô tả hình ảnh ở đây

Nó có một div màu xanh lá cây được định vị tuyệt đối ở dưới cùng của div màu vàng cha.

1 http://blog.troygrosfield.com/2013/02/11/usiness-with-css-poseitions-creating-a-simple-proTHER-bar/


4
Cha mẹ cần phải 'không tĩnh' - vì vậy cha mẹ có thể là tương đối, tuyệt đối, v.v ... lợi thế của việc sử dụng cha mẹ, là nó không xóa phần tử khỏi tài liệu.
Fernando

19

Vị trí tương đối:

Nếu bạn chỉ định vị trí: tương đối, thì bạn có thể sử dụng trên cùng hoặc dưới cùng, và trái hoặc phải để di chuyển phần tử tương đối đến nơi thường xảy ra trong tài liệu.

Vị trí tuyệt đối:

Khi bạn chỉ định vị trí: tuyệt đối, phần tử sẽ bị xóa khỏi tài liệu và được đặt chính xác nơi bạn bảo nó đi.

Dưới đây là một hướng dẫn tốt http://www.barelyfitz.com/screencast/html-training/css/poseitioning/ với cách sử dụng mẫu của cả hai vị trí tương ứng với định vị tuyệt đối và tương đối.


12

Tương đối: Liên quan đến vị trí hiện tại của nó, nhưng có thể được di chuyển. Hoặc Một yếu tố định vị ĐÁNG TIN CẬY được định vị so với ITSELF.

Tuyệt đối: Một phần tử được định vị của ABSOLUTE được định vị tương ứng với PHỤ HUYNH VỊ TRÍ TUYỆT VỜI NHẤT CỦA CNTT. nếu một cái có mặt, thì nó hoạt động như cố định ..... liên quan đến cửa sổ.

<div style="position:relative"> <!--2nd parent div-->
    <div>   <!--1st parent div-->
        <div style="position:absolute;left:10px;....."> <!--Middle div-->
          Md. Arif
       </div>
    </div>
</div>

Ở đây, divvị trí cha mẹ thứ 2 là tương đối nên giữa divsẽ thay đổi vị trí của nó đối với cha mẹ thứ 2 div. Nếu divvị trí cha mẹ thứ 1 sẽ tương đối thì Trung divsẽ thay đổi vị trí của nó đối với cha mẹ thứ nhất div. Chi tiết


2

Đặt một câu trả lời, như danh tiếng của tôi không đủ để bình luận. Nhưng đừng xem đây là một câu trả lời, chỉ là một thông tin bổ sung, như bản thân tôi, có một số vấn đề với cả chân trang và định vị.

Khi thiết lập trang, để chân trang của tôi luôn ở dưới cùng, với vị trí tuyệt đối và thùng chứa / trình bao chính với vị trí tương đối.

Sau đó, tôi đã tìm thấy một số vấn đề với nội dung văn bản của mình và một menu bên trong cùng một nội dung (phần trắng của trang giữa đầu trang và chân trang), khi đặt chúng thành tuyệt đối, chân trang không còn ở lại.

Postitioning là, như bạn nói một chủ đề phức tạp.

Giải pháp của tôi, đối với nội dung tôi muốn ở vị trí 'tuyệt đối' trong trang web của mình và không bị đẩy sang một bên, khi ví dụ mở menu thả xuống, là thực sự cung cấp cho nó bài đăng tương đối, và đặt nó xuống dưới 35em thực đơn. (35em là chiều cao của menu thả xuống của tôi, khi được mở rộng hoàn toàn)

Sau đó, Top: -35em, cho nội dung mà trước đó đã được đẩy sang một bên. Và sau đó thêm lề dưới: -35em. Bằng cách này, nội dung là "bên dưới" menu thả xuống của tôi, nhưng trực quan nó nằm cạnh menu thả xuống của tôi! Và khoảng trắng bên dưới xuống chân trang, chỉ có lề 10em, như trước khi bắt đầu chơi với cái này. Vì vậy, giải pháp của tôi cho vấn đề này là như thế này:

 html, body {
    margin:0;
    padding:0;
    height:100%;

}
h1 {
    margin:0;
}
    #webpage {
    position:relative;
    min-height:100%;
    margin:0;
    overflow:auto;
}
     #header {
    height:5em;
    width:100%;
    padding:0;
    margin:0;
}
     #text {
    position:relative;
   margin-bottom:-32em;
    padding-top:2em;
    padding-right:2em;
    padding-bottom:10em;
    background-repeat:no-repeat;
    width:70%;
    padding-left:auto;
    margin-left:auto;
    margin-right:auto;
    right:10em;
    float:right;
    top:-32em;
      }
#dropdown {

position:absolute;
    left:0;
    width:20%;
    clear:both;
    display:block;
    position:relative;
    top:1em;
    height:35em;

}
    #footer {
    position:absolute;
    width:100%;
    right:0;
    bottom:0;
    height:5em;
    margin:0;
     margin-top:5em;
}

Tôi thấy câu hỏi của bạn được trả lời tốt, nhưng sau khi gặp nhiều rắc rối, tôi thấy đây là một giải pháp rất tốt và là cách để hiểu rõ hơn về cách định vị hoạt động .. Khi tôi đặt nội dung văn bản của mình, bên dưới trình đơn thả xuống của tôi, nó không ' t đẩy văn bản của tôi sang một bên. Nếu tôi thay đổi văn bản thành vị trí tuyệt đối, chân trang sẽ không giữ nguyên vị trí. Vì tôi có thể tin rằng đây là một vấn đề đối với nhiều người hơn tôi, tôi thêm điều này vào đây. Điều thực sự xảy ra, là tôi đặt văn bản, 35em, bên dưới phần thả xuống của tôi.

Sau đó, tôi trực quan đặt nó ngay bên cạnh nhau, với vị trí tương đối và trên cùng: -35em;, và buổi tối ra khỏi không gian rộng lớn bên dưới, với lề: -35em;

giá trị tiêu cực được đánh giá thấp đôi khi, chức năng rất tốt, khi một người hiểu các vị trí này tốt hơn!

Đương nhiên, vị trí cố định, cũng có vẻ logic cho chân trang của tôi, nhưng tôi thực sự muốn chân trang đi bên dưới khung nhìn, nếu văn bản hoặc nội dung, dài hơn khung nhìn. Và để ở dưới cùng, nếu có ít nội dung trên trang.

Thiết lập này đã sửa lỗi rất độc đáo và nhớ sử dụng 'em', không phải 'px' để bố trí trang linh hoạt / linh hoạt hơn! :)

(có thể có các giải pháp tốt hơn, nhưng điều này hiệu quả với tôi trên nhiều nền tảng, cũng như các thiết bị).


2

Tương đối so với tuyệt đối:

  • Sự khác biệt: liên quan đến chính nó, liên quan đến tổ tiên định vị gần nhất.
  • Sự khác biệt: Các yếu tố khác xung quanh nó tôn vinh sự tồn tại cũ của nó, Các yếu tố khác xung quanh nó KHÔNG tôn vinh sự tồn tại cũ của nó.
  • Tương đồng: Các yếu tố khác xung quanh nó KHÔNG tôn vinh sự tồn tại mới của nó, Các yếu tố khác xung quanh nó KHÔNG tôn vinh sự tồn tại mới của nó.

1

Hãy thảo luận về một kịch bản để giải thích sự khác biệt giữa tuyệt đối so với tương đối.

Bên trong phần tử cơ thể cho biết bạn có một phần tử tiêu đề có chiều cao là 95% của chế độ xem tức là 95vh. Trong thùng chứa này, bạn đặt một hình ảnh và giảm độ mờ xuống 0,5. Và bây giờ bạn muốn đặt một hình ảnh logo gần góc trên cùng bên trái. Tôi hy vọng bạn hiểu kịch bản. Vì vậy, bạn sẽ có một hình ảnh nhẹ hơn trong phần tiêu đề với logo ở trên cùng của nó ở vị trí được chỉ định.

Nhưng trước khi bắt đầu, tôi đã đặt lề và đệm thành 0 như thế này

*{
   margin:0px;
   padding:0px;
   box-sizing: border-box; 
}

Điều này đảm bảo không có lề mặc định và phần đệm được áp dụng cho các phần tử.

Vì vậy, bạn có thể đạt được yêu cầu của bạn theo hai cách.

Cách thứ nhất

  • bạn đưa ra một lớp cho logo nói hình ảnh.
  • trong css bạn viết

    .logo{ float:left; margin-top:40px; margin-left:40px; }

  • cái này đặt logo đến 40px từ trên cùng và bên trái của cha mẹ kèm theo là tiêu đề. Hình ảnh sẽ xuất hiện như thể nó được đặt như mong muốn.

Nhưng bạn của tôi, đây là một thiết kế tồi khi đặt một hình ảnh mà bạn không cần thiết phải tiêu tốn quá nhiều không gian xung quanh bằng cách cho nó một chút lề khi không cần thiết. Tất cả bạn cần là đặt hình ảnh đến vị trí đó. Bạn quản lý nó bằng cách đệm nó với lề xung quanh. Lề đã chiếm không gian và đẩy nội dung của nó sâu hơn tạo ấn tượng rằng nó được định vị chính xác nơi bạn muốn. Hy vọng bạn hiểu vấn đề bằng cách làm việc xung quanh như thế này. Bạn đang chiếm nhiều không gian hơn mức cần thiết để chỉ đặt một hình ảnh tại vị trí mong muốn.

Bây giờ hãy thử một cách tiếp cận khác.

Cách thứ hai

  • hình ảnh với lớp logo nằm trong thành phần tiêu đề với lớp tiêu đề say. Vì vậy, lớp cha là tiêu đề và lớp con là logo như trước đây.
  • bạn đặt thuộc tính vị trí của lớp tiêu đề thành tương đối như thế này

    .header{ position: relative; }

  • sau đó bạn đã thêm các thuộc tính sau vào lớp logo

    .logo{ position:absolute; top:40px; left:40px }

Có bạn đi. Bạn đặt hình ảnh ở cùng một nơi. Sẽ không có bất kỳ sự khác biệt rõ ràng nào trong việc định vị từ mắt thường giữa cách tiếp cận thứ nhất và cách tiếp cận thứ hai. Nhưng nếu bạn kiểm tra thành phần hình ảnh, bạn sẽ thấy rằng nó không chiếm thêm bất kỳ khoảng trống nào. Nó chiếm chính xác cùng một diện tích bằng chiều rộng và chiều cao của chính nó.

Vậy làm thế nào có thể như vậy? Tôi đã nói với lớp logo hình ảnh rằng bạn sẽ được đặt tương đối với lớp tiêu đề vì bạn là con của lớp này và tôi đặc biệt đề cập đến vị trí của nó là tương đối . Vì vậy, bất kỳ đứa trẻ nào của nó sẽ được đặt tương đối với góc trên cùng bên trái của nó. Và rằng vị trí của bạn cần phải được cố định bên trong phần tử cha này. vì vậy bạn được cho tuyệt đối. Và rằng bạn cần di chuyển một chút từ trên xuống và sang trái đến vị trí tôi muốn bạn trở thành. Do đó, bạn được cung cấp thuộc tính trên cùng và bên trái với giá trị 40px. Bằng cách này, bạn sẽ được đặt tương đối chỉ với cha mẹ của bạn. Vì vậy, nếu ngày mai tôi di chuyển cha mẹ của bạn lên hoặc xuống hoặc bất cứ nơi nào, bạn sẽ luôn luôn là 40px ở trên cùng và bên trái của góc trên cùng bên trái của cha mẹ bạn. Vì vậy, vị trí của bạn được cố định bên trong cha mẹ của bạn cho dù vị trí của bố mẹ bạn có cố định hay không trong tương lai (vì nó không tuyệt đối như bạn).

Vì vậy, sử dụng tương đối và tuyệt đối cho cha mẹ và con tương ứng. Thứ hai sử dụng nó khi bạn muốn chỉ đặt phần tử con tại một số vị trí bên trong phần tử cha. Không sử dụng chất độn như lề để đẩy nó một cách ép buộc. Cung cấp cho cha mẹ giá trị tương đối và con mà bạn muốn di chuyển, giá trị tuyệt đối. Chỉ định thuộc tính trên cùng, dưới cùng bên trái hoặc bên phải cho lớp con để đặt nó bên trong cha mẹ bất cứ nơi nào bạn muốn.

Cảm ơn.


0

Marco Pellicciotta: Vị trí của yếu tố bên trong một yếu tố khác có thể là tương đối hoặc tuyệt đối, về yếu tố bên trong nó.

Nếu bạn cần định vị phần tử trong chế độ xem cửa sổ trình duyệt, tốt nhất nên sử dụng vị trí: đã sửa

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.