Empêcher la barre de défilement de s'ajouter à la largeur de la page sur Chrome

J'ai un petit problème en essayant de garder mon .pages html à une largeur constante sur Chrome, Par exemple, j'ai une page (1) avec beaucoup de contenu qui déborde de la fenêtre (bon mot?) hauteur, donc il y a une barre de défilement verticale sur cette page (1). Sur la page (2) j'ai la même mise en page (menus, vrd,...etc) mais moins de contenu, donc pas de barres de défilement verticales là-dedans.

Le problème est que sur la page (1), les barres de défilement semblent pousser légèrement les éléments vers la gauche (en ajoutant à la largeur?) alors tout semble bien centré sur la page (2)

Je suis toujours un débutant sur HTML / CSS / JS, et je suis assez convaincu que ce n'est pas si difficile, mais je n'ai pas eu de chance de trouver la solution. Cela fonctionne comme prévu sur IE10, et FireFox (barres de défilement non interférentes), Je ne l'ai rencontré que sur Chrome.

87
demandé sur Benjamin 2013-08-31 17:03:55

10 réponses

Vous pouvez obtenir la taille de la barre de défilement, puis appliquer une marge au conteneur.

Quelque Chose comme ceci:

var checkScrollBars = function(){
    var b = $('body');
    var normalw = 0;
    var scrollw = 0;
    if(b.prop('scrollHeight')>b.height()){
        normalw = window.innerWidth;
        scrollw = normalw - b.width();
        $('#container').css({marginRight:'-'+scrollw+'px'});
    }
}

CSS pour supprimer la barre de défilement h:

body{
    overflow-x:hidden;
}

Essayez de jeter un oeil à ceci: http://jsfiddle.net/NQAzt/

29
répondu Lwyrn 2013-09-02 18:28:31

Vieux fil mais toujours pertinent!

Cela ne fonctionne que sur les navigateurs WebKit, mais je l'aime beaucoup. Se comportera comme auto sur les autres navigateurs.

.yourContent{
   overflow-y: overlay;
}

Cela fera apparaître la barre de défilement uniquement comme une superposition , n'affectant ainsi pas la largeur de votre élément!

56
répondu simonDos 2018-05-16 19:08:22

Tout ce que vous devez faire est d'ajouter:

html {
    overflow-y: scroll;
}

Dans votre fichier css car cela aura le scroller si c'est nécessaire ou non, bien que vous ne puissiez pas faire défiler

Cela signifie que la fenêtre aura la même largeur pour les deux

52
répondu Hive7 2013-08-31 13:07:58

Les navigateurs Webkit comme Safari et Chrome soustraient la largeur de la barre de défilement de la largeur de la page visible lors du calcul de la largeur: 100% ou 100vw. Plus à DM Rutherford défilement et la largeur de la Page .

Essayez d'utiliser overflow-y: overlay à la place.

19
répondu Kyle Dumovic 2017-01-09 06:47:50

J'ai trouvé que je pouvais ajouter

::-webkit-scrollbar { 
display: none; 
}

Directement à mon css et cela rendrait la barre de défilement invisible, mais me permettrait toujours de faire défiler (sur Chrome au moins). Bon pour quand vous ne voulez pas une barre de défilement distrayante sur votre page!

11
répondu fuzzy_logic_77 2015-08-29 08:31:06

Probablement

html {
    width: 100vw;
}

Est exactement ce que vous voulez.

7
répondu TranslucentCloud 2017-05-16 11:32:40

Il ne semble pas que mon autre réponse fonctionne tout à fait correctement pour le moment (mais je vais continuer à essayer de la rendre opérationnelle).

Mais fondamentalement, ce que vous devrez faire, et ce qu'il essayait de faire dynamiquement, est de définir la largeur du contenu à un peu moins que celle du volet parent, défilant.
De sorte que lorsque la barre de défilement apparaît, elle n'a aucun effet sur le contenu.

Cet exemple montre une façon plus hacky d'atteindre cet objectif, en codant en dur width s au lieu d'essayer de obtenez le navigateur pour le faire pour nous, via padding.
Si cela est possible, c'est la solution la plus simple si vous ne voulez pas d'une barre de défilement permanente.

2
répondu Hashbrown 2013-08-31 14:13:02

EDIT: cette réponse n'est pas tout à fait juste pour le moment, reportez-vous à mon autre réponse pour voir ce que j'essayais de faire ici. J'essaie de le réparer, mais si vous pouvez offrir de l'aide dans les commentaires, merci!

Utiliser padding-right permettra d'atténuer l'apparition soudaine d'une barre de défilement

EXEMPLE

Chrome devtools montrant rembourrage insensible

Comme vous pouvez le voir sur les points, le texte arrive au même point dans la page avant d'envelopper, que ce soit ou non un barre de défilement est présent.
En effet, lorsqu'une barre de défilement est introduite, le rembourrage se cache derrière, de sorte que la barre de défilement ne pousse pas sur le texte!

1
répondu Hashbrown 2013-08-31 14:16:19
.modal-dialog {
   position: absolute;
   left: calc(50vw - 300px);
}

Où 300 px est la moitié de la largeur de ma fenêtre de dialogue.

C'est en fait la seule chose qui a fonctionné pour moi.

0
répondu Piotr Siatkowski 2017-08-14 11:05:09

Pour les conteneurs avec une largeur fixe, une solution cross browser CSS pure peut être réalisée en enveloppant le conteneur dans un autre div et en appliquant la même largeur aux deux div.

#outer {
  overflow-y: auto;
  overflow-x: hidden;
  /*
   * width must be an absolute value otherwise the inner divs width must be set via
   * javascript to the computed width of the parent container
   */
  width: 200px;
}

#inner {
  width: inherit;
}

Cliquez ici pour voir un exemple sur la Codepen

0
répondu Robbendebiene 2018-04-08 11:20:02