Skalieren/zoomen Sie ein DOM-Element und den Platz, den es einnimmt, mit CSS3 transform scale()

Lesezeit: 5 Minuten

Benutzer-Avatar
Kanaka

In der Mitte meiner Seite habe ich ein div-Element mit Inhalt (andere divs, Bilder, was auch immer).

<div>
    before
</div>
<div id="content-to-scale">
    <div>something inside</div>
    <div>another something</div>
</div>
<div>
    after
</div>

Ich möchte dieses Element (Content-to-Scale) und alle seine untergeordneten Elemente skalieren. Scheint ein Job für die Skalierungsoperation der CSS3-Transformation zu sein. Das Problem ist jedoch, dass dies nur eine Transformation der Visualisierung dieser Elementhierarchie ist und nicht den Platz (oder die Position) des Elements auf der Seite ändert. Mit anderen Worten, wenn Sie dieses Element größer skalieren, wird es mit dem „vorher“- und „nachher“-Text überlappen.

Gibt es eine einfache/zuverlässige Möglichkeit, nicht nur die visuelle Darstellung, sondern auch den belegten Platz zu skalieren?

Extrapunkte für reines CSS ohne Javascript. Noch mehr Punkte für eine Lösung, die das tut das Richtige mit anderen Transformationsfunktionen wie Drehen und Neigen. Dies muss keine CSS3-Transformation verwenden, aber es muss von allen neueren HTML5-fähigen Browsern unterstützt werden.

  • Hier ist ein JS Bin, in dem jeder experimentieren kannmit Stift als Stilsprache. Da ist auch ein einfache CSS-Version.

    – Rory O’Kane

    20. August 2012 um 18:25 Uhr

  • Einige Referenzen zu CSS-Transformationen: eine Demo von Rotieren, Neigen und Skalieren. Mozilla Developer Network auf der transform und transform-origin Eigenschaften.

    – Rory O’Kane

    20. August 2012 um 18:32 Uhr


  • Lassen Sie mich das klarstellen: Sie möchten das untergeordnete Element transformieren, und während Sie dies tun, möchten Sie, dass CSS die Höhe und Breite des übergeordneten Elements ändert. Recht? Wenn dies der Fall ist, gibt es in CSS keine Kind->an->Eltern, dh hierarchische Rückwärts-/Aufwärtsvererbung.

    Benutzer900360

    27. August 2012 um 10:48 Uhr

  • @AnubhavSaini, ich habe Javascript in meiner Frage nicht ausgeschlossen. Mein Ziel ist eine einfache und zuverlässige Lösung, die in allen aktuellen HTML5-fähigen Browsern (unabhängig vom Mechanismus) funktioniert. Reines CSS wäre ideal, aber nicht notwendig.

    – Kanaka

    27. August 2012 um 15:11 Uhr

Benutzer-Avatar
Lukas Grün

Das HTML (Danke Rory)

<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Sandbox for Stack Overflow question http://stackoverflow.com/q/10627306/578288" />
<meta charset=utf-8 />
  <title>Sandbox for SO question about scaling an element both visually and dimensionally</title>
</head>
<body>
  
  <div id="wrapper">
    <div class="surrounding-content">
      before
    </div>
    
    <div id="content-to-scale">
      <div>something inside</div>
      <div><img src="http://placekitten.com/g/150/100"></div>
      <div>another something</div>
    </div>
    
    <div class="surrounding-content">
      after
    </div>
  </div>
  
</body>
</html>

Das CSS (Immer noch von Rorys Basis aus gestartet)

body {
  font-size: 13px;
  background-color: #fff;
}
#wrapper {
  width: 50%;
  margin-left: auto;
  margin-right: auto;
  border: 0.07692307692307693em solid #888;
  padding: 1.1538461538461537em;
}
.surrounding-content {
  border: 0.07692307692307693em solid #eee;
}
#content-to-scale {
  border: 0.07692307692307693em solid #bbb;
  width: 10em;
}
#content-to-scale {
  font-size: 1.1em;
}
#content-to-scale img {
  width: auto;
  height: auto;
  min-width: 100%;
  max-width: 100%;
}

Die Erklärung:

Ich verwende Schriftgröße und Ems, um die Abmessungen der untergeordneten Elemente zu “skalieren”.

Ems sind Maßeinheiten, die relativ zur Schriftgröße des aktuellen Kontexts sind.

Wenn ich also sage, ich habe eine Schriftgröße von 13 Pixel und einen Rahmen von 1 (die gewünschte Rahmenbreite in Pixel) geteilt durch 13 (die Schriftgröße des aktuellen Kontexts auch in Pixel) = 0,07692307692307693em, sollte der Browser 1 Pixel darstellen Grenze

Um eine 15-Pixel-Auffüllung zu emulieren, verwende ich dieselbe Formel (gewünschte Pixel)/(Schriftgröße des aktuellen Kontexts in Pixel) = gewünschte Ems. 15 / 13 = 1,1538461538461537em

Um die Skalierung des Bildes zu zähmen, verwende ich einen alten Favoriten von mir: das natürliche Verhältnis, das die Skalierung beibehält, lassen Sie mich erklären:

Bilder haben eine natürliche Höhe und Breite und ein Verhältnis zwischen ihnen. Die meisten Browser behalten dieses Verhältnis bei, wenn Breite und Höhe auf automatisch eingestellt sind. Sie können dann die gewünschte Breite mit min-width und max-width steuern, sodass es in diesem Fall immer auf die volle Breite des übergeordneten Elements skaliert wird, selbst wenn es über seine natürliche Breite hinaus skaliert wird.

(Sie können auch max-width und max-height 100 % verwenden, um zu verhindern, dass das Bild über die Grenzen des übergeordneten Elements hinausragt, aber niemals über seine natürlichen Abmessungen hinaus skaliert wird.)

Sie können jetzt die Skalierung steuern, indem Sie die Schriftgröße auf #content-to-scale anpassen. 1,1 em entspricht ungefähr der Skala (1,1)

Dies hat einige Nachteile: verschachtelte Schriftgrößen in ems werden rekusiv angewendet. Bedeutung, wenn Sie haben:

<style type="text/css">
    div{
        font-size: 16px;
    }
    span{
        font-size: 0.5em;
    }
</style>
<div>
    <span>
        <span>
            Text
        </span>
    </span>
</div>

Am Ende wird “Text” mit 4 Pixel statt der erwarteten 8 Pixel gerendert.

  • Zuerst dachte ich, Sie könnten die Verschachtelung reparieren em Problem mit der rem („root em“) Einheitaber jetzt denke ich, dass das nur funktionieren würde, wenn Sie die ganze Seite skalieren – rem bemerkt nur Änderungen der Schriftgröße am Stamm html Element.

    – Rory O’Kane

    23. August 2012 um 20:56 Uhr


  • Was Sie über em und Bildverhältnis gesagt haben, mag ganz richtig sein, aber wie beantwortet dies die Frage nach der Transformation und dem Halten des transformierten Elements in der äußeren Umgebung?

    Benutzer900360

    27. August 2012 um 11:16 Uhr

  • @Anubhav Saini: Die letzte Zeile der ursprünglichen Frage besagt, dass Kanaka CSS3 Transform nicht verwenden muss, er benötigt nur die Skalierung und den gewünschten Effekt der skalierten Größe, der die Breite/Höhe im Layout bestimmt. Ich würde es gerne mit Transformationen lösen, aber meiner Erfahrung nach haben Transformationen keinen Einfluss auf das Layout/die Positionierung von nicht transformierten Elementen.

    – Lukas Grün

    27. August 2012 um 21:44 Uhr

  • @JonathanBasile wahrscheinlich

    – Lukas Grün

    27. April 2015 um 23:09 Uhr

1209530cookie-checkSkalieren/zoomen Sie ein DOM-Element und den Platz, den es einnimmt, mit CSS3 transform scale()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy