Erlauben Sie einem bestimmten Tag, den Überlauf zu überschreiben: versteckt

73

Ich habe ein <div>, das ist ein bestimmtes heightund width, und overflow:hiddendamit bestimmte innere Bilder abgeschnitten werden; Ich möchte jedoch, dass ein Bild <div>aus dem Rand herausspringt (dh das überschreibt overflow:hidden). Wie mache ich das?

user965369
quelle
6
Die Tatsache, dass dies nicht erreicht werden kann, ist meines Erachtens ein Mangel der aktuellen HTML-Rendering-Fähigkeit.
Lisa
1
Fast identische Frage: stackoverflow.com/questions/8432883/…
Lisa
@ Lisa Ich stimme zu, ich wünschte, es gäbe eine Möglichkeit, ein Element von einem Überlauf auszuschließen!
Webkit
und jetzt stecke ich wirklich fest, weil ich keine absolute Positionierung verwenden kann und ein Überlauf mein Formular abschneidet!
Samia Ruponti

Antworten:

98

Der Trick besteht darin, das overflow:hiddenElement bei position:staticeinem höheren übergeordneten Element (und nicht dem overflow:hiddenübergeordneten Element) zu belassen und es zu positionieren . Wie so:

.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>

Ich möchte auch darauf hinweisen, dass ein sehr häufiger Anwendungsfall für den Wunsch, dass ein Element seinen Container auf diese Weise überläuft, darin besteht, dass Sie die Höhe eines Dropdowns oder Containers von X auf 0 animieren möchten und daher overflow: hiddenauf dem Container haben müssen. Normalerweise befindet sich im Container etwas , das Sie unabhängig davon überlaufen möchten. Da diese Elemente nur zugänglich sind, wenn der Container "offen" ist, können Sie den Überlauf nutzen und auf "zurücksetzen" setzen, visible nachdem der Container vollständig geöffnet ist, und ihn dann wieder auf "setzen", hiddenbevor Sie versuchen, den Container wieder zu animieren height: 0.

Parlament
quelle
Warum erwähnen Sie position: staticin Ihrem Text und verwenden ihn dann nicht im Code?
Joe Phillips
2
Position: Statisch ist die Standardeinstellung. Sie können es auf .overflow-wrap setzen, wenn etwas die Standardeinstellung überschreibt
Parlament
22

Ich weiß, dass dies ein alter Beitrag ist, aber dies kann getan werden (zumindest in Chrome). Ich habe das vor ungefähr zwei Jahren herausgefunden und es hat mich ein paar Mal gerettet.

Stellen Sie das Kind auf eine feste Position ein und verwenden Sie Ränder anstelle von oben und links, um es zu positionieren.

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

#parent {
    position: relative;
}

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

Hier ist ein Beispiel: http://jsfiddle.net/senica/Cupmb/

Senica Gonzalez
quelle
Hey, das scheint in Chrome, Firefox und Safari großartig zu funktionieren - ich werde es im IE ausprobieren. Danke für den Hack.
Iain Collins
Leider funktioniert dies im IE (Version 10) nicht. Es wäre wirklich ordentlich gewesen.
Ingo Kegel
26
schön, aber wenn Sie Position einstellen: fest, wird es behoben - die Schaltfläche bleibt an der gleichen Stelle, während Sie die Seite scrollen ...
betatester07
Dies scheint nicht zu funktionieren, wenn #wrapperes einen transformSatz gibt
Luke Taylor
Es würde nicht, weil Transformationen ihren eigenen Stapelkontext erstellen
Senica Gonzalez
10

Alle gegebenen Antworten waren für mich nicht zufriedenstellend. Sie sind meiner Meinung nach alle hackisch und in komplexen Layouts schwer zu implementieren.

Hier ist eine einfache Lösung:

Sobald ein Elternteil einen bestimmten Überlauf hat, gibt es keine Möglichkeit, seine Kinder diesen überschreiben zu lassen.

Wenn ein Kind den übergeordneten Überlauf überschreiben muss, kann ein Kind einen anderen Überlauf haben als die anderen Kinder.

So definiert den Überlauf für jedes Kind statt es auf der Erklärung der Eltern :

<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;
}

Hier ist eine Geige:

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

dylanmensaert
quelle
Sehr saubere Lösung
Kursus
6
Leider nicht geeignet für zB scrollbare Container
AlexFoxGill
6

Sie können nicht, es sei denn, Sie ändern Ihr HTML-Layout und verschieben das Bild aus dem übergeordneten div. Ein wenig mehr Kontext würde Ihnen helfen, eine akzeptable Lösung zu finden.

Jon
quelle
5

Wickeln Sie Ihre overflow: hidden divmit einer anderen div, die eine CSS-Eigenschaft von - hat

transform: translate(0, 0);

und in Ihrem specefic-Tag, dass es das - überschreiben soll overflow: hidden, setzen Sie es mit -

position: fixed; es wird weiterhin relativ zu seinem Elternteil positioniert sein

dh -

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

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

Sehen Sie die Geige hier

URL87
quelle
1
WOW ist das genial, allerdings aus verschiedenen Gründen. Sie brauchen die Transformation nicht wirklich und können die Position auf absolut ändern. Die eigentliche Funktionsweise besteht vielmehr in der einfachen Tatsache, dass ein Element gemäß dem Vorfahren, an dem es positioniert ist, abgeschnitten wird, wobei es sich bei der absoluten Position nicht unbedingt immer um das übergeordnete Element handelt, bei dem das Element stattdessen positioniert ist die nächste relative Position. Somit können Sie (ein) Element (e) zwischen relativ und absolut haben, dessen Überlauf verborgen ist.
Jack Giffin
2

Alles oben ist schön, aber nichts schlägt JAVASCRIPT. (Verwenden jquery). Damit,

<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>

Ich erhalte die ursprüngliche Position des Elements (relativ zur Seite), erhalte optional die Höhe oder Breite, hänge das Element optional an den Körper an, wende die neue CSS-Regel an position : fixedund wende schließlich die ursprüngliche Position sowie optional Breite und Höhe an .

Αλέκος
quelle
Normalerweise stimme ich nicht für Leute, aber ich habe das nur abgelehnt. Dies ist ein absolut schrecklicher Ansatz für die Programmierung von Webseiten. Coding-Gurus bei Google und Mozilla verbringen die Ewigkeit damit, die SIMID-gesteuerten CSS-Interna zu perfektionieren. Sie können es einfach nicht übertreffen, den Browser die Arbeit machen zu lassen. Anstatt nur Javascript zu verwenden, sollten Sie so viel wie möglich von der Verarbeitung in das CSS verschieben. Dies ist aus den oben genannten Gründen der beste Ansatz für die Webseitenprogrammierung. Verwenden Sie auch nicht JQuery.
Jack Giffin
Keine harten Gefühle. Meinungen sind wie Nasen. Jeder hat einen. IMHO ist es nur ein anderer Weg, um das Problem zu lösen. JQuery ist genau das. Ein anderer Weg, um Probleme zu lösen. Frohes neues Jahr.
Αλέκος
Ich werde +1, weil es eine Lösung für ein Problem ist, das unter bestimmten Umständen keine Lösung hat. Wenn uns die "Coding Gurus" bei Google und Mozilla eine CSS-Lösung geben, wird diese offensichtlich nicht mehr benötigt. (Das heißt, ich werde es vermeiden.)
Jeremy A. West
1
Diese Lösung kann nützlich sein, wenn Sie nicht die vollständige Kontrolle über vorhandenes HTML und CSS haben (z. B. wenn Sie ein Dropdown-Plugin erstellen). Eine Optimierung - Wenn Sie festlegen position: absolute(statt fest), hat dies den gleichen Effekt, funktioniert aber auch, wenn der Benutzer die Seite scrollt.
SMX
Ich werde auch +1 @SMX 'Kommentar. Die Verwendung dieser Technik in einem WordPress-Plugin kann sehr praktisch sein, wenn Sie keinen Zugriff haben oder übergeordnete Elemente nicht kennen.
Peter Gibbons
2

Sie können ein Element aus dem Div überlaufen lassen, indem Sie es in ein anderes Div einschließen und dann Ihr Bild als Position festlegen: absolut; und versetzen Sie es mit Rändern.

<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;
}

Beispiel (getestet in Firefox + IE10) http://jsfiddle.net/Ps76J/

nHaskins
quelle
1

Derzeit ist mir nicht bekannt, dass ein übergeordneter Knoten mit ausgeblendetem Überlauf Kinder außerhalb sichtbar machen kann (mit Ausnahme von position:fixedKindern).

Es ist jedoch möglich, anstelle eines Überlaufs einfach die Gliederungseigenschaft zu verwenden, die auf die Farbe des Hintergrunds festgelegt ist, kombiniert mit der Z-Index-Eigenschaft, um einige Elemente zu maskieren, während andere wie folgt beibehalten werden.

.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>

Jack Giffin
quelle
0

Überlauf bezieht sich auf den Container, in dem übergroße Inhalte nicht angezeigt werden können (wenn sie ausgeblendet sind). Es hat nichts mit inneren Elementen zu tun, die überlaufen können: was auch immer und immer noch nicht angezeigt werden.

Slawisch
quelle
-2

Der Z-Index scheint nicht zu funktionieren, aber hier habe ich eine Problemumgehung, die für mich gut funktioniert hat, da ich einen Überlauf benötigte, um beim Bewegen eines untergeordneten Elements nur "sichtbar" zu sein:

#parent {
   overflow: hidden;
}

#parent:hover {
   overflow: visible;
}
Johnny
quelle
3
Dies beantwortet die Frage überhaupt nicht.
Jack Giffin
-3

Ich habe eine supereinfache Lösung für dieses Problem: Verwenden Sie das "pre" -Tag. Ich weiß, dass das Pre-Tag der Verwendung von "goto" in der Programmierung entspricht, aber hey: es funktioniert!

<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>

David Jensen
quelle
1
Dies funktioniert nicht aus der Ferne. Wenn Sie das Code-Snippet ausführen, können Sie den gesamten Text nur sehen, weil das div breiter als der Inhalt ist. Wenn Sie width: 200pxdiv festlegen , wird der Inhalt innerhalb des Pre-Tags wie von der overflow: hiddenEigenschaft erwartet abgeschnitten .
Tim Barclay
Ich entschuldige mich dafür, dass ich vergessen habe, dem "pre" -Tag ein "style" -Attribut hinzuzufügen. Nun erscheint die Bildlaufleiste. Ich frage mich, ob ich die Frage des OP falsch verstehe. Ich dachte, das Problem wäre: Es gibt ein äußeres Element mit "Überlauf: versteckt", aber ein inneres Element muss nicht umbrochen werden. Das "Pre" -Tag ermöglicht dies. Wenn ein Bild innerhalb des Pre-Tags platziert wird, wird das gesamte Bild angezeigt (Sie müssen weiterhin die Bildlaufleiste verwenden). Ohne das "Pre" -Tag wird das Bild gehackt (Sie können nicht das gesamte Bild sehen).
David Jensen
Aber jetzt denke ich, dass das OP tatsächlich gefragt hat, ob ein inneres Element „entkommen“ und sich über die Grenzen des äußeren Elements hinaus erstrecken kann. In diesem Fall funktioniert die „Pre“ -Tag-Lösung nicht. Denken Sie jedoch daran, dass mit der "Pre" -Tag-Lösung die gesamten Inhalte angezeigt und nicht gehackt werden können (was hoffentlich eine akzeptable Lösung ist). Vielen Dank.
David Jensen
Als Randnotiz verwenden wir diese Lösung, wenn zwei sehr lange Textzeilen miteinander verglichen werden müssen (visuell von einem Menschen). Wenn eine Textzeile umbrochen wird, ist es sehr schwierig, sie mit einer anderen zu vergleichen. Angular Material hat Behälter mit "Überlauf: versteckt" und die "Vor" -Lösung war das einzige, was für uns funktioniert hat.
David Jensen
1
Wie entspricht das "pre" -Tag der Verwendung eines "goto" in der Programmierung?!?! Das macht überhaupt keinen Sinn. Das preTag ist lediglich ein spanTag mit zusätzlichem vordefiniertem CSS. Es gibt keine besonderen Funktionen des preTags. Entweder bist du verrückt oder brauchst dringend Hilfe.
Jack Giffin