Używam przejścia CSS z właściwością transform
, aby zmniejszyć elementy podczas ich dodawania i usuwania.Jak przekształcić CSS wpływa na przepływ innych elementów
Jednak jednym z problemów jest to, że ta właściwość nie wpływa na przepływ innych elementów, więc wygląda na to, że element, który się usuwa, zmniejsza się, a reszta elementów nagle się skacze.
Gdybym miał animować właściwość wysokości zamiast używać transformacji, byłoby to w porządku, jednak w rzeczywistym użyciu używam elementów o zmiennej wysokości, więc nie będę wiedział, na jakie wysokości mogę animować.
Edit: ludzie sugerowali animowanie właściwości height
(która nie będzie działać, jak wspomniano powyżej), albo właściwość max-height
. Właściwość max-height
będzie działać w pewnym stopniu, jednak nie można idealnie wyliczyć ustawień czasowych, ponieważ przejście będzie dostosowywać właściwość max-height
poza rzeczywistą wysokość elementu do końca czasu przejścia.
Innym problemem związanym z tymi podejściami jest to, że nie wykorzystuje płynnych animacji, które można uzyskać za pomocą właściwości transform
. Transformacja obiektu stanie się płynna, jednak ruch następujących elementów będzie się zacinał, ponieważ przeglądarka renderuje te przejścia w różny sposób.
Oto JSFiddle o co mi chodzi (spróbuj dodać następnie usuwanie elementów i zobaczyć skok, gdy elementy są usuwane):
var button = document.querySelector("button");
var box = document.createElement("div");
box.className = "box";
box.appendChild(document.createTextNode("Click to delete"));
button.addEventListener("click", function(e) {
var new_box = box.cloneNode(true);
new_box.addEventListener("click", function(e) {
this.className = "box deleting";
window.setTimeout(function(e) {
new_box.remove();
}, 1000);
});
this.parentNode.appendChild(new_box);
});
button {
font-size: 20pt;
}
.box {
font-size: 20pt;
margin: 10px;
width: 200px;
padding: 10px;
background: pink;
transform: scale(1, 1);
transform-origin: top left;
}
.deleting {
transform: scale(1, 0);
transition: all 1000ms ease;
}
<button>
Add Box
</button>
Nie znosząc sprawy, ale czy przetestowałeś swoją odpowiedź? W najlepszym razie jest szałowy. –
@RyanWheale To naprawdę działa dobrze dla elementów o znanym zakresie wysokości, takich jak 500px do 800px, problem polega na tym, że czas animacji będzie zależał od zastosowanej wysokości maksymalnej. Chciałem tylko wskazać tę możliwość :) – sabithpocker
OK, dokonałem pewnych modyfikacji, aby zademonstrować rozwiązanie! Ale znowu działa to tylko dla pewnych scenariuszy :) – sabithpocker