Có cách nào để làm cho chiều rộng của DIV của con rộng hơn DIV gốc bằng CSS không?


229

Có cách nào để có một DIV con trong DIV chứa cha mẹ rộng hơn cha mẹ của nó không. DIV con cần có cùng chiều rộng của khung nhìn trình duyệt.

Xem ví dụ dưới đây: nhập mô tả hình ảnh ở đây

Đứa trẻ DIV phải ở lại làm con của cha mẹ. Tôi biết tôi có thể đặt các lề âm tùy ý trên div con để làm cho nó rộng hơn nhưng tôi không thể tìm ra cách làm cho nó có chiều rộng 100% của trình duyệt.

Tôi biết tôi có thể làm điều này:

.child-div{
    margin-left: -100px;
    margin-right: -100px;
}

Nhưng tôi cần đứa trẻ có cùng chiều rộng với trình duyệt động.

Cập nhật

Cảm ơn câu trả lời của bạn, có vẻ như câu trả lời gần nhất cho đến nay là đặt vị trí DIV của con: tuyệt đối và đặt thuộc tính trái và phải thành 0.

Vấn đề tiếp theo tôi gặp phải là cha mẹ có vị trí: tương đối, có nghĩa là thuộc tính trái và phải vẫn tương đối với div cha và không phải trình duyệt, xem ví dụ tại đây: jsfiddle.net/v2Tja/2

Tôi không thể loại bỏ vị trí tương đối khỏi cha mẹ mà không làm hỏng mọi thứ khác.


Yêu cầu của bạn không thực sự có ý nghĩa. "Div con" phải ở lại như con của div cha, nhưng div cha có position: relative? Bạn cần position: relativegì? Tôi đoán những gì tôi đang hỏi là: bạn đang cố gắng làm gì?
ba mươi

@Camsoft Bạn có thấy nhận xét của tôi về câu trả lời của tôi không? Điều đó hiệu quả với tôi, Ngoài ra hãy kiểm tra trang web của tôi edocument.co.uk , nơi thực hiện những gì bạn đang cố gắng thực hiện theo một cách khác
Blowsie

1
@Camsoft ngoài ra, thực sự không cần bất kỳ jquery / js nào trong giải pháp của bạn
Blowsie

Câu trả lời:


112

Sử dụng định vị tuyệt đối

.child-div {
    position:absolute;
    left:0;
    right:0;
}

14
Ok, câu hỏi tiếp theo, điều gì sẽ xảy ra nếu cha mẹ hoặc tổ tiên khác có bố cục tức là vị trí: họ hàng, xem: jsfiddle.net/v2Tja/2
Camsoft

Làm thế nào về một div cha khác là vị trí: tĩnh và một div khác bên trong với vị trí: tương đối? jsfiddle.net/blowsie/v2Tja/3
Blowsie

10
Có cách nào để làm điều này không, với độ cao tự động của .child-div và vẫn có vị trí chính xác bên dưới?
Philippe Gilbert

2
và không đặt div cha thành "tràn: ẩn" ^^
chris

@Blowsie thì sao position:fixed . Tại sao nó không hoạt động đúng?
Mostafa Ghadimi

227

Đây là một giải pháp chung giúp giữ phần tử con trong luồng tài liệu:

.child {
  width: 100vw;
  position: relative;
  left: calc(-50vw + 50%);
}

Chúng tôi đặt widthphần tử con lấp đầy toàn bộ chiều rộng của khung nhìn, sau đó chúng tôi làm cho nó đáp ứng cạnh của màn hình bằng cách di chuyển nó đến leftkhoảng cách bằng một nửa khung nhìn, trừ 50% chiều rộng của phần tử cha.

Bản giới thiệu:

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  overflow-x: hidden;
}

.parent {
  max-width: 400px;
  margin: 0 auto;
  padding: 1rem;
  position: relative;
  background-color: darkgrey;
}

.child {
  width: 100vw;
  position: relative;
  left: calc(-50vw + 50%);

  height: 100px;
  border: 3px solid red;
  background-color: lightgrey;
}
<div class="parent">
  Pre
  <div class="child">Child</div>
  Post
</div>

Hỗ trợ trình duyệt cho vw và cho calc () thường có thể được xem là IE9 và mới hơn.

Lưu ý: Điều này giả sử mô hình hộp được đặt thành border-box. Nếu không border-box, bạn cũng sẽ phải trừ đi phần đệm và đường viền, làm cho giải pháp này trở nên lộn xộn.

Lưu ý: Khuyến khích ẩn tràn ngang của thùng chứa cuộn của bạn, vì một số trình duyệt nhất định có thể chọn hiển thị thanh cuộn ngang mặc dù không có tràn.


4
Bạn biết gì, nó thực sự hoạt động trong IE9. +1 Đẹp
CatShoes

13
Đây chính xác là những gì tôi đang tìm kiếm cảm ơn bạn rất nhiều. IMO đây là một câu trả lời tốt hơn câu trả lời được chấp nhận vì câu trả lời này không phá vỡ dòng tài liệu
Rémi

18
vw là không tốt. Nếu bạn có một thanh cuộn dọc thì 100vw sẽ cung cấp cho bạn một thanh cuộn ngang.
Nắng

2
Có vẻ như điều này chỉ hoạt động một cấp xuống. Có cách nào để nó hoạt động bất kể phần tử con có bao nhiêu phần tử cha không?
huyền thoại

3
Đây là câu trả lời đúng để bao bọc yếu tố con rộng hơn vào position: relativecha mẹ!
Hanfei CN

14

Tôi đã tìm kiếm rất nhiều giải pháp cho vấn đề này trong một thời gian dài. Lý tưởng nhất là chúng ta muốn có con lớn hơn cha mẹ, nhưng không biết trước những ràng buộc của cha mẹ.

Và cuối cùng tôi đã tìm thấy một câu trả lời chung chung tuyệt vời ở đây . Sao chép nguyên văn:

Ý tưởng ở đây là: đẩy container vào giữa chính xác của cửa sổ trình duyệt với bên trái: 50%;, sau đó kéo nó trở lại cạnh trái với lề -50vw âm.

.child-div {
  width: 100vw;
  position: relative;
  left: 50%;
  right: 50%;
  margin-left: -50vw;
  margin-right: -50vw;
}

1
Tôi tìm thấy nếu tôi muốn nó, giả sử, 90% chiều rộng khung nhìn, tôi có thể sử dụng chiều rộng ở trên nhưng đặt chiều rộng thành 90vw. Ngoài ra, nó dường như margin-rightkhông có hiệu lực trong mọi trường hợp.
Jason Dufair

đã phải thay đổi giá trị lề trái và phải vì trình bao bọc của tôi là 80% chiều rộng khung nhìn. Vì vậy, trong trường hợp của tôi, nó phải là lề trái: -10vw và lề phải: -10vw và sau đó nó hoạt động hoàn hảo! cảm ơn!
Timotheus Triebl

1
Đây là một câu trả lời tuyệt vời! Cảm ơn.
cullanrocks

7

Dựa trên đề xuất ban đầu của bạn (đặt lề âm), tôi đã thử và đưa ra một phương pháp tương tự bằng cách sử dụng đơn vị tỷ lệ phần trăm cho chiều rộng trình duyệt động:

HTML

<div class="grandparent">
    <div class="parent">
        <div class="child">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore neque repellat ipsum natus magni soluta explicabo architecto, molestias laboriosam rerum. Tempore eos labore temporibus alias necessitatibus illum enim, est harum perspiciatis, sit, totam earum corrupti placeat architecto aut minus dignissimos mollitia asperiores sint ea. Libero hic laudantium, ipsam nostrum earum distinctio. Cum expedita, ratione, accusamus dicta similique distinctio est dolore assumenda soluta dolorem quisquam ex possimus aliquid provident quo? Enim tempora quo cupiditate eveniet aperiam.</p>
        </div>
    </div>
</div>

CSS:

.child-div{
   margin: 0 -100%;
   padding: 0 -100%;
}

.parent {
    width: 60%;
    background-color: red;
    margin: 0 auto;
    padding: 50px;
    position:relative;
}

.grandparent {
        overflow-x:hidden;
        background-color: blue;
        width: 100%;
        position:relative;
    }

Các lề âm sẽ cho phép nội dung chảy ra khỏi DIV gốc. Do đó, tôi đặt mục padding: 0 100%;tiêu đẩy nội dung trở về ranh giới ban đầu của Chlid DIV.

Các lề âm cũng sẽ làm cho tổng chiều rộng của .child-div mở rộng ra khỏi chế độ xem của trình duyệt, dẫn đến cuộn ngang. Do đó, chúng ta cần cắt bớt chiều rộng đùn bằng cách áp dụng một overflow-x: hiddenDIV Grandparent (là cha mẹ của Div mẹ):

Đây là thư viện

Tôi đã thử dùng Nils Muffersson left: calc(-50vw + 50%); nó hoạt động hoàn toàn tốt trong Chrome & FF (chưa chắc chắn về IE) cho đến khi tôi phát hiện ra các trình duyệt Safari không hoạt động đúng. Hy vọng họ đã sửa nó sớm vì tôi thực sự thích phương pháp đơn giản này.

Điều này cũng có thể giải quyết vấn đề của bạn trong đó yếu tố DIV gốc phải là position:relative

Hai nhược điểm của phương pháp này là:

  • Yêu cầu đánh dấu thêm (tức là một yếu tố ông bà (giống như phương pháp căn chỉnh bảng theo chiều dọc của bảng ol 'tốt phải không ...)
  • Đường viền trái và phải của DIV trẻ em sẽ không bao giờ hiển thị, đơn giản vì chúng nằm ngoài chế độ xem của trình duyệt.

Vui lòng cho tôi biết nếu có bất kỳ vấn đề nào bạn tìm thấy với phương pháp này;). Hy vọng nó giúp.


4

Flexbox có thể được sử dụng để làm cho một đứa trẻ rộng hơn cha mẹ của nó với ba dòng CSS.

Chỉ có đứa trẻ display, margin-leftwidthcần phải được thiết lập. margin-leftphụ thuộc vào trẻ width. Công thức là:

margin-left: calc(-.5 * var(--child-width) + 50%);

Các biến CSS có thể được sử dụng để tránh tính toán lề trái theo cách thủ công.

Bản trình diễn số 1: Tính toán thủ công

.parent {
  background-color: aqua;
  height: 50vh;
  margin-left: auto;
  margin-right: auto;
  width: 50vw;
}

.child {
  background-color: pink;
  display: flex;
}

.wide {
  margin-left: calc(-37.5vw + 50%);
  width: 75vw;
}

.full {
  margin-left: calc(-50vw + 50%);
  width: 100vw;
}
<div class="parent">
  <div>
    parent
  </div>
  <div class="child wide">
    75vw
  </div>
  <div class="child full">
    100vw
  </div>
</div>

Bản trình diễn số 2: Sử dụng các biến CSS

.parent {
  background-color: aqua;
  height: 50vh;
  margin-left: auto;
  margin-right: auto;
  width: 50vw;
}

.child {
  background-color: pink;
  display: flex;
  margin-left: calc(-.5 * var(--child-width) + 50%);
  width: var(--child-width);
}

.wide {
  --child-width: 75vw;
}

.full {
  --child-width: 100vw;
}
<div class="parent">
  <div>
    parent
  </div>
  <div class="child wide">
    75vw
  </div>
  <div class="child full">
    100vw
  </div>
</div>


3

Tôi đã sử dụng điều này:

HTML

<div class="container">
 <div class="parent">
  <div class="child">
   <div class="inner-container"></div>
  </div>
 </div>
</div>

CSS

.container {
  overflow-x: hidden;
}

.child {
  position: relative;
  width: 200%;
  left: -50%;
}

.inner-container{
  max-width: 1179px;
  margin:0 auto;
}

1

bạn có thể thử vị trí: tuyệt đối. và đưa ra chiều rộng và chiều cao, trên cùng: 'trục y từ trên xuống' và bên trái: 'trục x'


1

Tôi đã có một vấn đề tương tự. Nội dung của phần tử con được cho là nằm trong phần tử cha trong khi nền phải mở rộng toàn bộ chiều rộng khung nhìn.

Tôi đã giải quyết vấn đề này bằng cách tạo phần tử con position: relativevà thêm phần tử giả ( :before) vào nó position: absolute; top: 0; bottom: 0; width: 4000px; left: -1000px;. Phần tử giả ở lại phía sau đứa trẻ thực sự như là một phần tử nền giả. Điều này hoạt động trong tất cả các trình duyệt (ngay cả IE8 + và Safari 6+ - không có khả năng kiểm tra các phiên bản cũ hơn).

Ví dụ nhỏ fiddle: http://jsfiddle.net/vccv39j9/


Điều này có vẻ hoạt động, nhưng nó khiến trình duyệt hiển thị một scrolbar ngang vì chiều rộng là 4000px. Cách giải quyết để giữ phần tử giả trong chiều rộng của khung nhìn?
Aaron Hudon

Tất nhiên bạn phải đặt cơ thể hoặc div gói trang thành overflow-x: hidden.
Seika85

1

Thêm vào giải pháp của Nils Muffersson, tôi cũng đang giải quyết về chiều rộng của thanh cuộn dọc. Tôi đang sử dụng 16pxlàm ví dụ, được trừ vào chiều rộng cổng xem. Điều này sẽ tránh thanh cuộn ngang xuất hiện.

width: calc(100vw - 16px);
left: calc(-1 * (((100vw - 16px) - 100%) / 2));

1
Tôi tin rằng 16pxcái bạn cần trừ vì nó gây ra thanh cuộn ngang là lề / phần đệm mặc định của trình duyệt, thay vì trừ nó chỉ sử dụng cái này html, body{ margin:0; padding:0 }do đó bạn không cần phải tính toán thêm cho16px
Mi-Creativity

Đây là khi nội dung trang dài hơn và xuống dưới nếp gấp và thanh cuộn tự động xuất hiện. Tất nhiên, khi nội dung nằm trong màn hình đầu tiên, điều này là không cần thiết. Tôi chỉ thêm 16px vào công thức khi tôi biết nội dung trang sẽ dài và thanh cuộn thực sự sẽ xuất hiện.
Khu A

Tôi nghĩ rằng nó sẽ không hoạt động trên điện thoại di động. điện thoại di động không có thanh cuộn.
hjchin

1

Giả sử cha mẹ có chiều rộng cố định, ví dụ #page { width: 1000px; }và được căn giữa #page { margin: auto; }, bạn muốn con phù hợp với chiều rộng của chế độ xem trình duyệt mà bạn có thể thực hiện đơn giản:

#page {
    margin: auto;
    width: 1000px;
}

.fullwidth {
    margin-left: calc(500px - 50vw); /* 500px is half of the parent's 1000px */
    width: 100vw;
}

1

Để làm cho div div rộng như nội dung, hãy thử điều này:

.child{
    position:absolute;
    left:0;
    overflow:visible;
    white-space:nowrap;
}

0
.parent {
    margin:0 auto;
    width:700px;
    border:2px solid red;
}
.child {
    position:absolute;
    width:100%;
    border:2px solid blue;
    left:0;
    top:200px;
}

Thông minh, nhưng dường như không hoạt động (ít nhất là với các nhịp được nhúng trong li ').
ruffin

0

Tôi biết điều này đã cũ nhưng đối với bất kỳ ai đến với câu trả lời này, bạn sẽ làm như vậy:

Tràn ẩn trên một phần tử có chứa phần tử cha, chẳng hạn như phần thân.

Cung cấp cho phần tử con của bạn một chiều rộng rộng hơn nhiều so với trang của bạn và đặt nó ở vị trí tuyệt đối còn lại -100%.

Đây là một ví dụ:

body {
  overflow:hidden;
}

.parent{
  width: 960px;
  background-color: red;
  margin: 0 auto;
  position: relative;    
}

.child {
  height: 200px;
  position: absolute;
  left: -100%;
  width:9999999px;
}

Ngoài ra đây là một Fiddle JS: http://jsfiddle.net/v2Tja/288/


0

Sau đó, giải pháp sẽ là như sau.

HTML

<div class="parent">
    <div class="child"></div>
</div>

CSS

.parent{
        width: 960px;
        margin: auto;
        height: 100vh
    }
    .child{
        position: absolute;
        width: 100vw
    }

Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
R Balasubramanian

0

Tôi đã thử một số giải pháp của bạn. Cái này :

margin: 0px -100%;
padding: 0 100%;

cho đến nay là tốt nhất, vì chúng ta không cần thêm css cho màn hình nhỏ hơn. Tôi đã tạo một codePen để hiển thị kết quả: Tôi đã sử dụng div cha với hình nền và div divon có nội dung bên trong.

https://codepen.io/yuyazz/pen/baoqBBq

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.