2013-02-17 8 views
6

Ich sehe seltsames Verhalten nach dem Anwenden von ein paar Transformationen auf Elemente mit Hintergrundbildern in Chrome.Chrome Hintergrundbild "Bleeds" Kanten mit CSS-Skalierung Transformationen angewendet

Ich versuche ein Spiel mit einem Hintergrund über den gesamten Bildschirm und einem skalierten Charakter, der sich um diesen Hintergrund bewegt. Das Zeichen hat mehrere Animationsrahmen und ich zeige jeden Frame, indem ich die Hintergrundposition x oder y auf ähnliche Weise wie bei herkömmlichen CSS-Sprite-Techniken verschiebe.

Das Problem ist, dass ich die obere Kante oder die linke Kante angrenzender Bilder im Bild meines Charakters sehe. Nun passiert das nur in bestimmten Maßstäben, aber es ist deutlich sichtbar und störend. Für eine Demonstration verwende ich ein 364x1328 Bild mit zwei Frames. Der obere Rahmen enthält eine schwarze Box ohne Rot in den Grenzen 364 x 644. Der untere Rahmen ist fest rot. Der obere Rahmen mit Grenzen ausgewählt ist in meinem Bild-Editor auf der linken Seite und der Ausgabe von Chrome angezeigt wird auf der rechten Seite eingefügt:

Frame boundaries on the left (364x664), output from Chrome on the right

In der Ausgabe von Chrome können Sie deutlich sehen, eine rote Grenze entlang der Unterseite. Da mein Hintergrundbild in einem 364x664-Feld enthalten ist, würde ich erwarten, dass nur die in diesem Feld sichtbaren Pixel angezeigt werden. Mit anderen Worten, ich würde gerne sehen, was ich unter scale(1) sehe, aber verkleinert. Es sieht so aus, als würde Chrome das Hintergrundbild aus irgendeinem Grund neu abtasten.

Um einfach zu machen demonstrieren, ich habe eine JS Fiddle enthalten: http://jsfiddle.net/CL5Gh/

<!DOCTYPE html> 
<html> 
<head> 
<style> 

#b 
{ 
    -webkit-transform: scale(0.4775); 
    -webkit-transform-origin: 0 0; 
} 

#d 
{ 
    height: 664px; 
    width: 364px; 
    background-image: url(data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%01l%00%00%050%02%03%00%00%00%1A%F2%87%B5%00%00%00%2CtEXtCreation%20Time%00Sun%2017%20Feb%202013%2022%3A08%3A49%20%2B1000%FC%E8%C07%00%00%00%07tIME%07%DD%02%11%0B%1B%0B%C2%A0%3B8%00%00%00%09pHYs%00%00%1E%C1%00%00%1E%C1%01%C3iTS%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%09PLTE%00%00%00%00%00%00%FF%00%00%3D%FB%DD-%00%00%00%01tRNS%00%40%E6%D8f%00%00%01%A4IDATx%DA%ED%CC1%0D%000%08%000%9EI%C4%24*11%C8%92%B5%02%1A%01%00%00%00%00%00%FC%E4%E45n%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%ED%06%00%00%00%00%00%DESs%DCn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%7B%F3n%80%3C%CA%A7%B6%23%99%BC%00%00%00%00IEND%AEB%60%82); 
    -webkit-transform: scale(0.4375); 
} 

</style> 
</head> 
<body> 
    <div id="b"> 
    <div id="d"> 
    </div> 
    </div> 
</body> 
</html> 

Nun, ich bin nicht sicher, ob diese Grafikkarte oder maschinenabhängig in irgendeiner Weise. In der Geige sehen Sie zwei angewendete Skalierungstransformationen. Dies emuliert, was in meinem Spiel passiert. Die erste ist die Skalierung für den Hintergrund und die zweite die Skalierung für das Hauptzeichen.

Ich würde jede Hilfe zu schätzen wissen. Ich habe überlegt, jeden Rahmen mit 50px (wieviel ist genug?) Auffüllen, um das Problem zu beseitigen, aber das scheint schrecklich hacky und ich möchte eine echte Antwort.

+0

Ich habe das gleiche Problem auftritt. Es scheint, Chrome-Bug als neueste Safari und Firefox das Bild völlig in Ordnung, mit scharfen Kanten. – gondo

Antwort

0

Es liegt daran, dass CSS-Transformationen an Subpixelpositionen interpolieren können. Wenn also die Position Ihres Elements nicht in Pixel passt, sehen Sie einen "Dubstep-Effekt" (siehe http://paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/).

Da scale nicht mit CSS2 (im Gegensatz zu translate in dem Artikel) emuliert werden kann, fürchte ich, es gibt keine Lösung.

Es sei denn, eine bestimmte CSS3 Regel existiert oder wird existieren, ich suche danach.

EDIT: -webkit-backface-visibility: hidden; der Trick auf Chrom, weiß nicht, warum ...

+0

Danke! Dies funktioniert, obwohl es in gewisser Weise den Größenänderungsalgorithmus ändert. Kanten erscheinen weniger glatt und ich weiß nicht warum. –

+0

Whoops, ich glaube, ich habe zu früh gesprochen. Obwohl dies das Bild schärfer macht, gibt es immer noch Fälle, in denen ich von außerhalb des Bildes blute. Ich denke, was ich wirklich will, ist etwas, das imitiert-moz-image-rect, um das Bild zu zerschneiden. –

Verwandte Themen