Buộc “vị trí: tuyệt đối” phải liên quan đến tài liệu chứ không phải vùng chứa mẹ


93

Tôi đang cố gắng chèn một div vào bất kỳ phần nào của phần nội dung và làm cho nó position: absoluteliên quan đến toàn bộ tài liệu chứ không phải phần tử mẹ có a position: relative.


Nếu vị trí của nó là tuyệt đối so với tài liệu, thì nó thuộc về con của <body>thẻ, phải không?
Jim Garrison,

Bạn có thấy giải pháp của tôi dưới đây không?
tw16

Đúng vậy. Tôi đang tạo một mẫu được sử dụng trong nhiều trang và đôi khi nó nằm bên trong một phần tử có vị trí tương đối (mà tôi không thể kiểm soát được. Bây giờ tôi thấy điều đó là không thể. Cảm ơn sự giúp đỡ của bạn. +1 từ tôi và tôi sẽ đánh dấu nó là sửa nếu bạn nói rằng không thể của nó trong câu trả lời của bạn.
Timothy Ruhle

BrainJar có một phần giới thiệu hoàn toàn cổ điển về định vị trong CSS sẽ giải đáp mọi thắc mắc còn vướng mắc ở đây.
Alan H.

Câu trả lời:


36

Bạn sẽ phải đặt divbên ngoài của position:relativephần tử và vào trong body.


1
^^ Cái này. Nếu nó được định vị tuyệt đối thì thực sự không có lý do gì để đặt nó bên trong phần tử được định vị tương đối.
DOOManiac

7
@DOOManiac - bạn có thể muốn nó bên trong phần tử được định vị tương đối bởi vì bạn muốn nó chạy một tập lệnh di chuột qua hoặc không chạy một tập lệnh mouseout do phần tử gốc kích hoạt. Câu trả lời của tôi cho phép một tình huống như vậy.
Michael.Lumley,

1
@DOOManiac lý do để đặt một phần tử tuyệt đối vào một phần tử tương đối là để định vị div tuyệt đối so với phần tử tương đối. Nếu bạn muốn đặt vị trí tương đối với phần thân, theo mặc định, phần thân là tương đối, ngay cả khi nó không được đặt theo cách đó.
Jason Foglia

18
Có thể có hàng trăm lý do bạn cần để vùng chứa trở thành con của một vùng chứa khác nhưng vị trí này phải tuyệt đối với tài liệu. Trả lời như bao gồm nó trực tiếp vào cơ thể là sai. Đáp án đúng là position: fixed. Bị phản đối.
walv

3
@walv: position:fixedposition:absolutekhông có hành vi tương tự. Đã sửa lỗi liên quan đến chế độ xem (không phải tài liệu) và sẽ khiến mục luôn hiển thị ngay cả sau khi cuộn có khả năng gây ra chồng chéo, v.v. Tôi hiểu rằng có thể có lý do hợp lệ cho cấu trúc html, nhưng vì câu hỏi cụ thể là về html và css, câu trả lời của tôi là đúng. Cách duy nhất mà không có JS để làm cho nó liên quan đến tài liệu là di chuyển nó ra khỏi position:relativephần tử.
tw16

95

Bạn đang tìm kiếm position: fixed.

Từ MDN :

Định vị cố định tương tự như định vị tuyệt đối, ngoại trừ khối chứa phần tử là khung nhìn. Điều này thường được sử dụng để tạo một phần tử nổi vẫn ở cùng một vị trí ngay cả sau khi cuộn trang.


28
vấn đề với câu trả lời này là người dùng muốn sử dụng tuyệt đối bởi vì các yếu tố cố định không di chuyển trên cuộn và các yếu tố tuyệt đối làm :)
Một người bạn

3
Bạn là một huyền thoại tuyệt đối.
Benisburgers,

6
Câu hỏi đặt ra là làm thế nào để xác định vị trí so với tài liệu chứ không phải khung nhìn
Paul Humphreys

Đây có khả năng có thể gây ra các vấn đề trong IE11, vì một lỗi với bối cảnh xếp chồng
James Westgate

32

Giải pháp của tôi là sử dụng jQuery để di chuyển div ra bên ngoài mẹ của nó:

<script>
    jQuery(document).ready(function(){
        jQuery('#loadingouter').appendTo("body");
    });
</script>

<div id="loadingouter"></div>

1
Điều này đã giải quyết được vấn đề của tôi vì tôi không thể đặt phần tử của mình trực tiếp bên trong phần thân vì tôi đang sử dụng trang chính. Cảm ơn!
Osprey

9

Nếu bạn không muốn đính kèm phần tử vào body, giải pháp sau sẽ hoạt động.

Tôi đến với câu hỏi này để tìm kiếm một giải pháp có thể hoạt động mà không cần gắn div vào phần thân, bởi vì tôi có một tập lệnh di chuột mà tôi muốn chạy khi con chuột ở trên cả phần tử mới và phần tử tạo ra nó. Miễn là bạn sẵn sàng sử dụng jQuery và được truyền cảm hứng từ câu trả lời của @Liam William:

var leftOffset = <<VALUE>>;
var topOffset = <<VALUE>>;
$(element).css("left", leftOffset - element.offset().left);
$(element).css("top", topOffset - element.offset().top);

Giải pháp này hoạt động bằng cách trừ đi vị trí bên trái và trên cùng hiện tại của phần tử (so với phần thân) để di chuyển phần tử đến 0, 0. Việc đặt phần tử ở bất kỳ đâu bạn muốn so với phần thân sau đó đơn giản như thêm một khoảng lệch trái và trên cùng giá trị.


2
Cũng đáng nói là hàm vị trí jQueryUI .
Michael.Lumley

8

Điều này không thể thực hiện được với CSS và HTML.

Sử dụng Javascript / jQuery, bạn có thể đưa các phần tử jQuery.offset()vào DOM và so sánh với nó jQuery.position()để tính toán vị trí nó sẽ xuất hiện trên trang.


IMHO câu trả lời này là hữu ích nhất - mà không cần di chuyển phần tử trực tiếp dưới phần thân (điều này không phải lúc nào cũng có thể thực hiện được) và không sử dụng vị trí cố định sẽ làm cho phần tử luôn xuất hiện ngay cả khi cuộn xuống, chúng ta chỉ có thể sử dụng JS. jQuery.offset({ left: 0 })để giành chiến thắng!
BornToCode
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.