当前位置: 首页 > 知识库问答 >
问题:

隐藏主体溢出时具有固定位置的元素会移动

南宫俊逸
2023-03-14

我想打开一个模态层,超越身体滚动。为了实现这一点,当层被显示时,我将主体溢出设置为隐藏,溢出在模态层上滚动。从视觉上看,一个滚动条替换了另一个。

在背景中,我有一个固定位置和100%宽的顶栏。当主体溢出设置为隐藏时,100%宽度div(顶栏)占据滚动条空间,其元素向右移动。

如何防止这些元素移动?

我试图计算(javascript)滚动条的宽度,当设置body overflow:hidden时,给顶部的栏加一个右边距:“scrollbar width”。那不管用。

还尝试了顶部栏右端的虚拟div,其中溢出设置为滚动,并在打开图层时强制其显示滚动条。我们的想法是用另一个滚动条占用丢失的滚动条的空间,仅在顶部容器上。这几乎有效,但产生了1或2px闪烁。不够好。

在这里摆弄基本问题

var body = $('body'),
main = $('.main'),
open_modal = $('.open-modal'),
close_modal = $('.close-modal'),
modal_container = $('.modal-container'),
toggleModal = function() {
    body.toggleClass('body-locked');
    modal_container.toggleClass('dp-block');
};

open_modal.on('click', toggleModal);
close_modal.on('click', toggleModal);

共有3个答案

史和泰
2023-03-14
匿名用户

代码中的一些错误:id 只有一个。如果要将相同的样式应用于更多元素,请使用类。

<div class="topBarContent">
    <div class="inner1">div</div>
    <div class="inner1">div</div>
    <div class="inner1">div</div>
    <div class="inner1">div</div>
    <div class="inner1">div</div>
</div>

不管怎样,这不是你问题的原因。首先,你的体溢出要足够:不要给你的< code >加一个overflow。modal-container,除非您希望在模式打开时防止背景页滚动。第二,修复模态本身,并使用居中CSS技巧将其居中(左:50%,左边距:-你的宽度的一半)。CSS:。体锁{溢出:滚动;}

.modal-container {
    overflow:hidden;
    position:fixed;
    display: none;
    top: 0; right: 0;
    height: 100%; width: 100%;
    background-color: rgba(255, 255, 255, 0.3);
    z-index: 400;
}

.modal {
    position: fixed;
    height: 600px;
    width: 200px;
    margin: 50px auto 50px -100px;
    background: indianred;
    left:50%;
}
/*Reset your body, you never know*/
body {
    margin:0;
    padding:0
}

希望有帮助。

鄢飞鸾
2023-03-14

你这里的问题是topBar固定有一个100%宽度。如果这个宽度是固定的,你就不会有这个问题。以下已经在Chrome和Firefox上进行了测试:

将此行添加到切换模式函数的第一行:

$(“.topBarFixed”).width($(“_topBarFix”).width())

这将把宽度设置为该点上条形的实际宽度(以像素为单位)。然后,当您关闭该层时,将其设置回100%

close_modal.on('click', function() { toggleModal(); $(".topBarFixed").width("100%"); });

整个代码看起来像这样:

var body = $('body'),
    main = $('.main'),
    open_modal = $('.open-modal'),
    close_modal = $('.close-modal'),
    modal_container = $('.modal-container'),
    toggleModal = function() {
        $(".topBarFixed").width($(".topBarFixed").width());
        body.toggleClass('body-locked');
        modal_container.toggleClass('dp-block');
    };

open_modal.on('click', toggleModal);
close_modal.on('click', function() { toggleModal(); $(".topBarFixed").width("100%"); });

这是小提琴:http://jsfiddle.net/wmk05t0b/5/

编辑

或者,您可以提出一个固定的宽度,这将可以解决问题:

.topBarFixed
{
    width:715px; /*changed from 100%*/
    height: 40px;
    background-color: lightgray;
    position: fixed;
    top: 0;
    left: 0;
    text-align:center;
    display: inline-block;
    z-index: 200;
}

屈翰飞
2023-03-14

基本上…

>

  • 打开模式时,将菜单宽度设置为当前宽度,并设置一个窗口。onresize事件处理程序,它将菜单调整到正文的宽度。

    关闭模式后,删除固定宽度和 window.onresize 处理程序,并将菜单返回到其初始状态。

    本着更少===更多的精神,我尽可能简化您的代码。

    var body = $('body');
    var menu = $('#topBarFixed');
    
    function toggleModal() {
        menu.css('width', body.hasClass('locked') ? '' : menu.width());
        window.onresize = body.hasClass('locked') ? '' : function () {
            menu.css('width',  body.width());
        }
        body.toggleClass('locked');
    }
    
    body.on('click', '.open-modal, .close-modal', toggleModal);
    body {
        padding-top: 40px;
        height: 1000px;
        background: lightblue;
    }
    
    body.locked {
        height: 100%;
        overflow: hidden;
    }
    
    .modal-container {
        display: none;
        overflow-y: scroll;
        position: fixed;
        top: 0; right: 0;
        height: 100%; width: 100%;
        background-color: rgba(255, 255, 255, 0.3);
        z-index: 400;
    }
    
    body.locked .modal-container  {
        display: block !important;
    }
    
    .modal {
        height: 600px;
        width: 200px;
        margin: 50px auto;
        background: indianred;
    }
    
    #topBarFixed {
        width: 100%;
        background-color: lightgray;
        position: fixed;
        top: 0;
        left: 0;
        text-align:center;
        display: inline-block;
        z-index: 200;
    }
    
    .topBarContent {
        display: inline-flex;
        flex-direction: row;
        flex-wrap: nowrap;
        justify-content: space-between;
        align-items: center;
    }
    
    .inner1 {
        width:30px;
        line-height: 40px;
    }
    
    .open-modal {
        position: relative;
        top: 400px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    
    <div id="topBarFixed">
        <div class="topBarContent">
            <div id="inner" class="inner1">div</div>
            <div id="inner" class="inner1">div</div>
            <div id="inner" class="inner1">div</div>
            <div id="inner" class="inner1">div</div>
            <div id="inner" class="inner1">div</div>
        </div>
    </div>
    
    
    <p>Scroll down to open layer</p>
    <button class="open-modal">Open layer</button>
    
    
    <div class="modal-container">
        <div class="modal">
            <button class="close-modal">Close layer</button>
        </div>
    </div>

  •  类似资料:
    • 我创建了一个固定在页面底部的容器。但是,容器随后溢出页面,填充规则被完全忽略。我在论坛上搜索过,但找不到一个解决问题的方法。我试过使用position absolute,也试过使用Javascript计算滚动条宽度,但都没有用。 null null

    • 问题内容: 我需要显示大于其父元素的子元素,但不删除overflow:hidden;。这可能吗?parent元素的 子元素一旦脱离父边界,就会被剥离。 (元素定义了其他的css,我只是为了清楚起见放置了样式属性) 问题答案: 这是完全不可能做到你想要什么都和父..相反,你可以引入额外的儿童并移动到这一点。 HTML: CSS:

    • 问题内容: 我们有两个DIV,一个嵌入另一个。如果外部DIV的位置不是绝对的,则内部DIV的位置绝对是不遵守外部DIV所隐藏的溢出的。 是否有机会使内部DIV服从外部DIV的隐藏溢出,而无需将外部DIV设置为绝对位置(因为这会破坏我们的完整布局)?相对于内部DIV的相对位置也不是一种选择,因为我们需要“增长”到表TD(exmple)。 还有其他选择吗? 问题答案: 制作外,以和内到。它应该为您工作

    • 问题内容: 我不知道是否存在问题,但是我想知道为什么在父/子元素上不能使用。 这是一个例子: CSS和HTML: 问题答案: 因为固定位置元素是相对于视口而不是其他元素固定的。因此,由于视口没有切断,因此溢流变得无关紧要。 具有position:absolute的元素的位置和尺寸相对于其包含块,而具有position:fixed的元素的位置和尺寸始终相对于初始包含块。通常是视口:浏览器窗口或纸张的

    • 问题内容: 我一直在努力奋斗。我想绝对定位将在div中移动的图像,并希望剪切超出div的任何内容。这是问题的示例: 因此,我希望徽标的右边缘不显示。有想法吗? 问题答案: 由于图像的容器是绝对放置的,因此它不在“包含” div的范围之内。 您的选择是使用jQuery动态定位相对位置或调整绝对定位div的尺寸。

    • 问题内容: SO上有很多问题涵盖了如何解决此问题的答案(添加),但没有一个试图真正解释标题运动背后的原因。我更奇怪为什么会这样。 可以认为固定标头停留在浏览器窗口的顶部,并且不应由于另一个未定位,非子,非父div(又称为同级)而移动。Esp。因为固定的标头不在正常的文档流中。 假设: 混淆源于固定元素是相对于浏览器窗口的想法。这是正确的,但是是使用视口计算的。视口是使用常规文档流中的元素计算的。由