Üst div'e göre "Konum: sabit" div genişliğini ayarlayın


137

% 100 genişliğinde bir div (konum: sabit) vermeye çalışıyorum (üst div ile ilgili olarak). Ama bazı sorunlarım var ...

DÜZENLEME: İlk sorun kalıtım kullanılarak çözülür, ancak yine de çalışmaz. Sanırım sorun,% 100 / devralma genişliğini alan birden çok div kullanıyorum. İkinci sorunu jsfiddle güncellemesinde bulabilirsiniz: http://jsfiddle.net/4bGqF/7/

Fox örneği

#container {
    width: 800px;
}

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

ve html

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

Veya deneyebilirsiniz: http://jsfiddle.net/4bGqF/

Sorun, sabit öğenin her zaman pencere / belgenin genişliğini alması gibi görünüyor . Bunun nasıl düzeltileceğini bilen var mı?

Sabit öğeme sabit bir öğe veremiyorum çünkü jScrollPane eklentisini kullanıyorum. Kaydırma çubuğunun olup olmadığı içeriğe bağlıdır.

Çok teşekkürler!

Not: 2 div'in metni birbirinin üstündedir. Bu sadece bir örnek, bu yüzden gerçekten önemli değil.


aşağıda içine bazı ek fikir veriyor benim cevap bakınız inheritkullanarak nasıl max-width:inheritsahip width:inheritkonteyner / içeriyordu oranı ne aynı süre tutar hala duyarlı ve yönetilebilir olma
aequalsb

Yanıtlar:


120

İkinci sorunun ne olduğundan emin değilim (düzenlemenize bağlı olarak), ancak width:inherittüm iç divlere uygularsanız , işe yarar : http://jsfiddle.net/4bGqF/9/

Desteklemeniz gereken ve desteklemeyen tarayıcılar için bir javascript çözümüne bakmak isteyebilirsiniz. width:inherit


4
Fevkalade basit bir çözüm için +1, ancak width: inheritaklıma gelen ilk şey olmasa da
Bojangles

7
Bu ne büyücü ?! +1
Nicu Surdu

7
#Container width = 100px olan bir div içinde #container width% 50 ise (bu durumda konteyner genişliği 50px olur ve sabit genişlik tarayıcı genişliğinin% 50'si olur) bunu nasıl çözeceğiniz hakkında bir fikriniz var mı?
Kek

113
Ebeveynin genişliğini devralma hilesi yalnızca ebeveynin piksel cinsinden ayarlanmış bir genişliğe sahip olması durumunda çalışır.
jahu

33
Bu oldukça kötü bir cevap ... Temelde sabit değerler ayarlamakla eşdeğer, ki bu hiç de pek kullanışlı değil.
Jay

33

Birçok kişinin yorumladığı gibi, duyarlı tasarım çoğu zaman genişliği% olarak belirler

width:inherithesaplanan genişliği DEĞİL CSS genişliğini miras alacak - Bu, alt kapsayıcının devraldığı anlamına gelirwidth:100%

Ancak sanırım, neredeyse çoğu zaman duyarlı tasarım setleri max-width, bu nedenle:

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

Bu, yapışkan bir menünün "takılı kaldığında" orijinal ana genişliğe sınırlandırılması sorunumu çözmek için çok tatmin edici bir şekilde çalıştı

width:100%Görüntü alanı maksimum genişlikten küçükse, hem üst hem de alt öğe buna uyacaktır . Aynı şekilde, her ikisi max-width:800pxde görüntü alanı daha geniş olduğunda uygun olacaktır .

Zaten yanıt veren temamla, sabit alt öğeyi de değiştirmek zorunda kalmadan ana kapsayıcıyı değiştirebileceğim bir şekilde çalışır - zarif ve esnek

ps: Ben şahsen IE6 / 7'nin kullanmamasının önemli olmadığını düşünüyorum inherit


Mükemmel cevap! Benim durumumda, bir min-width: inheritnumara eklemek hile yaptı.
Bruno Monteiro

Bu, piksel ve yüzde olarak tanımlanan genişliklere sahip üst öğeler için çalışır. Benim görüşüme göre doğru cevap olmalı.
Mikel

24

sabit konum biraz aldatıcıdır (gerçekten imkansızdır), ancak konum: yapışkan hileyi güzel bir şekilde yapıyor:

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

codepen örneğine bakın


11

Bunu jQuery ile de çözebilirsiniz:

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

Bu bana çok yardımcı oldu çünkü düzenim duyarlıydı ve inheritçözüm benimle çalışmıyordu!


1
kötü cevap, eğer pencereyi yeniden boyutlandırırsanız bu kırılır.
Jay

2
Gerçekten bir window.onresize olay işleyicisi olmalıdır.
twistedpixel

Bunu yapmanın yolu budur. Bir setWidth () işlevine sarılabilir, ardından onu "yükle" ve "yeniden boyutlandır" pencere olay dinleyicilerinde
çağırabilir

Bu benim için iyi çalıştı! Ebeveynin genişlik:% 25 olduğu bir sorunla karşılaştım, yani genişlik: miras her çocuk genişliğini yaptı:% 25.
Troy Riemer

10

Bu CSS'yi kullanın:

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

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

#Fixed öğe, ebeveyn genişliğini devralacak, bu nedenle% 100 olacak.


1
IE6-7 dışında desteklemiyor inherit. Mattesr olup olmadığından emin değilim.
Thomas Shields

Çok teşekkürler. Örnekte denediğimde çalışıyor ama kodumda değil ... Neyse, burada sorduğum sorunun cevabı. Muhtemelen işe yaramamasının başka bir nedeni vardır ... Ama yine de, teşekkürler!
Dnns

6

Sabit konumlandırmanın her şeyi görüntü alanına göre tanımlaması gerekir, bu yüzden position:fixedher zaman bunu yapacaktır. position:relativeBunun yerine alt div üzerinde kullanmayı deneyin . (Başka nedenlerden dolayı sabit konumlandırmaya ihtiyacınız olabileceğini biliyorum, ancak öyleyse - genişliği JS olmadan ebeveyniyle eşleştiremezsiniz. inherit)


1
@Downvoter - açıklar mısınız lütfen? Olumsuz oyla ilgili bir sorunum yok ama gelecekte yanıtlarımı iyileştirebilmek için nedenini bilmek isterim.
Thomas Shields

1
Açıklamanız iyi, ancak "genişliği JS olmadan ebeveyniyle eşleştiremezsiniz" dediniz. Bazı durumlarda mümkün olsa da (kalıtım kullanarak).
Dnns

Oo elbette. IE'yi çok hedeflediğim için kalıtımı unutmuştum ve sadece IE9 + bunu destekliyor.
Thomas Shields

1
Microsoft bile IE'nin ortadan kaybolmasını istiyor - bu orijinal gönderinin kaç yaşında olduğu düşünüldüğünde, IE sorununun tartışmalı olduğunu söylemenin güvenli olduğunu düşünüyorum. IE'yi desteklememenizi şiddetle tavsiye ediyorsanız, özellikle bu tür bir destek için ve saat başı fatura kesiyorsanız!
aequalsb

3

İşte büyük bir uygulamadaki bazı yeniden çizme sorunlarını düzeltirken karşılaştığımız küçük bir hack.

-webkit-transform: translateZ(0);Ebeveyn üzerinde kullanın . Elbette bu Chrome'a ​​özeldir.

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

-webkit-transform: translateZ(0);

2
Bu, genişlik sorununu düzeltir, ancak alt öğenin görüntü alanına göre sabitlenmesini önledi.
Vivek Maharajh

Olumsuz oy için özür dilerim, çünkü bu konumun amacını tamamen ortadan kaldırıyor: sabit.
trusktr

Soruyu okuduğunu sanmıyorum. Bir div'i "sabit" konumdaki bir ebeveyne nasıl "göreceli" yaparsınız diyor. BU ÇOK anti-sabit konumdur. Ve cevabım açıkça "hack" diyor. Sizi çözüme yaklaştırdığında amacı bozmaz.
Senica Gonzalez

1

Bunun için kolay bir çözüm var.

Üst div için sabit bir konum ve içerikler için bir maksimum genişlik kullandım.

Diğer kapsayıcılar hakkında çok fazla düşünmenize gerek yok çünkü yalnızca tarayıcı penceresine göre sabit konum.

       .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

Bu çözüm aşağıdaki kriterleri karşılar

  1. Yüzde genişliğine ebeveynde izin verilir
  2. Pencere yeniden boyutlandırıldıktan sonra çalışır
  3. Başlığın altındaki içeriğe asla erişilemez

Bildiğim kadarıyla bu kriterler Javascript olmadan karşılanamaz (maalesef).

Bu çözüm jQuery kullanır, ancak kolaylıkla vanilla JS'ye dönüştürülebilir:

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

Sabit eleman ve onun ana elemanı için aynı stili vermeniz gerekir. Bu örneklerden biri maksimum genişliklerde ve diğer örnekte dolgu ile oluşturulmuştur.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.