Tetapkan lebar div “Posisi: tetap” relatif terhadap div induk

137

Saya mencoba memberikan div (posisi: tetap) lebar 100% (terkait dengan div induknya). Tapi saya punya beberapa masalah ...

EDIT: Masalah pertama diatasi dengan menggunakan inherit, tetapi masih tidak berhasil. Saya pikir masalahnya adalah bahwa saya menggunakan beberapa div yang mengambil lebar 100% / inherit. Anda dapat menemukan masalah kedua pada pembaruan jsfiddle: http://jsfiddle.net/4bGqF/7/

Contoh rubah

#container {
    width: 800px;
}

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

dan html

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

Atau Anda dapat mencobanya: http://jsfiddle.net/4bGqF/

Masalahnya tampaknya bahwa elemen tetap selalu mengambil lebar jendela / dokumen . Adakah yang tahu bagaimana cara memperbaikinya?

Saya tidak bisa memperbaiki elemen saya, karena saya menggunakan plugin jScrollPane. Itu tergantung pada konten apakah ada scrollbar atau tidak.

Terima kasih banyak!

PS: Teks dari 2 divs berada di atas satu sama lain. Ini hanya contoh sehingga tidak terlalu penting.

Dnns
sumber
lihat jawaban saya di bawah ini yang menawarkan beberapa wawasan tambahan ke dalam inheritdan bagaimana menggunakan max-width:inheritdengan width:inheritmenjaga wadah / rasio yang sama tetap responsif dan mudah dikelola
aequalsb

Jawaban:

120

Saya tidak yakin tentang apa masalah kedua (berdasarkan edit Anda), tetapi jika Anda berlaku width:inherituntuk semua div dalam, itu berfungsi: http://jsfiddle.net/4bGqF/9/

Anda mungkin ingin melihat ke dalam solusi javascript untuk browser yang perlu Anda dukung dan yang tidak mendukung width:inherit

jeroen
sumber
4
+1 untuk solusi sederhana yang fantastis, meskipun width: inheritbukan hal pertama yang saya pikirkan
Bojangles
7
Sihir apa ini?! +1
Nicu Surdu
7
Adakah yang tahu bagaimana menyelesaikan ini jika lebar #container adalah 50% di dalam div dengan width = 100px (maka lebar kontainer akan menjadi 50px dan lebar tetap akan menjadi 50% dari lebar browser)?
Kek
113
Trik dengan mewarisi lebar induk hanya berfungsi jika induk memiliki lebar yang diatur dalam px.
jahu
33
Ini adalah jawaban yang sangat buruk ... Ini pada dasarnya setara dengan menetapkan nilai konstan, yang sama sekali tidak berguna.
Jay
33

Seperti yang dikomentari banyak orang, desain responsif sangat sering menetapkan lebar sebesar%

width:inheritakan mewarisi lebar CSS BUKAN lebar yang dihitung - Yang berarti wadah anak mewarisiwidth:100%

Tapi, saya pikir, desain set responsif hampir sering max-widthjuga, karena itu:

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

Ini bekerja dengan sangat memuaskan untuk memecahkan masalah saya membuat menu lengket dibatasi ke lebar induk asli setiap kali "macet"

Baik induk dan anak akan mematuhi width:100%jika viewport kurang dari lebar maksimum. Demikian juga, keduanya akan mematuhi max-width:800pxsaat viewport lebih luas.

Ini berfungsi dengan tema saya yang sudah responsif sehingga saya dapat mengubah wadah induk tanpa harus juga mengubah elemen anak tetap - elegan dan fleksibel

ps: Saya pribadi berpikir tidak masalah sedikit pun bahwa IE6 / 7 tidak digunakan inherit

aequalsb
sumber
Jawaban bagus! Dalam kasus saya, menambahkan min-width: inheritdo the trick.
Bruno Monteiro
Ini berfungsi untuk elemen induk dengan lebar yang didefinisikan sebagai px dan persentase. Seharusnya jawaban yang benar menurut saya.
Mikel
24

posisi tetap agak sulit (memang tidak mungkin), tetapi posisi: lengket melakukan trik dengan indah:

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

lihat sampel codepen

Multicam
sumber
11

Anda juga dapat menyelesaikannya dengan jQuery:

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

Ini sangat membantu saya karena tata letak saya responsif, dan inheritsolusinya tidak bekerja dengan saya!

Hakan Fikst
sumber
1
jawaban yang buruk, jika Anda mengubah ukuran jendela ini rusak.
Jay
2
Harus benar-benar memiliki window.onresize event handler.
twistedpixel
Ini cara yang harus dilakukan. Dapat dibungkus ke dalam fungsi setWidth (), lalu panggil di jendela acara "load" dan "resize"
woodz
Ini bekerja dengan baik untuk saya! Saya mengalami masalah di mana induknya lebar: 25%, jadi lebar: warisan membuat setiap lebar anak: 25%.
Troy Riemer
10

Gunakan CSS ini:

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

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

Elemen #fixed akan mewarisi lebar induknya, jadi itu akan menjadi 100% dari itu.

banrobert
sumber
1
kecuali IE6-7 tidak mendukung inherit. Tidak yakin apakah itu mattesr.
Thomas Shields
Terima kasih banyak. Ini berfungsi ketika saya mencobanya dalam contoh tetapi tidak dalam kode saya ... Pokoknya itu adalah jawaban untuk pertanyaan yang saya tanyakan di sini. Mungkin ada alasan lain mengapa itu tidak berhasil ... Tapi tetap saja, terima kasih!
DNn
6

Fixed positioning seharusnya mendefinisikan segala sesuatu yang berhubungan dengan viewport, jadi position:fixedakan selalu melakukan itu. Coba gunakan position:relativepada div anak sebagai gantinya. (Saya sadar Anda mungkin memerlukan penentuan posisi tetap karena alasan lain, tetapi jika demikian - Anda tidak dapat benar-benar membuat lebarnya sesuai dengan orang tua tanpa JS inherit).

Thomas Shields
sumber
1
@Downvoter - tolong jelaskan? Saya tidak punya masalah dengan downvote tetapi saya ingin tahu mengapa sehingga saya dapat meningkatkan jawaban saya di masa depan.
Thomas Shields
1
Penjelasan Anda baik-baik saja, namun Anda mengatakan "Anda tidak dapat benar-benar membuat lebar cocok dengan orang tua tanpa JS". Meskipun mungkin dalam beberapa kasus (dengan menggunakan warisan).
DNN
Oh tentu. Saya lupa tentang mewarisi karena saya menargetkan IE banyak dan hanya IE9 + yang mendukungnya.
Thomas Shields
1
bahkan Microsoft ingin IE menghilang - mengingat berapa lama postingan asli ini, saya pikir aman untuk mengatakan masalah IE sedang diperdebatkan. jika sangat menyarankan untuk tidak mendukung IE KECUALI Anda menagih khusus untuk dukungan tersebut - dan setiap jam!
aequalsb
3

Berikut adalah sedikit retasan yang kami temui sambil memperbaiki beberapa masalah redraw pada aplikasi besar.

Gunakan -webkit-transform: translateZ(0);pada orang tua. Tentu saja ini khusus untuk Chrome.

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

-webkit-transform: translateZ(0);
Senica Gonzalez
sumber
2
Ini memperbaiki masalah lebar, tetapi itu membuat anak tidak diperbaiki relatif terhadap viewport.
Vivek Maharajh
Maaf untuk downvote, karena ini benar-benar mengalahkan tujuan posisi: diperbaiki.
trusktr
Saya tidak berpikir Anda membaca pertanyaan itu. Dikatakan, bagaimana Anda membuat div "relatif" ke orang tua dengan posisi "tetap". BAHWA TERLALU adalah posisi anti-tetap. Dan tanggapan saya jelas mengatakan, "retas". Itu tidak mengalahkan tujuan ketika membuat Anda lebih dekat dengan solusi Anda.
Senica Gonzalez
1

Ada solusi mudah untuk ini.

Saya telah menggunakan posisi tetap untuk div induk dan max-width untuk isinya.

Anda tidak perlu terlalu memikirkan wadah lain karena posisi tetap hanya relatif terhadap jendela peramban.

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

Sab Devadasan
sumber
1

Solusi ini memenuhi kriteria berikut

  1. Lebar persentase diizinkan pada induk
  2. Bekerja setelah mengubah ukuran jendela
  3. Konten di bawah tajuk tidak pernah dapat diakses

Sejauh yang saya ketahui, kriteria ini tidak dapat dipenuhi tanpa Javascript (sayangnya).

Solusi ini menggunakan jQuery, tetapi juga dapat dengan mudah dikonversi ke 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>

Skeets
sumber
0

Anda perlu memberikan gaya yang sama dari elemen tetap dan elemen induknya. Salah satu contoh ini dibuat dengan lebar maks dan dalam contoh lainnya dengan bantalan.

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

Khachik
sumber