2015-09-17 8 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).