Live-Beispiel Scrollen: https://jsfiddle.net/b8vLg0ny/Mit CSS-Skala() verwandeln sich in ein Element zu vergrößern, ohne Zuschneiden, Aufrechterhaltung
Es ist möglich, die CSS scale
und translate
Funktionen zu verwenden, um in Element zu vergrößern.
Nehmen Sie dieses Beispiel von 4 Boxen in einem 2x2 Raster.
HTML:
<div id="container">
<div id="zoom-container">
<div class="box red">A</div>
<div class="box blue">B</div>
<div class="box green">C</div>
<div class="box black">D</div>
</div>
</div>
CSS:
* { margin: 0; }
body, html { height: 100%; }
#container {
height: 100%;
width: 50%;
margin: 0 auto;
}
#zoom-container {
height: 100%;
width: 100%;
transition: all 0.2s ease-in-out;
}
.box {
float: left;
width: 50%;
height: 50%;
color: white;
text-align: center;
display: block;
}
.red { background: red; }
.blue { background: blue; }
.green { background: green; }
.black { background: black; }
JavaScript:
window.zoomedIn = false;
$(".box").click(function(event) {
var el = this;
var zoomContainer = $("#zoom-container");
if (window.zoomedIn) {
console.log("resetting zoom");
zoomContainer.css("transform", "");
$("#container").css("overflow", "auto");
window.zoomedIn = false;
} else {
console.log("applying zoom");
var top = el.offsetTop;
var left = el.offsetLeft - 0.25*zoomContainer[0].clientWidth;
var translateY = 0.5*zoomContainer[0].clientHeight - top;
var translateX = 0.5*zoomContainer[0].clientWidth - left;
$("#container").css("overflow", "scroll");
zoomContainer.css("transform", "translate(" + 2 * translateX + "px, " + 2 * translateY + "px) scale(2)");
window.zoomedIn = true;
}
});
durch den Wert von translateX
Steuern und translateY
, können Sie, wie die Zoom Arbeiten ändern.
Die anfängliche gerenderte Ansicht sieht etwa so aus:
Durch Klicken auf die A-Box finden Sie in geeigneter Weise vergrößern:
(Beachten Sie, dass am Ende klicken D zeigt nur das Zurücksetzen durch Zurückzoomen.)
Das Problem ist: Zoomen auf Box D skaliert den Zoom-Container so, dass das Scrollen nach oben und links nicht funktioniert, da der Inhalt überläuft. Das gleiche passiert beim Zoomen zu den Boxen B (die linke Hälfte ist beschnitten) und C (die obere Hälfte ist beschnitten). Nur bei A wird der Inhalt außerhalb des Containers nicht überlaufen.
In ähnlichen Situationen im Zusammenhang mit der Skalierung (siehe CSS3 Transform Scale and Container with Overflow) ist eine mögliche Lösung die Angabe transform-origin: top left
(oder 0 0
). Da die Skalierung relativ zur oberen linken Seite funktioniert, bleibt die Bildlauffunktion erhalten. Dies scheint jedoch nicht zu funktionieren, da es bedeutet, dass Sie den Inhalt, der auf das angeklickte Feld (A, B, C oder D) fokussiert werden soll, nicht mehr neu positionieren.
Eine weitere mögliche Lösung besteht darin, dem Zoom-Container einen margin-left
und einen margin-top
hinzuzufügen, der genügend Platz bietet, um den übergelaufenen Inhalt auszugleichen. Aber nochmal: die translate Werte stehen nicht mehr aneinander.
Also: Gibt es einen Weg, um beide Zoom auf einem bestimmten Element, und Überlauf mit einer Rolle, so dass Inhalte nicht beschnitten?
aktualisieren: Es gibt eine grobe fast-Lösung von scrollTop
und scrollLeft
, ähnlich wie https://stackoverflow.com/a/31406704/528044 (siehe the jsfiddle example) Animieren, aber es ist nicht ganz die richtige Lösung, weil es zuerst nach links oben zoomt, nicht das beabsichtigte Ziel. Ich fange an zu vermuten, dass dies eigentlich nicht möglich ist, weil es wahrscheinlich äquivalent ist, wenn man nach scrollLeft
fragt, um negativ zu sein.
Wenn ich sage, alle Kästen wird vergrößert aber die eine geklickt sollte im Hinblick sein, nicht wahr ?, und dann, durch Scrollen kann man sich bewegen Irgendwelche Boxen, oder? – LGSon
Klicken Sie auf ein Kästchen, um das angeklickte Feld zu vergrößern. Es sollte dann möglich sein, zu einem der anderen Felder zu scrollen, um sie in Sicht zu bringen. –
Ich arbeite Stück für Stück mit diesem, habe so weit, https://jsfiddle.net/LGSon/b8vLg0ny/5/ ... und ich könnte ein Kopfgeld anbieten, wenn möglich (2 Tage nach der Entsendung), zu geben mehr Attraktivität für Ihre Frage, wie ich denke, es ist ein guter, und ich habe auch ein Interesse an einer ähnlichen Lösung – LGSon