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.