Ustaw stały element div na 100% szerokości kontenera nadrzędnego


83

Mam otokę z pewnym dopełnieniem, a następnie mam pływający względny element div z procentową szerokością (40%).

Wewnątrz pływającego względnego elementu div mam stały element div, który chciałbym mieć taki sam rozmiar jak jego element nadrzędny. Rozumiem, że ustalony element div jest usuwany z przepływu dokumentu i jako taki ignoruje dopełnienie opakowania.

HTML

<div id="wrapper">
  <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
  </div>
</div>

CSS

body { 
  height: 20000px 
}  
#wrapper {
  padding: 10%;
}  
#wrap { 
  float: left;
  position: relative;
  width: 40%; 
  background: #ccc; 
} 
#fixed { 
  position: fixed;
  width: inherit;
  padding: 0px;
  height: 10px;
  background-color: #333;
}

Oto obowiązkowe skrzypce: http://jsfiddle.net/C93mk/489/

Czy ktoś wie, jak to osiągnąć?

Poprawiłem skrzypce, aby pokazać więcej szczegółów na temat tego, co próbuję osiągnąć, przepraszam za zamieszanie: http://jsfiddle.net/EVYRE/4/

Odpowiedzi:


41

Możesz użyć marginesu dla kontenera .wrap zamiast dopełnienia dla .wrapper:

body{ height:20000px }
#wrapper { padding: 0%; }
#wrap{ 
    float: left;
    position: relative;
    margin: 10%;
    width: 40%; 
    background:#ccc; 
}
#fixed{ 
    position:fixed;
    width:inherit;
    padding:0px; 
    height:10px;
    background-color:#333;    
}

jsfiddle


Zaktualizowałem moje skrzypce, aby lepiej wyjaśniać, co robię: jsfiddle.net/EVYRE/4
Jack Murdoch.

@JackMurdoch, jedyny sposób, w jaki znalazłem bez js, to użycie calcfor righti leftwłaściwości. Spójrz na jsfiddle
YD1m

To nie zadziała, jeśli opakowanie jest zmniejszone poniżej maksymalnej szerokości (w przykładzie 600px), ale uważam, że masz rację, nie można tego zrobić poza JavaScriptem. Dzięki za pomoc.
Jack Murdoch

5
to naprawdę nie działa, spójrz na to skrzypce jsfiddle.net/EVYRE/4 . Szerokość #sidebar byłaby odniesiona do jego rodzica (#sidebar_wrap), ale tak nie jest i przepełnia jego rodzica.
mlb

Myślę, że to działa tylko dlatego, że między stałym elementem a oknem jest tylko jeden element div. To nie zadziała, jeśli stały element jest zagnieżdżony wiele razy w elementach, które nie są w 100% szerokości okna
Jay

3

A co powiesz na to ?

$( document ).ready(function() {
    $('#fixed').width($('#wrap').width());
});

Używając jquery możesz ustawić dowolną szerokość :)

EDYCJA: Jak stwierdzono we śnie w komentarzach, używanie JQuery tylko dla tego efektu jest bezcelowe, a nawet nieproduktywne. Zrobiłem ten przykład dla osób, które używają JQuery do innych rzeczy na swoich stronach i rozważają użycie go również w tej części. Przepraszamy za wszelkie niedogodności spowodowane moją odpowiedzią.


"Wewnątrz pływającego elementu div mam stały element div, który chciałbym mieć taki sam rozmiar jak jego element nadrzędny" - Wewnątrz "#wrap" ma '#fixed', który lubi mieć ten sam rozmiar co element div '#wrap' (wysokość jest już ustawiona, więc jej nie zmieniłem). Proszę wyjaśnij mi, której części nie dostałem? A która część wyniku różni się od pozostałych odpowiedzi?
Hristo Valkanov

2
Hej kolego, bez obrazy. właściwie chodziło o udzielenie odpowiedzi w css, dla którego wprowadziłeś jQuery, co powinno być sugestią niż odpowiedzią.
dreamweiver

Wiem, że nawet przegłosowałem inne rozwiązanie z marginesami, ale nie rozumiem, dlaczego nikt nie może umieścić rozwiązania jQuery. Wyobraź sobie, że za 5-6 miesięcy ktoś znajdzie to pytanie przez Google i uzna, że ​​rozwiązanie jquery jest bardziej odpowiednie dla jego przypadku?
Hristo Valkanov

1
Zgadzam się, że twoje rozwiązanie jest idealne pod względem zakresu jQuery, ale nie w zwykłym CSS. kiedy nie używam Jquery lib, czy oczekujesz, że go użyję, ponieważ znalazłem proste rozwiązanie w jquery, takie jak zamieściłeś. plik Jquery lib ma spakowane 32 KB / 91,6 KB (tryb produkcyjny) / 252 KB ( tryb rozwoju). korzystanie z biblioteki jQuery jest naprawdę niewykonalne, jeśli nie jest to warte. jedna możliwa wada jQuery lub kluczowy punkt w zakresie wydajności na stronie
dreamweiver.

4
To się zepsuje, jeśli zmienisz rozmiar okna. Teraz musisz wykonać obliczenia na jednym rozmiarze, fajnie, brzmi drogo. nty
Jay

3

Spróbuj dodać transformację do rodzica (nie musi nic robić, może być zerowym tłumaczeniem) i ustaw stałą szerokość dziecka na 100%

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    position: relative;
    width: 40%; 
    background:#ccc; 
    transform: translate(0, 0);
}
#fixed{ 
    position:fixed;
    width:100%;
    padding:0px;
    height:10px;
    background-color:#333;
}
<div id="wrapper">
    <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
    </div>
</div>


1

Możesz użyć pozycjonowania bezwzględnego, aby przypiąć stopkę do podstawy nadrzędnego elementu DIV. Dodałem również 10px padding-bottom do zawijania (dopasuj wysokość stopki). Pozycjonowanie bezwzględne jest względne względem nadrzędnego elementu div, a nie poza przepływem, ponieważ nadałeś mu już atrybut względnej pozycji.

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    padding-bottom: 10px;
    position: relative;
    width: 40%; 
    background:#ccc; 
}
#fixed{ 
    position:absolute;
    width:100%;
    left: 0;
    bottom: 0;
    padding:0px;
    height:10px;
    background-color:#333;

}

http://jsfiddle.net/C93mk/497/


Próbowałem tego na początku, ale problem polega na tym, że podczas przewijania przesuwa się wraz z resztą elementów div, więc tak naprawdę nie jest to zachowanie ustalonego pozycjonowania
ThinkBonobo

1

man twój kontener ma 40% szerokości elementu nadrzędnego

ale kiedy używasz position: fixed, szerokość jest oparta na szerokości rzutni (dokumentu) ...

myśląc o tym, zdałem sobie sprawę, że twój element nadrzędny ma 10% wypełnienia (lewy i prawy), co oznacza, że ​​twój element ma 80% całkowitej szerokości strony. więc twój stały element musi mieć 40% na podstawie 80% całkowitej szerokości

więc wystarczy zmienić swoją #fixed klasę na

#fixed{ 
    position:fixed;
    width: calc(80% * 0.4);
    height:10px;
    background-color:#333;
}

jeśli używasz sass, postcss lub innego kompilatora css, możesz użyć zmiennych, aby uniknąć uszkodzenia układu podczas zmiany wartości dopełnienia elementu nadrzędnego.

tutaj jest zaktualizowane skrzypce http://jsfiddle.net/C93mk/2343/

mam nadzieję, że to pomoże, pozdrawiam


0

Oprócz ostatniego ostatniego jsfiddle przegapiłeś jedną rzecz:

#sidebar_wrap {
  width:40%;
  height:200px;
  background:green;
  float:right;
}
#sidebar {
  width:inherit;
  margin-top:10px;
  background-color:limegreen;
  position:fixed;
  max-width: 240px; /*This is you missed*/
}

Ale jak to rozwiąże Twój problem? Proste, najpierw wyjaśnijmy, dlaczego jest większe niż oczekiwano.

Element stały #sidebarużyje rozmiaru okna jako podstawy, aby uzyskać swój własny rozmiar, tak jak każdy inny stały element, gdy w tym elemencie zostanie zdefiniowany width:inheriti #sidebar_wrapma 40% jako wartość szerokości, to obliczywindow.width * 40% , kiedy szerokość twojego okna jest większa niż twoja .containerszerokość #sidebarbędzie większa niż #sidebar_wrap.

W ten sposób musisz ustawić maksymalną szerokość w swoim #sidebar_wrap , aby nie była większa niż #sidebar_wrap.

Sprawdź ten plik jsfiddle, który pokazuje działający kod i wyjaśnij lepiej, jak to działa.


-3

Usuń Padding: 10%;lub użyj piksela zamiast procentu dla.wrap

zobacz przykład: http://jsfiddle.net/C93mk/493/

HTML:

<div id="wrapper">
    <div id="wrap">
    Some relative item placed item
    <div id="fixed"></div>
    </div>
</div>

CSS:

body{ height:20000px }
#wrapper {padding:10%;}
#wrap{ 
    float: left;
    position: relative;
    width: 200px; 
    background:#ccc; 
}
#fixed{ 
    position:fixed;
    width:inherit;
    padding:0px;
    height:10px;
    background-color:#333;

}

potrzebuje, aby szerokość była procentem na #wrap. ale umieściłeś ustaloną z.
Achintha Samindika

To jest to samo, co ręczne ustawianie szerokości stałego elementu i wcale nie pomaga
Jay
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.