2015-09-17 15 views
10

Ich habe bemerkt, dass es einen großen Qualitätsunterschied ist, wenn der Text in dieser 2 Möglichkeiten Transformation:CSS schlecht Rendering in translateZ() vs scale()

.text1 { 
 
    width: 200px; 
 
    height: 22px; 
 
    position: absolute; 
 
    top: 40%; 
 
    left: 0; 
 
    transform-origin: 50% 50%; 
 
    transform: scale(2); /* here */ 
 
    color: red; 
 
    text-align: center; 
 
    font-size: 22px; 
 
} 
 
.text2 { 
 
    width: 200px; 
 
    height: 22px; 
 
    position: absolute; 
 
    top: 60%; 
 
    left: 0; 
 
    transform-origin: 50% 50%; 
 
    transform: translateZ(400px); /* here */ 
 
    text-align: center; 
 
    font-size: 22px; 
 
} 
 
.perspective { 
 
    width: 200px; 
 
    height: 200px; 
 
    perspective: 800px; 
 
    transform-style: preserve-3d; 
 
}
<div class="perspective"> 
 
    <div class="text1">Text</div> 
 
    <div class="text2">Text</div> 
 
</div>

Gibt es eine Möglichkeit zu zwingen ein besseres Rendering beim Verschieben von Text auf der Z-Achse?

+0

Vielleicht möchten Sie dies überprüfen: http://stackoverflow.com/questions/26176557/text-blurry-after-3d-transform. Es scheint keine perfekte Lösung zu geben, aber das Umschalten der Schriftgröße und Skalierungseigenschaften kann helfen. – staypuftman

+0

@staypuftman, diese Art von macht die "Leinwand", wo Zeichnung der Schrift größer, daher können Sie es auch größer anzeigen, aber löst nicht das Problem für "jede Transform Maßnahme" – Vandervals

Antwort

11

der Grund, der Text verwischt, wenn Sie mit translateZ(400px) Transformation sind, ist, dass Dies ist eine 3D-Transformation; Der Browser behandelt das Element als Texturen anstelle von Vektoren, um eine Hardware-3D-Beschleunigung bereitzustellen.
Im Grunde wird die Auflösung bei zunehmender Größe niedriger sein.

Auf der anderen Seite Transformation mit Skala ist eine 2D-Transformation, der Browser das Element als Vektor behandelt und Unschärfe nicht auftritt.


zu sehen, was so schnell zu scale geschieht, wenn wir mit 3D-Kick in, ohne tatsächlich alle translateZ Wert einstellen:

.text1 { 
 
    width: 200px; 
 
    height: 22px; 
 
    position: absolute; 
 
    top: 40%; 
 
    left: 0; 
 
    transform-origin: 50% 50%; 
 
    transform: scale(2); 
 
    /* here */ 
 
    color: red; 
 
    text-align: center; 
 
    font-size: 22px; 
 
} 
 
.text1a { 
 
    width: 200px; 
 
    height: 22px; 
 
    position: absolute; 
 
    top: 40%; 
 
    left: 50%; 
 
    transform-origin: 50% 50%; 
 
    transform: translateZ(0) scale(2); 
 
    /* here */ 
 
    color: blue; 
 
    text-align: center; 
 
    font-size: 22px; 
 
} 
 
.text2 { 
 
    width: 200px; 
 
    height: 22px; 
 
    position: absolute; 
 
    top: 60%; 
 
    left: 0; 
 
    transform-origin: 50% 50%; 
 
    transform: translateZ(400px); 
 
    /* here */ 
 
    text-align: center; 
 
    font-size: 22px; 
 
} 
 
.perspective { 
 
    width: 200px; 
 
    height: 200px; 
 
    perspective: 800px; 
 
    transform-style: preserve-3d; 
 
}
<div class="perspective"> 
 
    <div class="text1">Text</div> 
 
    <div class="text1a">Text</div> 
 
    <div class="text2">Text</div> 
 
</div>


die einzige Abhilfe Ich kann im Moment daran denken, überprüft das Stylesheet durch JS und überschreiben translateZ mit transform: scale

var styles = document.styleSheets; 

//patterns 
var perspPat = /perspective\s*?:\s*?(\d+)/; 
var transZPat = /translateZ\(\s*?(\d+)/; 

var perspective; 
var translateZ = []; 
[].slice.call(styles).forEach(function (x) { 
    [].slice.call(x.rules).forEach(function (rule) { 
     if (perspPat.test(rule.cssText)) { 
      perspective = perspPat.exec(rule.cssText)[1] 
     }; 
     if (transZPat.test(rule.cssText)) { 
      translateZ.push([ 
      rule.selectorText, 
      transZPat.exec(rule.cssText)[1]]); 
     } 


    }); 

}) 


translateZ.forEach(function (x) { 
    document.querySelector(x[0]).style.transform = 'scale(' + perspective/x[1] + ')'; 

}) 

fiddle

Wie Sie sehen können, auch wenn es funktioniert, ist eine Menge Optimierung benötigt .. (ich es die Produktion nicht in Betracht ziehen würde bereit, in seinem gegenwärtigen Zustand).

Verwandte Themen