Zusammenklappbarer flexibler Breite Seitenleiste mit nur CSS
Nehmen wir an ich habe eine zusammenklappbare Feste Breite sidebar, die wie folgt definiert:
HTML
<div class="container">
<div class="sidebar" id="sidebar">
SIDEBAR
</div>
<div class="content">
lorem bla bla
<button onclick="document.getElementsByClassName('sidebar')[0].classList.toggle('collapsed')">
toggle Sidebar
</button>
</div>
</div>
CSS
body {
margin:0;
}
.container {
display: flex;
min-height:100px;
}
.sidebar {
position: relative;
left: 0;
width: 200px;
background-color: #ccc;
transition: all .25s;
}
.sidebar.collapsed {
left:-200px;
margin-right:-200px;
}
Codepen hier: http://codepen.io/anon/pen/pJRYJb
Also hier die Frage:
Wie kann ich von dort aus eine mit flexibler Breite sidebar?
Hier sind die Einschränkungen:
- kein javascript (ich will den browser auf den Umgang mit den layouting – nicht von mir)
- die sidebar darf keine überschneidungen der Inhalte
- wenn zusammengebrochen, die sidebar ist nach rechts an den Rand ausgerichtet werden muss, mit dem Fenster Links der Grenze (in der Lage sein zu befestigen absolut positioniert-Registerkarte auf der rechten Seite, immer sichtbar)
- die Breite der sidebar sollten nicht ändern, wenn zugeklappt, um zu vermeiden, fließt während des übergangs
- reibungslosen übergang ohne plötzliche Sprünge
- moderne CSS (flexboxes, calc) ist in Ordnung,
Das Hauptproblem hier ist, dass ich kann nicht einen Weg finden, zu sagen margin-right: -100%
wo 100%
bezieht sich auf die Breite der sidebar
Jede Hilfe wird sehr geschätzt!
- javascript ist gut geeignet für die Auslösung der Zusammenbruch der Logik. Aber ich will nicht, um die Verwendung von javascript für das Layout.
- Wie wäre
width: auto; display: flex;
für.sidebar
- und was mache ich in
.sidebar.collapsed
? - Was bedeutet flexible-Breite bedeuten? Wie
flex: 1
? - es bedeutet: sollten die nehmen so viel Breite, wie es die Kinder – als ob es
display: inline-block
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa die änderung der
width
stattposition
auf klicken Sie auf? Ich benutzemax-width
in diesem Fall, es funktioniert fast das gleiche wie unbekannte Breite. Dies wird wahrscheinlich dazu führen, dass die Inhalte reflow auf der Seitenleiste zu verwenden, sowhite-space:nowrap
wenn es akzeptabel ist.http://jsfiddle.net/dn4ge901/
CSS:
HTML:
Andere Problemumgehung ist die Verwendung
transform
Breiteposition
zusammen, aber der Effekt der animation etwas anders sein wird.http://jsfiddle.net/vkhyp960/
CSS:
HTML:
sidebar {white-space: nowrap;}
- jsfiddle.net/dn4ge901/1transform
, aber die animation ist anders - jsfiddle.net/dn4ge901/2transform: translateX(-100%);
schon. Dies jedoch nicht dazu führen, dass die.content
Bereich anzupassen. (Ich muss noch festgelegtmargin-right
auf einen negativen Wert)Piggy-backing aus Pangloss' Vorschlag re: die Transformation... Sie können nur eine negative Marge auf den Inhalt, wenn Sie wissen, die Breite der sidebar. Keine Notwendigkeit, um die Seitenleiste wechseln Sie zur absoluten Positionierung.
--
--
Finden Sie den Stift LxRYQB von Jason Florenz (@JFlo) auf CodePen.
display: inline-block
)Für was es Wert ist, ich tun haben eine teilweise js-Lösung. Die animation selbst ist vollständig mit CSS, es behebt nur die
width:auto
problem. Man muss nur die Breite der sidebar domElement mit js, wenn das element geladen wird:domElement.style.width = `${parseInt(domElement.offsetWidth)}px`;
Dies löst den 'unbekannten' width problem. Und Sie können Ihre
.collapsed
Ansatz, gerade wie Sie mögen zu tun. Die einzige Anpassung ist, dass Sie brauchen, um hinzuzufügen!important
zu den.collapsed {width: 300px !important;}
Breite Wert.