防止100vw创建水平滚动

Hal*_*ton 36 css scroll css3

如果元素设置为width: 100vw;并且存在垂直滚动条,则元素的宽度将等于视口加上滚动条的宽度.

有可能阻止这种情况吗?

是否可以在不禁用整个页面的水平滚动的情况下防止这种情况?除了改变我的css/markup以使元素100%的宽度,我无法想到任何东西.

在Windows 8.1上经过Chrome版本43.0.2357.81 m&FF 36.0.1和Opera 20.0.1387.91测试

这是所要求的代码:

HTML

<div class="parent">
    <div class="box"></div>
</div>
<div class="tall"></div>
Run Code Online (Sandbox Code Playgroud)

CSS

body { margin: 0; }
html { box-sizing: border-box; }
*, *::before, *::after {
    box-sizing: inherit;
    position: relative;
}
.parent {
    background: rgba(0, 0, 0, .4);
    height: 100px;
    width: 5rem;
    margin-bottom: 25px;
}

.box {
    position: absolute;
    top: 0;
    left: 0;
    background: rgba(0, 0, 0, .4);
    height: 50px;
    width: 100vw;
}

.tall {
    height: 100rem;
}
Run Code Online (Sandbox Code Playgroud)

Hal*_*ton 28

基本上答案是否定的,如果你有一个垂直滚动条,就无法使100vw等于可见视口的宽度.以下是我为此问题找到的解决方案.

警告: 我没有针对浏览器支持测试这些解决方案


TL;博士

如果您需要一个元素为可见视口的100%宽度(视口减去滚动条),则需要将其设置为正文的100%.如果有垂直滚动条,则无法使用vw单位执行此操作.


1.将所有祖先元素设置为静态位置

如果确保将所有.box的祖先设置为position: static;然后设置.boxwidth: 100%;,那么它将是身体宽度的100%.但这并不总是可行的.有时你需要一个祖先是position: absolute;position: relative;.

2.将元素移到非静态祖先之外

如果你不能设置祖先元素,position: static;你需要移出.box它们.这将允许您将元素设置为体宽的100%.

3.删除垂直滚动条

如果您不需要垂直滚动,可以通过将<html>元素设置为删除垂直滚动条overflow-y: hidden;.

4.删除水平滚动条 这不能解决问题,但可能适用于某些情况.

<html>元素设置为overflow-y: scroll; overflow-x: hidden;将阻止水平滚动条出现,但100vw元素仍将溢出.

视口 - 百分比长度规格

视口百分比长度相对于初始包含块的大小.当初始包含块的高度或宽度改变时,它们相应地缩放.但是,当根元素上的溢出值为auto时,假定不存在任何滚动条.请注意,初始包含块的大小受视口上滚动条的存在的影响.

似乎存在一个错误,因为当根元素上的溢出设置为auto时,vw单元应仅包含滚动条宽度.但我已经尝试将根元素设置为overflow: scroll;并且它没有改变.


小智 9

使用max-width属性 withwidth:100vw它解决了我的问题。

这是我用过的。

.full{
     height: 100vh;
     width: 100vw;
     max-width: 100%;
    }
Run Code Online (Sandbox Code Playgroud)

基本上它的作用是固定视口的最大宽度,从而消除水平滚动。

更多 @ https://www.w3schools.com/cssref/pr_dim_max-width.asp

max-width 属性定义元素的最大宽度。

如果内容大于最大宽度,则会自动改变元素的高度。

如果内容小于最大宽度,则 max-width 属性不起作用。

  • 对我有用。然而,“width: 100%”具有相同的效果。我看不出这有什么好处。我错过了什么吗? (5认同)

bas*_*er7 6

我知道这是一个老问题,但这个bug仍然存在于现代浏览器中.我不喜欢这样做的想法overflow-x: hidden这就是我所做的.这里有一个完整的例子:http://codepen.io/bassplayer7/pen/egZKpm

我的方法是确定滚动条的宽度,并用于calc()减少100vw滚动条的数量.这有点复杂,因为在我的情况下,我从一个已经定义的框中拉出内容的宽度,所以我也需要声明边距.

关于下面代码的一些注意事项:首先,我注意到20px似乎是滚动条的相当宽的幻数.我使用SCSS变量(它不一定是SCSS)和外部代码@supports作为后备.

此外,这并不能保证永远不会有滚动条.由于它需要Javascript,因此没有启用该功能的用户将看到水平滚动条.您可以通过设置overflow-x: hidden然后添加一个类来解决它,以便在Javascript运行时覆盖它.

完整代码:

$scroll-bar: 20px;

:root {
    --scroll-bar: 8px;
}

.screen-width {
  width: 100vw;
  margin: 0 calc(-50vw + 50%);

    .has-scrollbar & {
        width: calc(100vw - #{$scroll-bar});
        margin: 0 calc(-50vw + 50% + #{$scroll-bar / 2});
    }

    @supports (color: var(--scroll-bar)) {
        .has-scrollbar & {
            width: calc(100vw - var(--scroll-bar));
            margin: 0 calc(-50vw + 50% + (var(--scroll-bar) / 2));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后这个Javascript将设置CSS自定义属性:

function handleWindow() {
    var body = document.querySelector('body');

    if (window.innerWidth > body.clientWidth + 5) {
        body.classList.add('has-scrollbar');
        body.setAttribute('style', '--scroll-bar: ' + (window.innerWidth - body.clientWidth) + 'px');
    } else {
        body.classList.remove('has-scrollbar');
    }
}

handleWindow();
Run Code Online (Sandbox Code Playgroud)

作为旁注,Mac用户可以通过转到系统偏好设置 - >常规 - >显示滚动条=始终进行测试