应用 vw 所产生的难题

lxf2023-05-11 00:47:16

应用 vw 所产生的难题

现阶段区块链总宽是 1500px,为垂直居中合理布局,需要给区块链加一张布满全部屏幕宽度的背景图。表明:该网页是架构根据 mdx 文档产生的,故不能将 banner 原素总宽直设为整屏 一般来说,大家能让img相对定位就可以实现实际效果,编码如下所示。

<div class="parent">
  <img class="img-bg" />
  <div>...</div>
</div>
.parent {
    position: relative;
}
.img-bg {
    position: absolute;
    left: calc(50% - 50vw);
    top: 0;
    width: 100vw;
    height: 100%;
}

但是,一旦当前页出现纵向下拉列表,你就会发现同时还会多一个横着下拉列表,这是从哪里来的呢? 应用 vw 所产生的难题

vw

标准中大家可以看到这一段叙述,换句话说下拉列表一般不会危害 vw 企业计算出来的,其自始至终都是基于视口总宽计算出来的,有没有下拉列表 vw 总宽一致,但是内部结构原素是要被下拉列表压缩空间的!其实就是设定img宽为100vw的时候是超出具体内容宽度,这就是发生水准下拉列表的主要原因。

The viewport-percentage lengths are relative to the size of the initial containing block. When the height or width of the initial containing block is changed, they are scaled accordingly. However, any scrollbars are assumed not to exist.

问题解决

  • 最先当前页是否存在下拉列表是不确定性的,无论是否有下拉列表都要适配展现,可是下拉列表会影响到 vw 企业,大家在预估宽度和 left 的时候是需要把下拉列表考虑在内的
  • 换句话说,我们应该了解当前页是否具备下拉列表,再对于二种情景做解决。一般情况下,应用document.body.scrollHeight > window.innerHeight就可以确定。但在 IE7,IE8 中 window.innerHeightunderfined,因此为了兼容 IE7、IE8,需要用到 document.documentElement.clientHeight 特性测算对话框相对高度。
const hasScrollbar = () => {
  return (
    document.body.scrollHeight >
    (window.innerHeight || document.documentElement.clientHeight)
  );
};
  • 毕竟不同电脑浏览器滚动条宽度是不一样的(例如在 macOS 上下拉列表其实就是飘浮在页面中的,并不是占有室内空间),因此还需要算出下拉列表宽度,能够建立临时性原素进行计算:
const getScrollbarWidth = () => {
  const container = document.createElement("div");
  document.body.appendChild(container);
  container.style.overflow = "scroll";
  const inner = document.createElement("div");
  container.appendChild(inner);
  const width = container.offsetWidth - inner.offsetWidth;
  document.body.removeChild(container);

  return width;
};
  • 大家可以在网页页面复位时实行一下这俩函数公式,并保存在state中,原素款式依据下拉列表状况做适配就可以。延迟 500ms 是为了给页面元素尽可能加载完成。
const [isHaveScrollbar, setIsHaveScrollbar] = useState(false);
const [scrollbarWidth, setScrollbarWidth] = useState(15);

React.useEffect(() => {
  setTimeout(() => {
    setIsHaveScrollbar(hasScrollbar());
    setScrollbarWidth(getScrollbarWidth());
  }, 500);
}, []);

<div
  style={{
    width: isHaveScrollbar
      ? `calc(100vw - ${scrollbarWidth}px)`
      : "100vw",
    left: isHaveScrollbar
      ? `calc(50% - 50vw   ${scrollbarWidth / 2}px)`
      : "calc(50% - 50vw)",
  }}
>...</div>

汇总

到此,大家适配了不一样系统软件,不一样电脑浏览器,是否存在下拉列表的现象,应用 vw 再也不会造成布局问题了。之上是一个粗略地解决方案,但是对于我现阶段的使用场景就足够了。

  • 实际上大家可以在测算滚动条宽度后把它设为 css 自变量,只需在 layout 中实行一次即可,便捷各个地方应用。
  • 次之,延迟 500ms 实行在某些特殊场景中并不可靠,例如页面上有不明相对高度的照片原素,并且在 500ms 内未加载完成,那样也会导致是否存在下拉列表的分析结论有误,这样的情况下我们能监视图形的载入,所有图片加载结束后再度实行判断函数,以确保情况恰当。
本站是一个以CSS、JavaScript、Vue、HTML为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!