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

o8x7eapl  于 2023-03-24  发布在  其他
关注(0)|答案(4)|浏览(201)

我想计算滚动条的宽度,以便在CSS calc()声明中使用结果。
目前,我假设滚动条的宽度总是17px,如下所示:

body { 
    width:calc(100vw - 17px); 
}
.container { 
    max-width:calc(100vw - 17px); 
}

这样做的问题是,当你选择不同的浏览器缩放%时,滚动条的宽度会改变。所以我想使用计算的结果来做一些事情:

body { 
    width:calc(100vw - CALCULATED SCROLL-BAR WIDTH); 
}
.container { 
    max-width:calc(100vw - CALCULATED SCROLL-BAR WIDTH); 
}

**编辑:**我现在已经解决了这个问题的帮助下,这个question
用于计算滚动条宽度的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;
}

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

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

$('.container').css({ 
  'max-width':'calc(100vw - ' + getScrollbarWidth() + 'px)' 
});
5gfr0r5j

5gfr0r5j1#

实际上,你可以通过css和自定义属性来获得滚动条的宽度(完全不需要javascript):

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

然后你可以像这样在子元素中使用这个变量:

.container { 
    max-width: calc(100vw - var(--scrollbar-width)); 
}

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

zfycwa2u

zfycwa2u2#

扩展jonas_jonas的答案,它可以工作,但如果.container必须与主体具有相同的宽度。
如果不是这样的话,即使如此,您也可以使用vanilla JS,像这样定义一个CSS属性

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

然后你可以在CSS中使用它

.container { 
    max-width: calc(100vw - var(--scrollbar-width)); 
}
w8rqjzmb

w8rqjzmb3#

为什么需要这么多代码来完成这些工作?
简单的方法与纯javascript它是:

$('body').css({ 
  'width':'calc(100vw - ' + (window.innerWidth - document.body.clientWidth) + 'px)' 
});
3yhwsihp

3yhwsihp4#

这可以通过在任何滚动区域上使用纯CSS的新容器查询来组织:

<div style="container-type: inline-size;">
    <div style="overflow-y: auto; height=300px;">
        <div style="padding-right: calc(40px - 100cqw + 100%)">
    </div>
</div>

相关问题