Đặt độ rộng của một vị trí trên đỉnh: cố định div div liên quan đến div cha


137

Tôi đang cố gắng cung cấp cho div (vị trí: cố định) chiều rộng 100% (liên quan đến div cha). Nhưng tôi đã gặp một số vấn đề ...

EDIT: Vấn đề đầu tiên được giải quyết bằng cách sử dụng kế thừa, nhưng nó vẫn không hoạt động. Tôi nghĩ vấn đề là tôi đang sử dụng nhiều div có chiều rộng 100% / kế thừa. Bạn có thể tìm thấy vấn đề thứ hai trên bản cập nhật jsfiddle: http://jsfiddle.net/4bGqF/7/

Ví dụ con cáo

#container {
    width: 800px;
}

#fixed {
    position: fixed;
    width: 100%;
}

và html

<div id="container">
    <div id="fixed">Sitename</div>
    <p>
        blaat
    </p>
</div>

Hoặc bạn có thể dùng thử: http://jsfiddle.net/4bGqF/

Các vấn đề dường như là phần tử cố định luôn lấy chiều rộng của cửa sổ / tài liệu . Có ai biết làm thế nào để sửa lỗi này?

Tôi không thể sửa lỗi phần tử cố định của mình vì tôi đang sử dụng plugin jScrollPane. Nó phụ thuộc vào nội dung có thanh cuộn hay không.

Cảm ơn rất nhiều!

PS: Văn bản của 2 div nằm chồng lên nhau. Đây chỉ là một ví dụ để điều đó không thực sự quan trọng.


xem câu trả lời của tôi dưới đây trong đó cung cấp một số cái nhìn sâu sắc bổ sung vào inheritvà làm thế nào sử dụng max-width:inheritvới width:inheritgiữ container / chứa tỷ lệ trong khi cùng vẫn đang được đáp ứng và dễ quản lý
aequalsb

Câu trả lời:


119

Tôi không chắc vấn đề thứ hai là gì (dựa trên chỉnh sửa của bạn), nhưng nếu bạn áp dụng width:inheritcho tất cả các div bên trong, nó hoạt động: http://jsfiddle.net/4bGqF/9/

Bạn có thể muốn xem xét một giải pháp javascript cho các trình duyệt mà bạn cần hỗ trợ và hỗ trợ dont width:inherit


4
+1 cho một giải pháp đơn giản tuyệt vời, mặc dù đó width: inheritkhông phải là điều đầu tiên tôi nghĩ đến
Bojangles

7
Cái gì phù thủy đây?! +1
Nicu Surdu

7
Bất kỳ ý tưởng nào để giải quyết vấn đề này nếu #container width là 50% bên trong div với width = 100px (thì chiều rộng vùng chứa sẽ là 50px và chiều rộng cố định sẽ là 50% chiều rộng của trình duyệt)?
Kek

113
Thủ thuật kế thừa chiều rộng của cha mẹ chỉ hoạt động nếu cha mẹ có chiều rộng được đặt bằng px.
jahu

33
Đây là một câu trả lời khá tệ ... Về cơ bản, nó tương đương với việc đặt các giá trị không đổi, hoàn toàn không hữu ích.
Jay

33

Như nhiều người đã nhận xét, thiết kế đáp ứng rất thường đặt chiều rộng theo%

width:inheritsẽ kế thừa chiều rộng CSS KHÔNG phải chiều rộng được tính toán - Điều đó có nghĩa là vùng chứa con kế thừawidth:100%

Nhưng, tôi nghĩ rằng, hầu như thường xuyên thiết kế đáp ứng max-widthquá, do đó:

#container {
    width:100%;
    max-width:800px;
}
#contained {
    position:fixed;
    width:inherit;
    max-width:inherit;
}

Điều này làm việc rất thỏa mãn để giải quyết vấn đề của tôi về việc làm cho một menu dính bị hạn chế về chiều rộng gốc ban đầu bất cứ khi nào nó bị "kẹt"

Cả cha mẹ và con cái sẽ tuân thủ width:100%nếu khung nhìn nhỏ hơn chiều rộng tối đa. Tương tự như vậy, cả hai sẽ tuân thủ max-width:800pxkhi khung nhìn rộng hơn.

Nó hoạt động với chủ đề đã phản hồi của tôi theo cách tôi có thể thay đổi vùng chứa cha mà không phải thay đổi thành phần con cố định - thanh lịch và linh hoạt

ps: Cá nhân tôi nghĩ rằng không có vấn đề gì khi IE6 / 7 không sử dụng inherit


Câu trả lời chính xác! Trong trường hợp của tôi, thêm một min-width: inheritthủ thuật đã làm.
Bruno Monteiro

Điều này hoạt động cho các phần tử cha mẹ với chiều rộng được xác định là px và tỷ lệ phần trăm. Nên là câu trả lời đúng trong quan điểm của tôi.
Mikel

24

vị trí cố định là một chút khó khăn (thực sự là không thể), nhưng vị trí: dính đang thực hiện các thủ thuật đẹp mắt:

<div class='container'>
  <header>This is the header</header>
  <section>
    ... long lorem ipsum
  </section>
</div>

body {
  text-align: center;  
}

.container {
  text-align: left;
  max-width: 30%;
  margin: 0 auto;
}


header {
  line-height: 2rem;
  outline: 1px solid red;
  background: #fff;
  padding: 1rem;

  position: sticky;
  top: 0;
}

xem mẫu codepen


11

Bạn cũng có thể giải quyết nó bằng jQuery:

var new_width = $('#container').width();
$('#fixed').width(new_width); 

Điều này rất hữu ích với tôi vì bố cục của tôi rất nhạy và inheritgiải pháp không hiệu quả với tôi!


1
câu trả lời xấu, nếu bạn thay đổi kích thước cửa sổ này sẽ phá vỡ.
Jay

2
Nên thực sự có một trình xử lý sự kiện window.onresize.
twistpixel

Đây là cách để làm. Có thể được gói vào một hàm setWidth (), sau đó gọi nó trên trình lắng nghe sự kiện cửa sổ "tải" và "thay đổi kích thước"
woodz

Điều này làm việc tốt cho tôi! Tôi gặp phải một vấn đề trong đó cha mẹ có chiều rộng: 25%, do đó, làm chiều rộng: kế thừa làm cho mỗi chiều rộng con: 25%.
Troy Riemer

10

Sử dụng CSS này:

#container {
    width: 400px;
    border: 1px solid red;
}

#fixed {
    position: fixed;
    width: inherit;
    border: 1px solid green;
}

Phần tử #fixed sẽ kế thừa chiều rộng cha mẹ của nó, vì vậy nó sẽ là 100%.


1
ngoại trừ IE6-7 không hỗ trợ inherit. Không chắc chắn nếu mattesr.
Thomas Shields

Cảm ơn rất nhiều. Nó hoạt động khi tôi thử nó trong ví dụ nhưng không phải trong mã của tôi ... Dù sao đó cũng là một câu trả lời cho câu hỏi tôi đã hỏi ở đây. Có lẽ có một lý do khác tại sao nó không hoạt động ... Nhưng vẫn, cảm ơn!
năm11

6

Định vị cố định được cho là xác định mọi thứ liên quan đến chế độ xem, vì vậy position:fixedsẽ luôn luôn làm điều đó. position:relativeThay vào đó hãy thử sử dụng div con. (Tôi nhận ra rằng bạn có thể cần định vị cố định vì những lý do khác, nhưng nếu vậy - bạn thực sự không thể làm cho chiều rộng phù hợp với phụ huynh mà không có JS mà không có inherit)


1
@Downvoter - bạn có thể giải thích không? Tôi không có vấn đề gì với downvote nhưng tôi muốn biết tại sao để tôi có thể cải thiện câu trả lời của mình trong tương lai.
Thomas Shields

1
Bạn giải thích là ổn, tuy nhiên bạn đã nói "bạn thực sự không thể làm cho chiều rộng phù hợp với nó mà không có JS". Mặc dù có thể trong một số trường hợp (bằng cách sử dụng kế thừa).
năm11 lúc 18 giờ 47 phút

ồ dĩ nhiên rồi. Tôi đã quên về kế thừa khi tôi nhắm mục tiêu IE rất nhiều và chỉ IE9 + hỗ trợ nó.
Thomas Shields

1
ngay cả Microsoft cũng muốn IE biến mất - xem xét bài đăng gốc này bao nhiêu tuổi, tôi nghĩ rằng vấn đề IE là an toàn. nếu đặc biệt khuyên bạn không nên hỗ trợ IE UNLESS, bạn sẽ thanh toán cụ thể cho hỗ trợ đó - và theo giờ!
aequalsb

3

Đây là một hack nhỏ mà chúng tôi đã chạy qua trong khi sửa một số vấn đề vẽ lại trên một ứng dụng lớn.

Sử dụng -webkit-transform: translateZ(0);trên cha mẹ. Tất nhiên điều này là dành riêng cho Chrome.

http://jsfiddle.net/senica/bCQEa/

-webkit-transform: translateZ(0);

2
Điều này khắc phục vấn đề về chiều rộng, nhưng nó làm cho đứa trẻ không cố định liên quan đến chế độ xem.
Vivek Maharajh

Xin lỗi cho downvote, vì điều này hoàn toàn đánh bại mục đích của vị trí: cố định.
trusktr

Tôi không nghĩ bạn đọc câu hỏi. Nó nói, làm thế nào để bạn tạo một div "tương đối" với cha mẹ với vị trí "cố định". Điều đó là vị trí chống cố định. Và phản ứng của tôi rõ ràng nói, "hack". Nó không đánh bại mục đích khi nó đưa bạn đến gần hơn với giải pháp của bạn.
Senica Gonzalez

1

Có một giải pháp dễ dàng cho việc này.

Tôi đã sử dụng một vị trí cố định cho div cha và độ rộng tối đa cho nội dung.

Bạn không cần phải suy nghĩ quá nhiều về các container khác vì vị trí cố định chỉ liên quan đến cửa sổ trình duyệt.

       .fixed{
            width:100%;
            position:fixed;
            height:100px;
            background: red;
        }

        .fixed .content{
            max-width: 500px;
            background:blue;
            margin: 0 auto;
            text-align: center;
            padding: 20px 0;
        }
<div class="fixed">
  <div class="content">
     This is my content
  </div>
</div>


1

Giải pháp này đáp ứng các tiêu chí sau

  1. Tỷ lệ phần trăm được phép trên cha mẹ
  2. Hoạt động sau khi thay đổi kích thước cửa sổ
  3. Nội dung bên dưới tiêu đề không bao giờ có thể truy cập được

Theo như tôi biết, tiêu chí này không thể được đáp ứng nếu không có Javascript (thật không may).

Giải pháp này sử dụng jQuery, nhưng cũng có thể dễ dàng chuyển đổi sang vanilla JS:

function fixedHeader(){
  $(this).width($("#wrapper").width());
  $("#header-filler").height($("#header-fixed").outerHeight());
}

$(window).resize(function() {
  fixedHeader();
});

fixedHeader();
#header-fixed{
  position: fixed;
  background-color: white;
  top: 0;
}
#header-filler{
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="wrapper">
<div id="header-fixed">
  This is a nifty header! works even when resizing the window causing a line break
</div>
<div id="header-filler"></div>

[start fluff]<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>
[end fluff]

</div>


0

Bạn cần đưa ra cùng một kiểu của phần tử cố định và phần tử cha của nó. Một trong những ví dụ này được tạo ra với chiều rộng tối đa và trong ví dụ khác với phần đệm.

* {
  box-sizing: border-box
}
body {
  margin: 0;
}
.container {
  max-width: 500px;
  height: 100px;
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  background-color: lightgray;
}
.content {
  max-width: 500px;
  width: 100%;
  position: fixed;
}
h2 {
  border: 1px dotted black;
  padding: 10px;
}
.container-2 {
  height: 100px;
  padding-left: 32px;
  padding-right: 32px;
  margin-top: 10px;
  background-color: lightgray;
}
.content-2 {
  width: 100%;
  position: fixed;
  left: 0;
  padding-left: 32px;
  padding-right: 32px;
}
<div class="container">
  <div class="content">
    <h2>container with max widths</h2>
  </div>
</div>

<div class="container-2">
  <div class="content-2">
    <div>
      <h2>container with paddings</h2>
    </div>
  </div>
</div>

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.