| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> |
| <html> |
| <head> |
| <meta http-equiv="Content-type" content="text/html; charset=utf-8"> |
| <title>-webkit-transform-origin vs. Transform Functions</title> |
| <style type="text/css" media="screen"> |
| #a { |
| top: 0px; |
| left: 0px; |
| position: absolute; |
| -webkit-perspective: 800; |
| width: 800px; |
| height: 600px; |
| } |
| #b1 { |
| top: 80px; |
| left: 300px; |
| width: 200px; |
| height: 200px; |
| position: absolute; |
| background-color: #282; |
| -webkit-animation-duration: 2s; |
| -webkit-animation-iteration-count: infinite; |
| -webkit-animation-timing-function: linear; |
| -webkit-transform-origin: center center 200px; |
| } |
| @-webkit-keyframes b1 { |
| from { -webkit-transform: rotateY(0deg); } |
| 5% { -webkit-transform: rotateY(90deg); } |
| 20% { -webkit-transform: rotateY(90deg); } |
| 50% { -webkit-transform: rotateY(180deg); } |
| 75% { -webkit-transform: rotateY(270deg); } |
| to { -webkit-transform: rotateY(360deg); } |
| } |
| #b2 { |
| top: 320px; |
| left: 300px; |
| width: 200px; |
| height: 200px; |
| position: absolute; |
| background-color: #282; |
| -webkit-animation-duration: 2s; |
| -webkit-animation-iteration-count: infinite; |
| -webkit-animation-timing-function: linear; |
| } |
| @-webkit-keyframes b2 { |
| from { -webkit-transform: translateZ(200px) rotateY(0deg) translateZ(-200px) } |
| 5% { -webkit-transform: translateZ(200px) rotateY(90deg) translateZ(-200px) } |
| 20% { -webkit-transform: translateZ(200px) rotateY(90deg) translateZ(-200px) } |
| 50% { -webkit-transform: translateZ(200px) rotateY(180deg) translateZ(-200px) } |
| 75% { -webkit-transform: translateZ(200px) rotateY(270deg) translateZ(-200px) } |
| to { -webkit-transform: translateZ(200px) rotateY(360deg) translateZ(-200px) } |
| } |
| </style> |
| |
| <script type="text/javascript" charset="utf-8"> |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| resultEntries = []; |
| |
| const expected = { |
| "b1" : [ 0,0,-1,0, 0,1,0,0, 1,0,0,0, 0,0,0,1 ], |
| "b2" : [ 0,0,-1,0, 0,1,0,0, 1,0,0,0, -200,0,200,1 ] |
| }; |
| |
| const tolerance = 0.2; |
| function isEqual(actual, desired) |
| { |
| var diff = Math.abs(actual - desired); |
| return diff <= tolerance; |
| } |
| |
| var numSnapshots = 0; |
| |
| function snapshot(id) |
| { |
| var e = document.getElementById(id); |
| var t = window.getComputedStyle(e).webkitTransform; |
| var a = t.split("("); |
| var array = a[1].split(","); |
| var pass = true; |
| for (i = 0; i < 16; ++i) { |
| var actual = parseFloat(array[i]); |
| var expect = expected[id][i]; |
| if (!isEqual(actual, expect)) { |
| resultEntries.push("FAIL(element '"+id+"' matrix["+i+"]' was:"+actual+", expected:"+expect+")<br>"); |
| pass = false; |
| } |
| } |
| |
| if (pass) |
| resultEntries.push("PASS(element '"+id+"' matches expected value)<br>"); |
| |
| numSnapshots++; |
| if (numSnapshots == 2) { |
| resultEntries.sort(); |
| document.getElementById('result').innerHTML = resultEntries.join(""); |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| } |
| |
| function snapshotOnTimeout(id) { |
| setTimeout("snapshot('" + id + "')", 250); |
| } |
| |
| function startAnimation(id) |
| { |
| var element = document.getElementById(id); |
| element.addEventListener('webkitAnimationStart', function() { |
| // delay to give hardware animations a chance to start |
| window.setTimeout("snapshotOnTimeout('" + id + "')", 0); |
| }, false); |
| element.style.webkitAnimationName = id; |
| } |
| |
| function start() |
| { |
| startAnimation('b1'); |
| startAnimation('b2'); |
| } |
| |
| </script> |
| </head> |
| <body onload="start()"> |
| <div id="a"> |
| <div id="b1"> </div> |
| <div style="-webkit-transform:translateZ(-200px); -webkit-transform-style:preserve-3d;"> |
| <div id="b2"> </div> |
| </div> |
| </div> |
| </body> |
| <div id="result"> </div> |
| </html> |