Est-il possible de calculer la largeur du Viewport (vw) sans scrollbar?

Comme indiqué dans le titre, est-il possible de calculer l' vw sans les barres de défilement en css seulement?

Par exemple, mon écran a une largeur 1920px. vw retourne 1920px, très bien. Mais ma vraie largeur de corps est seulement quelque chose comme 1903px.

Est-il un moyen pour moi de récupérer le 1903px valeur avec css (pas seulement pour les enfants body), ou Ai-je absolument besoin de JavaScript pour cela?

27
demandé sur Gust van de Wal 2015-11-09 13:00:32

4 réponses

une façon de faire ceci est avec calc. Pour autant que je sache, 100% est la largeur y compris les barres de défilement. Donc, si vous n':

body {
  width: calc(100vw - (100vw - 100%));
}

vous obtenez le 100vw moins la largeur de la barre de défilement.

vous pouvez le faire avec la hauteur aussi, si vous voulez un carré qui est de 50% du viewport par exemple (moins 50% de la largeur du scollbar)

.box {
  width: calc(50vw - ((100vw - 100%)/2))
  height: 0
  padding-bottom: calc(50vw - ((100vw - 100%)/2))
}  
44
répondu Mattias Ottosson 2016-01-19 19:02:40

vw unité ne prend pas en l' overflow-y scrollbar en compte quand overflow-y est réglé sur auto.

Modifier overflow-y: scroll; et vw l'unité sera le viewport sans la barre de défilement.

Seul inconvénient à prendre en compte. Si le contenu s'adapte à l'écran, la barre de défilement est affichée de toute façon. La solution Possible est de passer de autoscroll en javascript.

2
répondu Ilario Engler 2018-02-07 10:26:04

Selon spécifications, les unités de longueur relative de viewport ne tiennent pas compte des barres de défilement (et, en fait, supposent qu'elles n'existent pas).

donc quel que soit votre comportement prévu, vous ne pouvez pas prendre en compte scrollbars lors de l'utilisation de ces unités.

1
répondu Madara Uchiha 2015-11-09 10:06:23

les navigateurs Webkit excluent les barres de défilement, d'autres les incluent dans la largeur retournée. Cela peut bien sûr conduire à des problèmes: par exemple, si vous avez un contenu généré dinamically avec ajax qui ajoute de la hauteur dinammically, Safari pourrait passer d'une mise en page à une autre lors de la visualisation de la page... Ok, ça n'arrive pas souvent, mais c'est quelque chose à connaître. Sur mobile, moins de problèmes, provoquer des barres de défilement ne sont généralement pas montrés.

Cela dit, si votre problème est de calculer exactement la fenêtre d'affichage de la largeur sans les barres de défilement dans tous les navigateurs, pour autant que je sais, une bonne méthode est ceci:

   width = $('body').innerWidth();

ayant précédemment défini:

body {
    margin:0;
  }
1
répondu holden 2015-11-09 11:28:14