计算滚动条的宽度并在 calc() css 中使用结果

Bai*_*899 7 javascript css scroll scrollbar width

我想计算滚动条的宽度,以便在 CSScalc()声明中使用结果。

目前,我假设滚动条的宽度始终为17px,如下所示:

body { 
    width:calc(100vw - 17px); 
}
.container { 
    max-width:calc(100vw - 17px); 
}
Run Code Online (Sandbox Code Playgroud)

问题是当您选择不同的浏览器缩放百分比时,滚动条的宽度会发生变化。所以我想使用计算结果来做一些事情:

body { 
    width:calc(100vw - CALCULATED SCROLL-BAR WIDTH); 
}
.container { 
    max-width:calc(100vw - CALCULATED SCROLL-BAR WIDTH); 
}
Run Code Online (Sandbox Code Playgroud)

编辑:我现在已经在这个问题的帮助下解决了这个问题

用于计算滚动条宽度的 JavaScript(不过,我发现您需要一个时间间隔才能使其自动更新):

function getScrollbarWidth() {
  var outer = document.createElement("div");
  outer.style.visibility = "hidden";
  outer.style.width = "100px";
  outer.style.msOverflowStyle = "scrollbar"; // needed for WinJS apps

  document.body.appendChild(outer);

  var widthNoScroll = outer.offsetWidth;
  // force scrollbars
  outer.style.overflow = "scroll";

  // add innerdiv
  var inner = document.createElement("div");
  inner.style.width = "100%";
  outer.appendChild(inner);        

  var widthWithScroll = inner.offsetWidth;

  // remove divs
  outer.parentNode.removeChild(outer);

  return widthNoScroll - widthWithScroll;
}
Run Code Online (Sandbox Code Playgroud)

我的代码(用于将函数的结果嵌入到 CSScalc()声明中)。

$('body').css({ 
  'width':'calc(100vw - ' + getScrollbarWidth() + 'px)' 
});

$('.container').css({ 
  'max-width':'calc(100vw - ' + getScrollbarWidth() + 'px)' 
});
Run Code Online (Sandbox Code Playgroud)

小智 12

实际上,您只需使用 css 和自定义属性(并且完全没有 javascript)即可获得滚动条宽度:

body {
    --scrollbar-width: calc(100vw - 100%);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在子元素中使用这个变量,如下所示:

.container { 
    max-width: calc(100vw - var(--scrollbar-width)); 
}
Run Code Online (Sandbox Code Playgroud)

这是因为 100vw 始终是视图的内部宽度,但主体的 100% 不包括滚动条。

  • 另请注意,如果“.container”与“body”宽度不同,则此方法将不起作用,因为“100%”是相对于使用“--scrollbar-width”变量的位置。 (9认同)
  • 应该注意的是,这仅在您的 body 元素有滚动条时才有效。 (2认同)

小智 10

扩展 jonas_jonas 的答案,它可以工作,但必须.container与主体具有相同的宽度。

如果情况并非如此,即使如此,您也可以使其与 vanilla JS 一起使用,定义一个 CSS 属性,如下所示

document.body.style.setProperty(
    "--scrollbar-width",
    `${window.innerWidth - document.body.clientWidth}px`
);
Run Code Online (Sandbox Code Playgroud)

然后你就可以在CSS中使用它了

.container { 
    max-width: calc(100vw - var(--scrollbar-width)); 
}
Run Code Online (Sandbox Code Playgroud)


Net*_*ous 2

为什么需要这么多代码来做到这一点?

使用纯 JavaScript 的简单方法是:

$('body').css({ 
  'width':'calc(100vw - ' + (window.innerWidth - document.body.clientWidth) + 'px)' 
});
Run Code Online (Sandbox Code Playgroud)