Đặt một div cố định thành 100% chiều rộng của vùng chứa mẹ


83

Tôi có một trình bao bọc với một số phần đệm, sau đó tôi có một div tương đối nổi với chiều rộng phần trăm (40%).

Bên trong div tương đối nổi, tôi có một div cố định mà tôi muốn có cùng kích thước với mẹ của nó. Tôi hiểu rằng một div cố định bị xóa khỏi luồng tài liệu và như vậy sẽ bỏ qua phần đệm của trình bao bọc.

HTML

<div id="wrapper">
  <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
  </div>
</div>

CSS

body { 
  height: 20000px 
}  
#wrapper {
  padding: 10%;
}  
#wrap { 
  float: left;
  position: relative;
  width: 40%; 
  background: #ccc; 
} 
#fixed { 
  position: fixed;
  width: inherit;
  padding: 0px;
  height: 10px;
  background-color: #333;
}

Đây là fiddle bắt buộc: http://jsfiddle.net/C93mk/489/

Có ai biết một cách để thực hiện điều này?

Tôi đã sửa đổi fiddle để hiển thị chi tiết hơn về những gì tôi đang cố gắng hoàn thành, xin lỗi vì sự nhầm lẫn: http://jsfiddle.net/EVYRE/4/

Câu trả lời:


41

Bạn có thể sử dụng ký quỹ cho .wrap container thay vì padding cho .wrapper:

body{ height:20000px }
#wrapper { padding: 0%; }
#wrap{ 
    float: left;
    position: relative;
    margin: 10%;
    width: 40%; 
    background:#ccc; 
}
#fixed{ 
    position:fixed;
    width:inherit;
    padding:0px; 
    height:10px;
    background-color:#333;    
}

jsfiddle


Cập nhật fiddle tôi để giải thích tốt hơn những gì tôi đang làm: jsfiddle.net/EVYRE/4
Jack Murdoch

@JackMurdoch, cách duy nhất tôi tìm thấy mà không có js là sử dụng calcfor rightleftthuộc tính. Nhìn vào jsfiddle
YD1m

Điều này sẽ không hoạt động khi trình bao bọc bị thu hẹp dưới chiều rộng tối đa (trong ví dụ là 600px), nhưng tôi tin rằng bạn nói đúng, nó không thể được thực hiện bên ngoài javascript. Cảm ơn đã giúp đỡ.
Jack Murdoch

5
nó không thực sự hoạt động, hãy xem fiddle jsfiddle.net/EVYRE/4 này . Chiều rộng #sidebar sẽ tương đối với cha mẹ của anh ấy (#sidebar_wrap), nhưng không phải, và nó tràn ra phụ huynh của anh ấy.
mlb

Tôi nghĩ rằng điều này chỉ hoạt động vì chỉ có một div giữa phần tử cố định và cửa sổ. Điều này sẽ không hoạt động nếu phần tử cố định được lồng nhiều lần trong các phần tử không bằng 100% chiều rộng cửa sổ
Jay

3

Làm thế nào về điều này ?

$( document ).ready(function() {
    $('#fixed').width($('#wrap').width());
});

Bằng cách sử dụng jquery, bạn có thể đặt bất kỳ loại chiều rộng nào :)

CHỈNH SỬA: Như đã nêu trong phần bình luận, việc sử dụng JQuery chỉ cho hiệu ứng này là vô nghĩa và thậm chí còn phản tác dụng. Tôi đã làm ví dụ này cho những người sử dụng JQuery cho các nội dung khác trên trang của họ và cũng cân nhắc sử dụng nó cho phần này. Tôi xin lỗi vì bất kỳ sự bất tiện nào mà câu trả lời của tôi đã gây ra.


"Bên trong div tương đối nổi, tôi có một div cố định mà tôi muốn có cùng kích thước với div mẹ của nó" - Bên trong "#wrap", anh ấy có '#fixed' mà anh ấy muốn có cùng kích thước với div '#wrap' (chiều cao đã được thiết lập nên tôi không thay đổi nó). Vui lòng giải thích cho tôi phần nào của nó mà tôi không nhận được? Và phần nào của kết quả khác với các câu trả lời khác?
Hristo Valkanov

2
Này anh bạn, không xúc phạm. thực ra câu hỏi là cung cấp câu trả lời trong css, mà bạn đã giới thiệu jQuery, mà lẽ ra phải là gợi ý hơn là câu trả lời.
dreamweiver

Tôi biết tôi thậm chí đã ủng hộ giải pháp khác có lề, nhưng tôi không hiểu tại sao không ai có thể đặt giải pháp jquery. Hãy tưởng tượng nếu 5-6 tháng nữa ai đó tìm thấy câu hỏi này qua google và xem xét giải pháp jquery phù hợp hơn cho trường hợp của mình?
Hristo Valkanov

1
Tôi đồng ý rằng giải pháp của bạn là hoàn hảo về phạm vi jquery nhưng không phải về css đơn giản. khi tôi không sử dụng Jquery lib, bạn có muốn tôi sử dụng nó không chỉ vì tôi đã tìm thấy một giải pháp đơn giản trong jquery như bạn đã đăng. một tệp Jquery lib có dung lượng 32 KB nén / 91,6 KB (chế độ sản xuất) / 252 KB ( chế độ phát triển) .its thực sự không khả thi cho một người sử dụng jQuery lib, nếu nó không có giá trị. một bất lợi có thể có của jQuery hoặc Điểm mấu chốt về hiệu suất trên trang web
dreamweiver

4
Điều này sẽ phá vỡ nếu bạn thay đổi kích thước cửa sổ. Bây giờ bạn phải thực hiện tính toán kích thước lớn, thật tuyệt, nghe có vẻ tốn kém. nty
Jay

3

Hãy thử thêm một biến đổi cho cha mẹ (không phải làm bất cứ điều gì, có thể là một bản dịch 0) và đặt chiều rộng cố định của phần con thành 100%

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    position: relative;
    width: 40%; 
    background:#ccc; 
    transform: translate(0, 0);
}
#fixed{ 
    position:fixed;
    width:100%;
    padding:0px;
    height:10px;
    background-color:#333;
}
<div id="wrapper">
    <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
    </div>
</div>


1

Bạn có thể sử dụng định vị tuyệt đối để ghim chân trang vào cơ sở của div mẹ. Tôi cũng đã thêm 10px padding-bottom vào wrap (khớp với chiều cao của footer). Vị trí tuyệt đối là tương đối với div mẹ chứ không phải bên ngoài luồng vì bạn đã cấp cho nó thuộc tính vị trí tương đối.

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    padding-bottom: 10px;
    position: relative;
    width: 40%; 
    background:#ccc; 
}
#fixed{ 
    position:absolute;
    width:100%;
    left: 0;
    bottom: 0;
    padding:0px;
    height:10px;
    background-color:#333;

}

http://jsfiddle.net/C93mk/497/


Tôi cố gắng này ban đầu nhưng vấn đề là khi bạn di chuyển nó di chuyển cùng với phần còn lại của các div, do đó nó không phải là thực sự là hành vi của vị cố định
ThinkBonobo

1

man vùng chứa của bạn bằng 40% chiều rộng của phần tử mẹ

nhưng khi bạn sử dụng vị trí: cố định, chiều rộng dựa trên chiều rộng khung nhìn (tài liệu) ...

nghĩ về việc, tôi nhận ra rằng phần tử mẹ của bạn có 10% khoảng đệm (trái và phải), điều đó có nghĩa là phần tử của bạn có 80% tổng chiều rộng trang. vì vậy phần tử cố định của bạn phải có 40% dựa trên 80% tổng chiều rộng

vì vậy bạn chỉ cần thay đổi lớp #fixed của mình thành

#fixed{ 
    position:fixed;
    width: calc(80% * 0.4);
    height:10px;
    background-color:#333;
}

nếu bạn sử dụng sass, postcss hoặc trình biên dịch css khác, bạn có thể sử dụng các biến để tránh phá vỡ bố cục khi bạn thay đổi giá trị đệm của phần tử mẹ.

đây là bản cập nhật fiddle http://jsfiddle.net/C93mk/2343/

tôi hy vọng nó có ích, trân trọng


0

Trên jsfiddle cuối cùng của bạn , bạn chỉ bỏ lỡ một điều:

#sidebar_wrap {
  width:40%;
  height:200px;
  background:green;
  float:right;
}
#sidebar {
  width:inherit;
  margin-top:10px;
  background-color:limegreen;
  position:fixed;
  max-width: 240px; /*This is you missed*/
}

Nhưng, làm thế nào điều này sẽ giải quyết vấn đề của bạn? Đơn giản, hãy giải thích lý do tại sao lớn hơn mong đợi trước.

Phần tử cố định #sidebarsẽ sử dụng kích thước chiều rộng cửa sổ làm cơ sở để có kích thước riêng của nó, giống như mọi phần tử cố định khác, khi phần tử này được xác định width:inherit#sidebar_wrapcó 40% là giá trị chiều rộng, thì sẽ tính toán window.width * 40%, sau đó khi chiều rộng cửa sổ của bạn lớn hơn .containerchiều rộng, #sidebarsẽ lớn hơn #sidebar_wrap.

Bằng cách này, bạn phải đặt chiều rộng tối đa trong của mình #sidebar_wrap, để ngăn lớn hơn #sidebar_wrap.

Kiểm tra jsfiddle này hiển thị mã đang hoạt động và giải thích rõ hơn cách hoạt động của mã này.


-3

Xóa Padding: 10%;hoặc sử dụng px thay vì phần trăm cho.wrap

xem ví dụ: http://jsfiddle.net/C93mk/493/

HTML:

<div id="wrapper">
    <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
    </div>
</div>

CSS:

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    position: relative;
    width: 200px; 
    background:#ccc; 
}
#fixed{ 
    position:fixed;
    width:inherit;
    padding:0px;
    height:10px;
    background-color:#333;

}

anh ấy cần chiều rộng là phần trăm trên #wrap. nhưng bạn đã đặt một cố định với.
Achintha Samindika

Điều này cũng giống như việc thiết lập chiều rộng của phần tử cố định theo cách thủ công và không giúp ích gì cả
Jay
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.