Die Transformationsskalierung behält den ursprünglichen Raum um das skalierte Element herum bei
Lesezeit: 5 Minuten
Nachtclub
Ich habe zwei verschachtelte divs. Das inner one ist transform: scale(0.5).
Beide sind display: inline-block;.
Was ich tun muss, ist das outer div Passt seine Breite an die Breite des inneren an. Das sollte mir aber nicht passieren. Was passiert ist, dass das äußere div „denkt“, das innere div hat seine ursprüngliche Größe.
Das äußere Div passt seine Breite nur dann an die Breite des inneren an, wenn das innere Div es ist transform: scale(1) aber keinen Skalierungsfaktor kleiner als 1 verwenden, zum Beispiel: 0.5 (siehe Beispiel).
Ich brauche eine Möglichkeit, dies auf elegante Weise per CSS zu erreichen.
Die Transformation erfolgt nur auf dem Bildschirm, die Elemente verwenden immer noch den anfänglichen Raum und Platz, der im Fluss des Dokuments benötigt wird.
Auf diese Weise funktioniert es bei mir nicht, weil ich brauche, dass das äußere Div seine Größe an das innere anpasst. Mit anderen Worten: beide haben die gleiche Größe.
– Nachtclub
10. Mai 2016 um 15:00 Uhr
@nightclub Wenn Sie für beide die gleiche Größe festlegen, gibt es keine Möglichkeit, dass der Elternteil schrumpft. Das hat deiner Geige gefehlt 🙁 Ich vermute, du missverstehst, wie die Transformation funktioniert
– G-Cyrillus
10. Mai 2016 um 15:03 Uhr
Ich habe dem äußeren Div keine Größe angegeben, also erwartete ich, dass das äußere Div schrumpfen könnte
– Nachtclub
10. Mai 2016 um 15:08 Uhr
@nightclub wird es nicht, wie ich am Ende meiner Antwort geschrieben habe. Position: relativ; + Coordinates macht dasselbe, es verschiebt nur das Element auf dem Bildschirm, nicht im Layout;) jsfiddle.net/0bc4sxk3/3 ähnliches Problem wie bei der Transformation. das ist das normale verhalten 🙂
– G-Cyrillus
10. Mai 2016 um 15:09 Uhr
Adrian B
Ich denke, dass eine Lösung darin besteht, das verkleinerte Element in ein Element mit einzuwickeln overflow: hidden. Die Verpackung sollte die genauen Abmessungen des verkleinerten Inhalts haben.
Schöne Lösung! Allerdings denke ich position: absolute wird nicht benötigt.
– Shahriar
6. August 2021 um 15:36 Uhr
Ich habe Ihre Lösung in eine Snippet-Demo konvertiert, wobei ich den ursprünglichen HTML-Code und das ursprüngliche Design verwendet habe. Funktioniert es wie erwartet? Bitte überarbeiten Sie nach Bedarf, um dies zu demonstrieren.
– Escherholz
11. Februar um 16:27 Uhr
Dies sollte stattdessen die akzeptierte Antwort sein
– ashuvssut
15. August um 13:31 Uhr
Gute Lösung! Ich hatte genau das gleiche Problem und Überlauf: versteckt; hat die Arbeit für mich erledigt
– NULL
gestern
Guy Moreillon
Wenn Sie spät zur Party kommen, aber eine andere Möglichkeit besteht darin, ein Größenelement zu verwenden, das leer und nicht skaliert ist, die gleiche äußere Größe wie das verkleinerte Element hat und unter dem skalierten Element sitzt. Dies steuert die Größenanpassung des übergeordneten Elements, und das skalierte Element wird dann absolut über dem Größenelement positioniert.
Sogar später habe ich auf der React-Komponente von mikeysee aufgebaut und eine geschrieben, die mit Inhalten funktioniert, die dynamisch skaliert werden (sie verwendet negative Ränder, um eine Größenänderung der Kinderinhalte zu vermeiden):
import * as React from 'react';
import useResizeObserver from '@react-hook/resize-observer';
interface Props
extends React.DetailedHTMLProps<
React.HTMLAttributes<HTMLDivElement>,
HTMLDivElement
> {
scale?: number;
style?: React.CSSProperties;
}
/**
* The ScaleBox is an element that scales its content using CSS transform scale
* and makes sure the flow around the box is as if the box had the size
* according to the applied scale.
*
* The parent element of a ScaleBox must have the overflow: 'hidden' style.
*/
export const ScaleBox: React.FC<Props> = ({ scale = 1, style, children }) => {
const [marginX, setMarginX] = React.useState('0px');
const [marginY, setMarginY] = React.useState('0px');
const divRef = React.useRef<HTMLDivElement>(null);
useResizeObserver(divRef, (target) => {
setMarginX(`${(scale - 1) * target.contentRect.width}px`);
setMarginY(`${(scale - 1) * target.contentRect.height}px`);
});
React.useEffect(() => {
if (divRef.current) {
setMarginX(`${(scale - 1) * divRef.current.offsetWidth}px`);
setMarginY(`${(scale - 1) * divRef.current.offsetHeight}px`);
}
}, [scale]);
return (
<div
ref={divRef}
style={{
...style,
transform: `scale(${scale})`,
transformOrigin: 'top left',
marginRight: marginX,
marginBottom: marginY
}}
>
{children}
</div>
);
};
Reagieren ist nicht auf die Frage getaggt. Diese Antwort ist weit außerhalb des Rahmens.
– Escherholz
11. Februar um 16:24 Uhr
Reagieren ist nicht auf die Frage getaggt. Diese Antwort ist weit außerhalb des Rahmens.
– Escherholz
11. Februar um 16:24 Uhr
14301200cookie-checkDie Transformationsskalierung behält den ursprünglichen Raum um das skalierte Element herum beiyes