2016-03-23 12 views
0

Ich setze einige padding Platzhalter für ein Element mit vier überlagernden <div /> s, die unterschiedliche Positionierung haben.Divs mit gestreiften Hintergrund überlappend

.top{ 
    position: absolute; 
    left: 0; 
    height: 0; 
    width: 100%; 
    height: {{element.paddingTop}}; 
} 
.right{ 
    position: absolute; 
    right: 0; 
    top: 0; 
    height: 100%; 
    width: {{element.paddingRight}}; 
} 
.bottom{ 
    position: absolute; 
    left: 0; 
    bottom: 0; 
    width: 100%; 
    height: {{element.paddingBottom}}; 
} 
.left{ 
    position: absolute; 
    left: 0; 
    top: 0; 
    height: 100%; 
    width: {{element.paddingLeft}}; 
} 

Jetzt bekomme ich folgendes Problem:

overlapping paddings

Wie Sie sehen können, die width und height scheinen keine exakte Menge an px zu sein, und da ich nicht alle Elemente Positionierung starten von topleft aber auch manchmal von bottom oder right Ich habe diesen hässlichen Überlappungseffekt.
Ich kann es lösen, indem ich background-attachment: fixed verwende, aber das schneidet Elemente, die außerhalb des Ansichtsfensters sind - so behebt das mein Problem nicht.
Ich weiß, ich könnte topleft als Bezugspunkt für alle 4 <div /> s verwenden und die Werte berechnen, aber ich habe weder die width noch die height des Elements in diesem Moment.

Hier ist eine Geige: https://jsfiddle.net/ad51xae7/

+4

Ich habe diesen Kampf schon einmal gekämpft, und ich würde ** dringend ** empfehlen, dass Sie einfach einen einzigen Hintergrund auf das GANZE Ding setzen, dann einen Hintergrund: weiß auf die "Mitte", wo Sie nicht Ich will den Hintergrund. –

+0

yeah, @cale_b Antwort macht mehr Sinn für mich. –

+0

@cale_b Ich verstehe das, leider kann ich das nicht, weil es ein Overlay ist und ich den Inhalt des Elements nicht mehr sehen würde. – Horen

Antwort

1

Stellen Sie sicher, background-attachment: fixed zu verwenden, um das Hintergrundmuster Ihrer Polsterelemente auszurichten. Hier ist eine aktualisierte Geige: https://jsfiddle.net/stefanullinger/ghtkkca8/

Sie können ein robusteres Beispiel finden mit hier zu testen: https://jsfiddle.net/stefanullinger/t26r9c74/

Update:

Hier ist ein weiterer Ansatz, um die HTML5-Canvas-Element verwendet wird.

+0

"Ich kann es lösen, indem ich background-attachment: fixed, aber das schneidet Elemente, die außerhalb des Viewports sind - so dass mein Problem nicht behoben wird." - Dies geschieht nur, wenn Sie CSS-Transformationen verwenden, um Ihr Overlay zu übersetzen. – Stefan

+0

Alternativ können Sie versuchen, HTML5-Canvas-Elemente zu verwenden und sie mit einem Muster zu füllen, um die Position genau zu steuern. Diese Lösung vermeidet eine feste Hintergrundpositionierung. – Stefan

0

Darf ich vorschlagen, dass Sie von dieser Probe

.outline { 
 
    position: relative; 
 
    width: 300px; 
 
    padding: 25px; 
 
} 
 
.outline:before { 
 
    content: ' '; 
 
    position: absolute; 
 
    left: 0; 
 
    top: 0; 
 
    width: 100%; 
 
    height: 100%; 
 
    z-index: -1; 
 
    background-image: linear-gradient(-45deg, #19d76e 8%, transparent 8%, transparent 50%, #19d76e 50%, #19d76e 58%, transparent 58%, transparent); 
 
    background-size: 6px 6px; 
 
} 
 
.outline:after { 
 
    content: attr(data-text); 
 
    position: absolute; 
 
    left: 0; 
 
    top: 0; 
 
    width: auto; 
 
    height: auto; 
 
    background-color: #19d76e; 
 
    color: white; 
 
    font-size: 13px; 
 
    padding: 1px 2px; 
 
} 
 

 
.outline div{ 
 
    position: relative; 
 
    padding: 10px 5px; 
 
    background: white; 
 
}
<div class="outline" data-text="Label something"> 
 
    <div>Hey there, how does this work?</div> 
 
</div>

beginnen: nd Version mit Rand Bild

Das Bild konnte von natürlich als data:\[<mediatype>\]\[;base64\],<data> eingebettet werden verhindert zusätzliche Anfragen

.outline{ 
 
    position: relative; 
 
    height: 80px; 
 
    width: 240px; 
 
    border-image-slice: 12 12 12 12; 
 
    border-image-width: 12px 12px 12px 12px; 
 
    border-image-repeat: repeat repeat; 
 
    border-image-source: url("https://mdn.mozillademos.org/files/6015/border-image-5.png"); 
 
} 
 

 
.absolute { 
 
    position: absolute; 
 
    left: 40px; 
 
    top: 40px; 
 
    background: yellow; 
 
}
<div class="absolute"> 
 
    Hey there again, better ? 
 
</div> 
 

 
<div class="outline"> 
 
</div>

+0

Schöne Lösung, funktioniert aber nicht für mich, da ich ein Overlay verwende, das absolut positioniert ist. – Horen

+0

@Horen Was bedeutet das eigentlich, wenn Sie sagen, dass Sie ein Overlay verwenden? ...Sie können meine Lösung zu absolut umschließen und positionieren – LGSon

+0

Der Inhalt (in Ihrem Fall "Hey, wie funktioniert das?") Ist kein Kindelement der Gliederung, sondern ein Element in einem Iframe. Die Gliederung ist im übergeordneten Fenster vollständig nicht angefügt. – Horen

Verwandte Themen