允许特定标签覆盖溢出:隐藏


73

我有一个<div>,这是肯定的heightwidthoverflow:hidden因此特定的内部图像被裁剪了;但是我希望其中的一幅图像<div>弹出边框(即覆盖overflow:hidden),我该怎么做?


6
我认为,这无法实现的事实是当前HTML呈现功能的缺点。
丽莎


@Lisa我同意,我希望有一种方法可以将元素从任何溢出中排除!
webkit

现在我真的被卡住了,因为我不能使用绝对定位,并且溢出会剪切表格!
Samia Ruponti 2014年

Answers:


99

诀窍是使overflow:hidden元素与position:static上溢元素保持相对,并相对于较高的父元素(而不是overflow:hidden父元素)放置溢出元素。像这样:

.relative-wrap {
    /*relative on second parent*/
    position: relative;
}

.overflow-wrap {
    height: 250px;
    width: 250px;
    overflow: hidden;
    background: lightblue;
    
    /*no relative on immediate parent*/
}

.respect-overflow {
    position: relative;
    top: 75px;
    left: 225px;
    height: 50px;
    width: 50px;
    background: green;    
}
.no-overflow {
    position: absolute;
    top: 150px;
    left: 225px;
    height: 50px;
    width: 50px;
    background: red;
}
<div class="relative-wrap">
    
    <div class="overflow-wrap">
        
        <div class="respect-overflow">
        
        </div>
        <div class="no-overflow">
            
        </div>
        
    </div>
    
</div>

我还想指出,一种非常常见的用例是希望元素以这种方式溢出其容器,即当您要将下拉列表或容器的高度从X动画化为0时,因此需要overflow: hidden在容器上进行动画处理。通常,无论您在容器内部有什么东西都想溢出。由于这些元素仅在容器“打开”时才可访问,因此您可以利用并将溢出设置为visible 容器完全打开后再设置为,然后再将其设置为,然后hidden再尝试将容器动画化为height: 0


为什么position: static在文本中提及而不在代码中使用?
乔·菲利普斯

2
position:默认为static。您可以在.overflow-wrap上设置它,如果您有一些设置可以覆盖默认设置
议会

22

我知道这是一篇旧文章,但是可以做到(至少在Chrome中是这样)。我大约在两年前就知道了这一点,它为我节省了很多时间。

将子级设置为固定位置,并使用边距而不是顶部和左侧进行定位。

#wrapper {
    width: 5px;
    height: 5px;
    border: 1px solid #000;
    overflow: hidden;
}

#parent {
    position: relative;
}

button {
    position: fixed;
    margin: 10px 0px 0px 30px;
}

这是一个示例:http : //jsfiddle.net/senica/Cupmb/


嘿,这似乎在Chrome,Firefox和Safari中效果很好-我将在IE中进行尝试。感谢您的破解。
伊恩·柯林斯

不幸的是,这在IE(版本10)中不起作用。真的很整洁。
Ingo Kegel 2013年

26
很好,但是如果您将position:fixed设置为固定,则它将被固定-在滚动页面时按钮将保持在同一位置...
betatester07

这似乎并没有工作时,如果#wrapper有一个transform
卢克·泰勒

这不是因为转换会创建自己的堆叠上下文
Senica Gonzalez

12

所有给定的答案对我都不满意。在我看来,它们都很扎实,很难在复杂的布局中实现。

所以这是一个简单的解决方案:

一旦父母有某种程度的溢出,就没有办法让其子女覆盖它。

如果一个子项需要覆盖父项溢出,则一个子项可以具有与其他子项不同的溢出。

因此,请在每个子对象上定义溢出, 而不是父对象上声明它:

<div class="panel">
    <div class="outer">
        <div class="inner" style="background-color: red;">
            <div>
                title
            </div>

            <div>                     
                some content
            </div>
        </div>    
    </div>  
</div>

.outer {
    position: relative;
    overflow: hidden;
}    

.outer:hover {
    overflow: visible;
}  

.inner:hover {
    position: absolute;
}

这是一个小提琴:

http://jsfiddle.net/ryojeg1b/1/


非常干净的解决方案
kursus

7
可悲的是不适用于例如可滚动容器
AlexFoxGill

7

overflow: hidden divdivcss属性为-的 另一个包装

transform: translate(0, 0);

并在特定标记中希望它覆盖- overflow: hidden,并用-设置

position: fixed; 它将继续保持相对于其母公司的地位

即-

.section {
    ...
    transform: translate(0, 0);
}

.not-hidden {
    position: fixed;
    ...
}

在这里看到小提琴


1
WOW如此出色,但是出于不同的原因。您实际上不需要转换,可以将位置更改为绝对位置。相反,此工作的实际方式是通过一个简单的事实:将元素根据其定位的祖先进行裁剪,在绝对位置固定的情况下,元素不一定定位为最近的相对位置。因此,您可以在相对和绝对之间使一个或多个元素隐藏起来。
杰克·吉芬

是的,看起来不错-此处的简单演示:jsfiddle.net/2esvjh4p
cronoklee

6

除非您更改HTML布局并将该图像移出父div,否则您将无法进行。多一点上下文可以帮助您找到可接受的解决方案。


2

上面的一切都不错,但是一切顺利JAVASCRIPT。(使用jquery)。所以,

<script>
var element = $('#myID');
var pos = element.offset();
var height = element.height(); // optional
element.appendTo($('body')); // optional
element.css({
    position : 'fixed'
}).offset(pos).height(height);
</script>

我要做的是,获取元素的原始位置(相对于页面),可选地获取高度或宽度,可选地将元素附加到主体,应用新的CSS规则position : fixed,最后应用原始位置以及可选的宽度和高度。


我通常不会对人投反对票,但是我只是对此投了反对票。这是一种完全糟糕的网页编程方法。Google和Mozilla的编码专家花了很长时间来完善SIMID驱动的CSS内部结构。您只是让浏览器完成工作就无法击败。而不是使用所有的javascript,您应将尽可能多的处理移至CSS。由于上述原因,这样做是进行网页编程的最佳方法。另外,不要使用JQuery。
杰克·吉芬

别往心里放。意见就像鼻子。每个人都有一个。恕我直言,这只是解决问题的另一种方法。jQuery就是这样。解决问题的另一种方法。新年快乐。
Αλέκος

我会+1,因为这是对某些情况下没有解决方案的解决方案。显然,当Google和Mozilla的“编码专家”为我们提供一种CSS解决方案时,将不再需要该解决方案。(也就是说,我将避免使用它。)
Jeremy A. West

1
当您无法完全控制现有的HTML和CSS(例如,正在制作下拉插件)时,此解决方案可能会很方便。一项调整-如果您设置position: absolute(而不是固定),则它具有相同的效果,但在用户滚动页面时也可以使用。
SMX

我还将+1 @SMX的评论。当您无权访问甚至不知道父元素时,在wordpress插件中使用此技术会非常方便。
彼得·吉本斯

2

您可以通过将元素包装到另一个div中来将其从div中溢出,然后将图像设置为position:absolute;。并使用边距补偿它。

<div class="no-overflow">
<div>
<img class="escape" src="wherever.jpg" />
</div>
</div>

.no-overflow{
overflow:hidden;
width: 500px
height: 100px
}

.escape{
position: absolute;
margin-bottom: -150px;
}

示例(在firefox + IE10中测试)http://jsfiddle.net/Ps76J/


1

我目前无法知道使溢出隐藏的父节点在其外部可以看到子节点(子节点除外position:fixed)。

但是,可以代替使用溢出,而可以将设置为背景颜色的outline属性与z-index属性结合使用来掩盖某些元素,而保留其他元素。

.persuado-overflow-hidden {
 /*gives the appearance of overflow:hidden*/
  z-index: -100;
  position: relative;
  outline: 1000vw solid white;
  overflow: visible;
}
.overridevisible {
/*takes the element out of the persuado overflow hidden*/
  z-index: 1;
}
/*does the other styling to the text*/
.loremcontainer {
  width: 60vw;
  height: 60vh;
  margin: 20vw;
  border: 1px solid;
}
.loremtxt {
  width: 100vw;
  height: 100vh;
  margin: -20vh;
  z-index: -1;
}
.positionmessage {
  z-index: 100;
  position: absolute;
  top: -12vh;
  left: -5vw;
  right: -5vw;
  color: red;
}
<div class="persuado-overflow-hidden loremcontainer">
<div class="loremtxt">
<div class="overridevisible positionmessage">Then, theres this text outside the paragraphs inside the persuado overflow:hidden element</div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce porta lorem lorem, eu dapibus libero laoreet et. Fusce finibus, felis ac condimentum commodo, mauris felis dictum sapien, pellentesque tincidunt dui dolor id nulla. Etiam vulputate turpis eu lectus ornare, in condimentum purus feugiat. Donec ultricies lacinia urna, sit amet ultrices magna accumsan ut. Suspendisse potenti. Maecenas nisl nibh, accumsan vel sodales in, rutrum at sem. Suspendisse elit urna, luctus vitae urna ut, convallis ultricies tellus. Ut aliquet auctor neque, nec ullamcorper tortor ullamcorper vitae. Fusce at pharetra ante. Aliquam sollicitudin id ante sit amet sagittis. Suspendisse id neque quis nisi mattis vulputate. Donec sollicitudin pharetra tempus. Integer congue leo mi, et fermentum massa malesuada nec.
</div>
</div>


0

溢出是指容器不允许显示超大内容(设置为隐藏时)。它与可能发生溢出的内部元素无关:无论如何,仍然不会显示。


-2

Z-index似乎不起作用,但是在这里,我有一个变通的解决方案,对我来说很好,因为在悬停子元素时我只需要溢出就可以“可见”:

#parent {
   overflow: hidden;
}

#parent:hover {
   overflow: visible;
}

3
这根本无法回答问题。
杰克·吉芬

-3

对于这个问题,我有一个非常简单的解决方案:使用“ pre”标签。我知道pre标记等效于在编程中使用“ goto”,但是嘿:它起作用了!

<div style="overflow: hidden; width: 200px;">
  <pre style="overflow: auto;">
    super long text which just goes on and on and on and on and one, etc.
  </pre>
</div>


1
这是行不通的。如果运行代码段,则可以看到所有文本的唯一原因是div比内容宽。如果您width: 200px在div上进行设置,则pre标签内的内容将按照该overflow: hidden属性的预期被截断。
蒂姆·巴克莱

抱歉,我忘记在“ pre”标签中添加“ style”属性。现在将出现滚动条。我想知道我是否错过了OP的问题?我以为问题是:有一个外部元素带有“溢出:隐藏”,但是内部元素不需要包装。“ pre”标签允许发生这种情况。如果将图像放置在“ pre”标签内,则将显示整个图像(您仍然需要使用滚动条);没有“ pre”标签的图像将被切碎(您无法看到整个图像)。
David Jensen

但是现在我认为OP实际上正在询问内部元素是否可以“转义”并扩展到外部元素的边界之外……在这种情况下,“ pre”标签解决方案将无法工作。但是请记住,“ pre”标签解决方案确实允许查看整个容器,而不是将其切碎(希望是可以接受的解决方案)。谢谢。
David Jensen '18

附带说明一下,当需要将两行非常长的文本(在视觉上,由人类)相互比较时,我们使用此解决方案。当一行文字换行时,很难将其与另一行进行比较。Angular Material的容器带有“溢出:隐藏”,并且“预”解决方案是唯一对我们有用的方法。
大卫·詹森

1
“ pre”标记与在编程中使用“ goto”等效吗?那根本没有任何意义。该pre标签仅仅只是一个span与添加到它额外的预定义的CSS标签。pre标签没有额外的特殊功能。您是疯了还是急需帮助。
杰克·吉芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.