J'essaie de donner à un div (position: fixed) la largeur de 100% (par rapport à son div). Mais j'ai quelques problèmes ...
EDIT: Le premier problème est résolu en utilisant inherit, mais cela ne fonctionne toujours pas. Je pense que le problème est que j'utilise plusieurs divs prenant la largeur de 100%/inherit . Vous pouvez trouver le deuxième problème sur la mise à jour jsfiddle: http://jsfiddle.net/4bGqF/7/
Exemple Fox
#container {
width: 800px;
}
#fixed {
position: fixed;
width: 100%;
}
et le html
<div id="container">
<div id="fixed">Sitename</div>
<p>
blaat
</p>
</div>
Ou vous pouvez l'essayer: http://jsfiddle.net/4bGqF/
Le problème semble être que l'élément fixed prend toujours la largeur de la fenêtre/du document. Est-ce que quelqu'un sait comment résoudre ce problème?
Je ne peux pas donner de corrigé à mon élément fixe, car j'utilise le plugin jScrollPane. Cela dépend du contenu s'il y a une barre de défilement ou non.
Merci beaucoup!
PS: Le texte des 2 divs sont superposés. Ceci est juste un exemple, cela n'a donc pas d'importance.
Je ne suis pas sûr de savoir quel est le second problème (basé sur votre modification), mais si vous appliquez width:inherit
à tous les divs internes, cela fonctionne: http://jsfiddle.net/4bGqF/9/
Vous voudrez peut-être envisager une solution javascript pour les navigateurs que vous devez prendre en charge et qui ne supporte pas width:inherit
Comme de nombreuses personnes l’ont déjà fait remarquer, la conception réactive définit très souvent la largeur de%
width:inherit
héritera de la largeur CSS PAS de la largeur calculée - ce qui signifie que le conteneur enfant héritera de width:100%
Mais, je pense, presque aussi souvent que le design réactif définit max-width
aussi, donc:
#container {
width:100%;
max-width:800px;
}
#contained {
position:fixed;
width:inherit;
max-width:inherit;
}
Cela a fonctionné de manière très satisfaisante pour résoudre mon problème de faire en sorte qu'un menu collant soit restreint à la largeur du parent d'origine à chaque fois qu'il se bloquait.
Le parent et l'enfant adhéreront tous deux au width:100%
si la fenêtre est inférieure à la largeur maximale. De même, les deux vont adhérer au max-width:800px
lorsque la fenêtre est plus large.
Cela fonctionne avec mon thème déjà sensible de manière à ce que je puisse modifier le conteneur parent sans avoir à modifier également l'élément enfant fixe - élégant et flexible
ps: Je pense personnellement que peu importe que IE6/7 n’utilise pas inherit
Utilisez ce CSS:
#container {
width: 400px;
border: 1px solid red;
}
#fixed {
position: fixed;
width: inherit;
border: 1px solid green;
}
L'élément #fixed héritera de la largeur de son parent, il en sera donc à 100%.
Vous pouvez également le résoudre par jQuery:
var new_width = $('#container').width();
$('#fixed').width(new_width);
Cela m'a été très utile car ma mise en page était sensible et la solution inherit
ne fonctionnait pas avec moi!
Le positionnement fixe est censé tout définir par rapport à la fenêtre d'affichage, donc position:fixed
le fera toujours. Essayez plutôt d'utiliser position:relative
sur la div de l'enfant. (Je réalise que vous aurez peut-être besoin du positionnement fixe pour d'autres raisons, mais si c'est le cas, vous ne pouvez pas vraiment faire correspondre la largeur à son parent sans JS sans inherit
Voici le truc que j'ai utilisé.
Par exemple. J'ai eu ce code HTML:
<div class="head">
<div id="fx">123</div>
</div>
et pour que #fx
soit corrigé dans .head, la solution de contournement consiste à ajouter une div supplémentaire en tant que conteneur pour #fx
avec position: absolute de la manière suivante:
<div class="head">
<div class="area_for_fix">
<div id="fx">123</div>
</div>
</div>
Voici le CSS:
.head {
min-width:960px;
width:960px;
nax-width:1400px;
height:300px;
border: 1px solid #000;
position:relative;
margin:0 auto;
margin-top:50px;
padding:20px;
text-align:right;
height:1500px;
}
.area_for_fix {
position:absolute;
right:0;
width:150px;
height:200px;
background-color:red;
}
#fx {
width:150px;
height:75px;
background-color:#ccc;
position:fixed;
}
Important : pour ne pas définir top
et left
pour #fx
, définissez ces attributs sur .area_for_fix
.
Voici un petit bidouillage que nous avons rencontré lors de la résolution de certains problèmes de retrait sur une application volumineuse.
Utilisez -webkit-transform: translateZ(0);
sur le parent. Bien sûr, cela est spécifique à Chrome.
http://jsfiddle.net/senica/bCQEa/
-webkit-transform: translateZ(0);
position fixe est un peu délicat (voire impossible), mais position: collant fait le tour magnifiquement:
<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;
}
Cette solution répond aux critères suivants
Autant que je sache, ces critères ne peuvent pas être satisfaits sans Javascript (malheureusement).
Cette solution utilise jQuery, mais pourrait également être facilement convertie en 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>
Il existe une solution facile pour cela.
J'ai utilisé une position fixe pour parent div et une max-width pour le contenu.
Vous n'avez pas besoin de trop penser aux autres conteneurs, car la position fixe est uniquement relative à la fenêtre du navigateur.
.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>