มีวิธีที่จะทำให้ความกว้างของ DIV ลูกกว้างกว่า DIV หลักโดยใช้ CSS หรือไม่?


229

มีวิธีที่จะมีลูก DIV ในคอนเทนเนอร์หลัก DIV ที่กว้างกว่าพาเรนต์หรือไม่ DIV ลูกต้องเป็นความกว้างเท่ากันของวิวพอร์ตเบราว์เซอร์

ดูตัวอย่างด้านล่าง: ป้อนคำอธิบายรูปภาพที่นี่

DIV ลูกจะต้องอยู่ในฐานะลูกของผู้ปกครอง ฉันรู้ว่าฉันสามารถตั้งค่าระยะขอบลบโดยพลการบน div เด็กเพื่อให้กว้างขึ้น แต่ฉันไม่สามารถหาวิธีทำให้ความกว้าง 100% ของเบราว์เซอร์เป็นหลัก

ฉันรู้ว่าฉันสามารถทำสิ่งนี้:

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

แต่ฉันต้องการให้เด็กมีความกว้างเท่ากับเบราว์เซอร์ที่เป็นแบบไดนามิก

ปรับปรุง

ขอบคุณสำหรับคำตอบของคุณดูเหมือนว่าคำตอบที่ใกล้ที่สุดคือการทำให้ตำแหน่ง DIV ของเด็ก: สัมบูรณ์และตั้งค่าคุณสมบัติซ้ายและขวาเป็น 0

ปัญหาต่อไปที่ฉันมีคือผู้ปกครองมีตำแหน่ง: ญาติซึ่งหมายความว่าคุณสมบัติด้านซ้ายและขวายังคงสัมพันธ์กับผู้ปกครอง div และไม่ใช่เบราว์เซอร์ดูตัวอย่างที่นี่: jsfiddle.net/v2Tja/2

ฉันไม่สามารถลบตำแหน่งที่สัมพันธ์กันจากผู้ปกครองได้โดยไม่พลาดทุกสิ่ง


ความต้องการของคุณไม่สมเหตุสมผล "การที่เด็ก div" ต้องอยู่เป็นลูกของ div แม่และยัง div ที่ผู้ปกครองมีposition: relative? คุณต้องการposition: relativeอะไร ฉันเดาว่าฉันถามอะไรอยู่: คุณพยายามทำอะไร
สามสิบ

@Camsoft คุณเห็นความคิดเห็นของฉันในคำตอบของฉัน? ผลงานที่สำหรับผมยังตรวจสอบเว็บไซต์ของฉันedocuments.co.ukซึ่งไม่สิ่งที่คุณกำลังพยายามที่จะทำในทางที่แตกต่างกัน
Blowsie

1
@Camsoft นอกจากนี้ไม่จำเป็นต้องมี jquery / js ใด ๆ ในการแก้ปัญหาของคุณ
จริงๆ

คำตอบ:


112

ใช้การกำหนดตำแหน่งแบบสัมบูรณ์

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

14
ตกลงคำถามต่อไปจะเกิดอะไรขึ้นถ้าผู้ปกครองหรือบรรพบุรุษคนอื่นมีเลย์เอาต์เช่นตำแหน่ง: ญาติให้ดู: jsfiddle.net/v2Tja/2
Camsoft

แล้วผู้ปกครองอีกคนที่อยู่ในตำแหน่ง: คงที่และอีกคนหนึ่งอยู่ในตำแหน่ง: ญาติ jsfiddle.net/blowsie/v2Tja/3
Blowsie

10
มีวิธีในการทำเช่นนี้ซึ่งมีค่าความสูงอัตโนมัติ. child-div และยังมีตำแหน่งที่ถูกต้องด้านล่างหรือไม่
Philippe Gilbert

2
และอย่าตั้งค่า div หลักเป็น "overflow: hidden" ^^
chris

@Blowsie position:fixed วิธีการเกี่ยวกับ ทำไมมันไม่ทำงานอย่างถูกต้อง?
Mostafa Ghadimi

227

ต่อไปนี้เป็นโซลูชันทั่วไปที่ช่วยให้องค์ประกอบย่อยอยู่ในผังเอกสาร:

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

เราตั้งค่าwidthองค์ประกอบลูกเพื่อเติมเต็มความกว้างวิวพอร์ตทั้งหมดจากนั้นเราทำให้มันเป็นไปตามขอบของหน้าจอโดยเลื่อนไปยังleftระยะห่างครึ่งหนึ่งของวิวพอร์ตลบ 50% ของความกว้างขององค์ประกอบหลัก

การสาธิต:

* {
  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>

การสนับสนุนเบราว์เซอร์สำหรับvwและสำหรับcalc ()สามารถเห็นได้โดยทั่วไปว่าเป็น IE9 และใหม่กว่า

หมายเหตุ:border-boxนี้จะถือว่ารูปแบบกล่องมีการตั้งค่า หากไม่มีborder-boxคุณจะต้องลบการเติมช่องว่างและเส้นขอบทำให้การแก้ไขเป็นระเบียบ

หมายเหตุ:ขอแนะนำให้ซ่อนส่วนเกินในแนวนอนของคอนเทนเนอร์การเลื่อนของคุณเนื่องจากเบราว์เซอร์บางตัวอาจเลือกที่จะแสดงแถบเลื่อนแนวนอนแม้ว่าจะไม่มีการล้น


4
สิ่งใดที่คุณรู้ว่ามันทำงานได้จริงใน IE9 +1 ดี
CatShoes

13
นี่คือสิ่งที่ฉันกำลังมองหาขอบคุณอย่างมาก IMO นี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับการยอมรับเนื่องจากเอกสารนี้ไม่ทำลายการไหลของเอกสาร
Rémi

18
vw ไม่ดี หากคุณมีแถบเลื่อนแนวตั้งแล้ว 100vw จะให้แถบเลื่อนแนวนอนให้คุณ
ซันนี่

2
ดูเหมือนว่าจะใช้งานได้เพียงระดับเดียวเท่านั้น มีวิธีใดบ้างที่จะใช้งานได้โดยไม่คำนึงถึงองค์ประกอบหลักที่องค์ประกอบลูกมี
mythofechelon

3
นี่คือคำตอบที่ถูกต้องในการห่อส่วนย่อยของลูกให้กว้างขึ้นในposition: relativeผู้ปกครอง!
ฮันเฟ

14

ฉันค้นหาไปทั่วเพื่อหาทางแก้ไขปัญหานี้มาเป็นเวลานาน เป็นการดีที่เราต้องการมีลูกมากกว่าผู้ปกครอง แต่ไม่ทราบถึงข้อ จำกัด ของผู้ปกครองล่วงหน้า

และในที่สุดผมก็พบคำตอบทั่วไปที่ยอดเยี่ยมที่นี่ คัดลอกมันเป็นคำต่อคำ:

แนวคิดนี่คือ: ผลักคอนเทนเนอร์ไปยังกึ่งกลางที่แน่นอนของหน้าต่างเบราว์เซอร์ด้วยซ้าย: 50%; จากนั้นดึงกลับไปที่ขอบด้านซ้ายด้วยขอบลบ -50vw

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

1
ผมพบว่าถ้าผมต้องการให้มันเป็นพูดว่า 90% ของความกว้างวิวพอร์ตที่ฉันสามารถใช้ข้างต้น 90vwแต่ความกว้างของชุด นอกจากนี้ยังปรากฏว่าmargin-rightไม่มีผลในกรณีใด ๆ
Jason Dufair

ต้องเปลี่ยนค่า margin-left และ right ทำให้ wrapper ของฉันคือ 80% ของความกว้างวิวพอร์ต ดังนั้นในกรณีของฉันมันต้องเป็น margin-left: -10vw และ margin-right: -10vw และจากนั้นก็ใช้งานได้อย่างสมบูรณ์แบบ! ขอบคุณ!
Timotheus Triebl

1
นี่เป็นคำตอบที่ยอดเยี่ยม! ขอบคุณ
cullanrocks

7

ตามคำแนะนำดั้งเดิมของคุณ (การตั้งค่าระยะขอบติดลบ) ฉันได้ลองใช้วิธีที่คล้ายกันโดยใช้หน่วยเปอร์เซ็นต์สำหรับความกว้างของเบราว์เซอร์แบบไดนามิก:

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;
    }

ระยะขอบติดลบจะทำให้เนื้อหาไหลออกจาก Parent DIV ดังนั้นฉันตั้งค่าpadding: 0 100%;ให้ส่งเนื้อหากลับไปที่ขอบเขตดั้งเดิมของ Chlid DIV

ระยะขอบลบจะทำให้ความกว้างทั้งหมดของ. child-div ขยายออกจากวิวพอร์ตของเบราว์เซอร์ทำให้เลื่อนในแนวนอน ดังนั้นเราจำเป็นต้องคลิปความกว้างของการอัดรีดโดยการใช้overflow-x: hiddenกับ Grandparent DIV (ซึ่งเป็นพาเรนต์ของ parent Div):

นี่คือJSfiddle

ฉันได้ลองของ Nils Kaspersson left: calc(-50vw + 50%)แล้ว มันทำงานได้ดีอย่างสมบูรณ์ใน Chrome & FF (ยังไม่แน่ใจเกี่ยวกับ IE) จนกระทั่งฉันพบเบราว์เซอร์ Safari ไม่ทำงานอย่างถูกต้อง หวังว่าพวกเขาจะแก้ไขปัญหานี้ทันทีที่ฉันชอบวิธีการง่ายๆนี้

สิ่งนี้อาจแก้ไขปัญหาของคุณได้ที่องค์ประกอบ DIV หลัก position:relative

2 ข้อเสียของวิธีแก้ปัญหานี้คือ:

  • ต้องการมาร์กอัปพิเศษ (เช่นองค์ประกอบที่เป็นปู่ย่าตายาย (เช่นเดียวกับวิธีการจัดตำแหน่งแนวดิ่งที่ดีของตารางไม่ใช่ใช่ ... )
  • ขอบด้านซ้ายและขวาของ Child DIV จะไม่แสดงเพียงเพราะอยู่นอกวิวพอร์ตของเบราว์เซอร์

โปรดแจ้งให้เราทราบหากคุณพบปัญหาในการใช้วิธีนี้;) หวังว่ามันจะช่วย


4

Flexboxสามารถใช้เพื่อทำให้เด็ก ๆ กว้างกว่าพาเรนต์ด้วย CSS สามบรรทัด

เฉพาะของเด็กdisplay, margin-leftและwidthจำเป็นที่จะต้องเป็นชุด ขึ้นอยู่กับเด็กของmargin-left widthสูตรคือ:

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

สามารถใช้ตัวแปร CSS เพื่อหลีกเลี่ยงการคำนวณระยะขอบซ้ายด้วยตนเอง

การสาธิต # 1: การคำนวณด้วยตนเอง

.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>

การสาธิต # 2: การใช้ตัวแปร 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

ฉันใช้สิ่งนี้:

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

คุณสามารถลองตำแหน่ง: แน่นอน และให้ความกว้างและความสูงด้านบน: 'แกน y จากด้านบน' และซ้าย: 'แกน x'


1

ฉันมีปัญหาที่คล้ายกัน เนื้อหาขององค์ประกอบลูกควรจะอยู่ในองค์ประกอบหลักในขณะที่พื้นหลังต้องขยายความกว้างวิวพอร์ตแบบเต็ม

ฉันแก้ไขปัญหานี้ได้ด้วยการทำให้องค์ประกอบย่อยposition: relativeและเพิ่มองค์ประกอบปลอม ( :before) ลงไปด้วยposition: absolute; top: 0; bottom: 0; width: 4000px; left: -1000px;ไปด้วย องค์ประกอบหลอกอยู่เบื้องหลังเด็กที่เกิดขึ้นจริงเป็นองค์ประกอบพื้นหลังหลอก สามารถใช้งานได้ในทุกเบราว์เซอร์ (แม้แต่ IE8 + และ Safari 6+ - ไม่มีความเป็นไปได้ในการทดสอบเวอร์ชันเก่ากว่า)

ซอตัวอย่างเล็ก ๆ : http://jsfiddle.net/vccv39j9/


ดูเหมือนว่าจะใช้งานได้ แต่มันทำให้เบราว์เซอร์แสดงแถบเลื่อนแนวนอนเนื่องจากความกว้างคือ 4000px วิธีแก้ปัญหาเพื่อรักษาองค์ประกอบเทียมภายในความกว้างของวิวพอร์ตคืออะไร
Aaron Hudon

แน่นอนคุณจะต้องตั้งร่างกายหรือหน้าตัด div overflow-x: hiddenไป
Seika85

1

การเพิ่มโซลูชันของ Nils Kaspersson ฉันกำลังแก้ไขความกว้างของแถบเลื่อนแนวตั้งเช่นกัน ฉันใช้16pxเป็นตัวอย่างซึ่งถูกลบออกจากความกว้างของพอร์ตการดู วิธีนี้จะหลีกเลี่ยงแถบเลื่อนแนวนอนไม่ให้ปรากฏ

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

1
ฉันเชื่อว่าสิ่ง16pxที่คุณต้องลบออกเพราะมันทำให้แถบเลื่อนแนวนอนเป็นค่าเริ่มต้น / ระยะห่างของเบราว์เซอร์แทนที่จะลบมันแค่ใช้มันhtml, body{ margin:0; padding:0 }ดังนั้นคุณไม่จำเป็นต้องคำนวณเพิ่มสำหรับ16px
Mi-Creativity

นี่คือเมื่อเนื้อหาของหน้ายาวและต่ำลงไปครึ่งหน้าบนและแถบเลื่อนจะปรากฏขึ้นโดยอัตโนมัติ แน่นอนว่าเมื่อเนื้อหาอยู่ในช่วงครึ่งหน้าสิ่งนี้ไม่จำเป็น ฉันเพิ่ม 16px ลงในสูตรเฉพาะเมื่อฉันรู้ว่าเนื้อหาของหน้ากำลังจะยาวและแถบเลื่อนจะปรากฏขึ้นอย่างแน่นอน
A-Zone

ฉันคิดว่ามันจะไม่ทำงานบนมือถือ มือถือไม่มีแถบเลื่อน
hjchin

1

สมมติว่าพาเรนต์มีความกว้างคงที่เช่น#page { width: 1000px; }และอยู่กึ่งกลาง#page { margin: auto; }คุณต้องการให้เด็กพอดีกับความกว้างของวิวพอร์ตเบราว์เซอร์ที่คุณสามารถทำได้:

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

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

1

หากต้องการทำให้ div เด็กเป็นเนื้อหาให้ลอง:

.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;
}

ฉลาด แต่ดูเหมือนจะไม่ทำงาน (ด้วยช่วงเวลาที่ฝังอยู่ภายใน li เป็นอย่างน้อย)
ruffin

0

ฉันรู้ว่านี่เก่า แต่สำหรับใครที่มาที่นี่เพื่อรับคำตอบคุณจะต้องทำเช่นนั้น:

ล้นที่ซ่อนอยู่ในองค์ประกอบที่มีองค์ประกอบหลักเช่นร่างกาย

ให้องค์ประกอบลูกของคุณมีความกว้างมากกว่าหน้าเว็บของคุณและวางตำแหน่งไว้ที่ -100%

นี่เป็นตัวอย่าง:

body {
  overflow:hidden;
}

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

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

นอกจากนี้ยังมีซอ Fiddle: http://jsfiddle.net/v2Tja/288/


0

จากนั้นวิธีการแก้ปัญหาจะเป็นดังต่อไปนี้

HTML

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

CSS

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

ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
R Balasubramanian

0

ฉันลองวิธีแก้ปัญหาของคุณแล้ว อันนี้ :

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

ดีที่สุดเนื่องจากเราไม่ต้องการ css พิเศษสำหรับหน้าจอขนาดเล็ก ฉันสร้าง codePen เพื่อแสดงผลลัพธ์: ฉันใช้ div div ที่มีภาพพื้นหลังและ div div div ที่มีเนื้อหาภายใน

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.