Prévenir 100vw de la création de défilement horizontale
Si un élément est défini à width: 100vw;
et il y a une barre de défilement verticale de la largeur de l'élément sera égal à la fenêtre d'affichage, plus la largeur de la barre de défilement.
Est-il possible de faire pour éviter cela?
Est-il possible d'éviter ce sans désactiver le défilement horizontal sur toute la page? Mis à part de changer mon css/balisage de faire de l'élément 100% de la largeur du corps je ne peux pas penser à quelque chose.
Testé en Version Chrome 43.0.2357.81 m & FF 36.0.1 & Opéra 20.0.1387.91 sur Windows 8.1
Voici le code demandé:
html
<div class="parent">
<div class="box"></div>
</div>
<div class="tall"></div>
css
body { margin: 0; }
html { box-sizing: border-box; }
*, *::before, *::after {
box-sizing: inherit;
position: relative;
}
.parent {
background: rgba(0, 0, 0, .4);
height: 100px;
width: 5rem;
margin-bottom: 25px;
}
.box {
position: absolute;
top: 0;
left: 0;
background: rgba(0, 0, 0, .4);
height: 50px;
width: 100vw;
}
.tall {
height: 100rem;
}
- Il pourrait y avoir de nombreuses raisons pour cela. Poster votre code.
- peut-être mettre les marges à 0 ?
- Vous avez essayé overflow: hidden?
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, la réponse est non, si vous avez une barre de défilement verticale il n'y a aucun moyen de faire 100vw égale à la largeur de la fenêtre d'affichage visible. Voici les solutions que j'ai trouvé pour ce problème.
avertissement: je n'ai pas testé ces solutions pour la prise en charge du navigateur
tl;dr
Si vous avez besoin d'un élément à 100% de la largeur de la fenêtre d'affichage visible(viewport moins la barre de défilement), vous aurez besoin de le mettre à 100% du corps. Vous ne pouvez pas le faire avec vw parts si il y a une barre de défilement verticale.
1. Définir tous les éléments ancêtres à la position statique de la
Si vous vous assurez que tous
.box
's ancêtres sont mis àposition: static;
puis définissez.box
àwidth: 100%;
de sorte qu'il sera de 100% du corps de la largeur. Ce n'est pas toujours possible. Parfois, vous avez besoin de l'un des ancêtres àposition: absolute;
ouposition: relative;
.Exemple
2. Déplacer l'élément en dehors de la non-statique ancêtres
Si vous ne pouvez pas définir l'ancêtre des éléments de
position: static;
vous aurez besoin de déplacer.box
en dehors d'eux. Cela vous permettra de définir l'élément à 100% de la largeur du corps.Exemple
3. Supprimer La Barre De Défilement Verticale
Si vous n'avez pas besoin de défilement verticale, vous pouvez simplement supprimer la barre de défilement verticale par le réglage de la
<html>
élément deoverflow-y: hidden;
.Exemple
4. Supprimer La Barre De Défilement Horizontal
Cela ne résout pas le problème, mais peut être adapté à certaines situations.
Réglage de la
<html>
élément deoverflow-y: scroll; overflow-x: hidden;
permettra d'éviter la barre de défilement horizontale à partir d'apparaître, mais la 100vw élément ne permet encore de débordement.Exemple
Viewport Pourcentage Des Longueurs Spec
Il semble qu'il y a un bug parce que vw parts ne devraient inclure la largeur de la barre de défilement lorsque le dépassement est réglé sur auto sur l'élément racine. Mais j'ai essayé de réglage de l'élément racine
overflow: scroll;
et il n'a pas changé.Exemple
Je sais que c'est une vieille question, mais le bug existe toujours dans les navigateurs modernes. Je n'aimais pas l'idée de faire
overflow-x: hidden
c'est donc ce que j'ai fait. Un exemple complet est disponible ici: http://codepen.io/bassplayer7/pen/egZKpmMon approche a été de déterminer la largeur de la barre de défilement et de l'utilisation
calc()
pour réduire la100vw
par le montant de la barre de défilement. C'est un peu plus compliqué parce que dans mon cas, je tirais la largeur du contenu d'une boîte qui avait défini avec j'ai donc besoin de déclarer la marge.Quelques remarques sur le code ci-dessous: tout d'abord, j'ai remarqué que 20px semble être une assez large nombre magique pour les barres de défilement. J'utilise un SCSS variable (il n'a pas à être SCSS) et du code en dehors de
@supports
comme une solution de repli.Aussi, ce n'est pas garantie qu'il n'y aura jamais de barres de défilement. Puisqu'il nécessite l'activation de Javascript, les utilisateurs qui n'ont pas de qui pourront afficher les barres de défilement horizontale. Vous pourriez contourner que par la mise en
overflow-x: hidden
et à l'ajout d'une classe pour le remplacer lorsque le Javascript s'exécute.Code Complet:
Puis ce Javascript va définir le CSS Personnalisé Propriété:
Comme une note de côté, les utilisateurs de Mac pouvez tester cela en allant dans les Préférences Système -> Général> Afficher les Barres de Défilement = Toujours
Les rembourrages et les frontières peuvent interférer. Donc peut de marge. Utilisation box-sizing pour calculer la largeur, y compris ces attributs. Et peut-être retirer de la marge (le cas échéant) à partir de la largeur.
Il semble que vous avez à ajouter
max-width: 100%;
si il y a une redistribution qui est à l'origine de la barre de défilement apparaissent après la première fenêtre d'affichage le calcul de la largeur. Cela ne semble pas se produire dans les navigateurs sans interférer barre de défilement (iOS, OS X, c'est à dire 11 de Métro), mais peut affecter tous les autres navigateurs..parent { width: 30rem; }
ou labody
's de la marge dirait qu'il pourrait être le coupable ici.position: relative;
de.parent
? Est quelque chose qui vous empêchera d'utiliserposition: fixed;
sur.box
?position: static
, cela signifie simplement beaucoup plus de travail tout à la mise en page correctement, et, éventuellement, d'avoir à changer les balises. Qui est ce qui a incité la question. Non,.box
ne peut être fixé.vw
est calculée une fois mais pas re-calculée une fois les barres de défilement apparaissent. Selon l'w3.org lien déjà posté cette re-calcul de passe "Toutefois, lorsque la valeur de "débordement" sur l'élément racine est "auto", les barres de défilement sont censés ne pas exister.". C', l'OMI est l'une des faiblesses avec l'vw
unité, il devrait être re-calculé (mais je suppose que il y a une bonne raison pour qu'il fonctionne de la manière qu'il le fait). Mayhaps cela peut aider stackoverflow.com/questions/986937/...?-moz-box-sizing
et-moz-calc
est inutile; Firefox abandonné le préfixe il y a longtemps. Barre de défilement est toujours 17px large/haut à travers tous les navigateurs de bureau, si l'on est présent.J'ai aussi été aux prises avec cela, et j'ai aussi pensé à CSS variables comme la solution. CSS variables ne sont pas prises en charge dans IE11 bien donc j'ai essayé autre chose:
Je l'ai fixée par le calcul de la largeur de la barre de défilement: soustraction de la largeur de la
body
(pas y compris la barre de défilement) à partir de la largeur de lawindow
(y compris la barre de défilement). Je l'utilise pour l'ajouter à l'100% du corps, voirplusScrollBar
variable.JS:
CSS:
Pourquoi je l'aime: il prend en considération que toutes les barres de défilement sont de la même largeur ou considérée comme conservée de l'espace à tous. 🙂
Voici ma solution pour le problème de 100vw l'ajout d'une barre de défilement horizontale:
Un élément avec
width: 100vw
seules causes des barres de défilement horizontale lorsque l'un des parents a un remplissage horizontal. Sinon il doit s'intègrent bien.Vérifier ce violon: http://jsfiddle.net/1jh1cybc/ La
.parent2
a une marge, ce qui provoque l'intérieur.box
de sortir de c'est parent de largeur.Edit:
Dans votre cas, je suppose que votre
body
a une marge. Vérifiez ce violon avec votre code et essayer de l'enlever le corps de la règle css: http://jsfiddle.net/1jh1cybc/1/html { overflow: scroll; }
et ça ne change rien.Voici ce que je fais:
}
Je fixe sur mon site en ajoutant des body{overflow-x:hidden} à la page en question.
Fonctionne sur votre exemple.
Bien. Je sais je suis en retard.
Mais voici la Solution que j'utilise sur toutes mes pages où j'ai besoin de 100vw:
Ne pas afficher les Barres de défilement verticales.
De retirer les barres de défilement ressemble de manière à mieux de toute façon. Au moins à mon Avis.
Voici ce que vous devez faire:
Voila