Index: tools/perf/page_sets/key_silk_cases/list_animation_simple.html |
diff --git a/tools/perf/page_sets/key_silk_cases/list_animation_simple.html b/tools/perf/page_sets/key_silk_cases/list_animation_simple.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bb470f2e3142079fbdd2b77c99c087c71dde03d2 |
--- /dev/null |
+++ b/tools/perf/page_sets/key_silk_cases/list_animation_simple.html |
@@ -0,0 +1,226 @@ |
+<!doctype html> |
+<meta charset="UTF-8"> |
+<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"> |
+<meta name="apple-mobile-web-app-capable" content="yes"> |
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> |
+<style> |
+html, body { |
+ height: 100%; |
+ overflow: hidden; |
+} |
+* { |
+ box-sizing: border-box; |
+} |
+.scrollable { |
+ position: relative; |
+ height: 100%; |
+ overflow-y: scroll; |
+ overflow-x: hidden; |
+} |
+.stretcher { |
+ position: absolute; |
+ visibility: hidden; |
+ left: 0; |
+ top: 0; |
+ width: 1px; |
+ height: 1000000px; |
+} |
+.item { |
+ background-color: #FFF; |
+ width: 100%; |
+ position: absolute; |
+ left: 0; |
+ top: 0; |
+ -webkit-transform: translate3d(0, 0, 0); |
+ height: 50px; |
+ border: 1px solid #000; |
+ padding: 10px; |
+} |
+body { |
+ -ms-touch-action: none; |
+ display: none; |
+} |
+@keyframes slideIn { |
+ from { |
+ transform: translate3d(100%, 0, 0); |
+ } |
+ to { |
+ transform: translate3d(0, 0, 0); |
+ } |
+} |
+@keyframes slideOut { |
+ from { |
+ transform: translate3d(0, 0, 0); |
+ } |
+ to { |
+ transform: translate3d(-100%, 0, 0); |
+ } |
+} |
+@-webkit-keyframes slideIn { |
+ from { |
+ -webkit-transform: translate3d(100%, 0, 0); |
+ } |
+ to { |
+ -webkit-transform: translate3d(0, 0, 0); |
+ } |
+} |
+@-webkit-keyframes slideOut { |
+ from { |
+ -webkit-transform: translate3d(0, 0, 0); |
+ } |
+ to { |
+ -webkit-transform: translate3d(-100%, 0, 0); |
+ } |
+} |
+.list { |
+ transform: translate3d(100%, 0, 0); |
+ -webkit-transform: translate3d(100%, 0, 0); |
+ border: 5px solid red; |
+ position: absolute; |
+ top: 0; |
+ right: 0; |
+ bottom: 0; |
+ left: 0; |
+} |
+</style> |
+<script> |
+var LIST_COUNT = 10; |
+for (var i = 0; i < LIST_COUNT; i++) { |
+ document.write('<div class="list scrollable" style="border-color: #' + |
+ Math.floor(Math.random() * 16777215).toString(16) + '"><div class="stretcher"></div></div>'); |
+} |
+var transform = 'webkitTransform' in document.body.style ? 'webkitTransform' : 'transform'; |
+ |
+function InfiniteList(options) { |
+ var scrollable = options.element, |
+ itemTemplate = options.template, |
+ renderFn = options.render, |
+ itemHeight = options.itemHeight || 50, |
+ itemsPool = [], |
+ itemsPoolCount = 0, |
+ topItemIndex = 0, |
+ scrollableHeight = window.innerHeight, |
+ div, i; |
+ |
+ function update() { |
+ var newScrollTop = scrollable.scrollTop, |
+ newTopItemIndex = Math.floor(newScrollTop / itemHeight), |
+ delta = newTopItemIndex - topItemIndex; |
+ |
+ if (delta !== 0) { |
+ if (Math.abs(delta) > itemsPoolCount) { |
+ renderAllItems(newTopItemIndex); |
+ } |
+ else { |
+ renderItems(delta); |
+ } |
+ } |
+ } |
+ |
+ function renderAllItems(index) { |
+ for (i = 0; i < itemsPoolCount; i++) { |
+ renderItem(itemsPool[i], index + i); |
+ } |
+ |
+ topItemIndex = index; |
+ } |
+ |
+ function renderItems(count) { |
+ var lastIndex = itemsPoolCount - 1; |
+ |
+ // Recycle top items to render at the bottom |
+ if (count > 0) { |
+ for (i = 0; i < count; i++) { |
+ div = itemsPool[i]; |
+ renderItem(div, topItemIndex + itemsPoolCount + i); |
+ } |
+ |
+ itemsPool.push.apply(itemsPool, itemsPool.splice(0, count)); |
+ topItemIndex += count; |
+ } |
+ // Recycle bottom items to render at the top |
+ else { |
+ count = Math.abs(count); |
+ for (i = lastIndex; i > lastIndex - count; i--) { |
+ div = itemsPool[i]; |
+ renderItem(div, --topItemIndex); |
+ } |
+ |
+ itemsPool.unshift.apply(itemsPool, itemsPool.splice(lastIndex - count + 1, count)); |
+ } |
+ } |
+ |
+ function renderItem(div, index) { |
+ renderFn(div, index); |
+ div.style[transform] = 'translate3d(0, ' + (index * itemHeight) + 'px' + ', 0)'; |
+ } |
+ |
+ function loop() { |
+ window.requestAnimationFrame(function() { |
+ update(); |
+ loop(); |
+ }); |
+ } |
+ |
+ window.addEventListener('DOMContentLoaded', function() { |
+ console.log('DOMContentLoaded'); |
+ var holder = document.createElement('div'), |
+ itemsHtml = []; |
+ |
+ itemsPoolCount = Math.ceil(scrollableHeight / itemHeight) + 1; |
+ |
+ for (i = 0; i < itemsPoolCount; i++) { |
+ itemsHtml.push(itemTemplate); |
+ } |
+ |
+ holder.innerHTML = itemsHtml.join(''); |
+ itemsPool.push.apply(itemsPool, holder.children); |
+ itemsPool.forEach(function(item) { |
+ item.style.height = itemHeight + 'px'; |
+ scrollable.appendChild(item); |
+ }); |
+ |
+ renderAllItems(0); |
+ loop(); |
+ }); |
+} |
+document.body.style.display = 'block'; |
+var lists = document.querySelectorAll('.list'), |
+ prefix = 'onwebkitanimationend' in window ? '-webkit-' : '', |
+ count = 0, |
+ index = 0; |
+[].forEach.call(lists, function(list) { |
+ new InfiniteList({ |
+ element: list, |
+ template: '<div class="item"></div>', |
+ render: function(div, index) { |
+ div.textContent = 'This is item #' + index; |
+ } |
+ }); |
+}); |
+function animate(index, name) { |
+ var list = lists[index]; |
+ list.style.setProperty(prefix + 'animation-name', name, null); |
+ list.style.setProperty(prefix + 'animation-duration', '5s', null); |
+ list.style.setProperty(prefix + 'animation-timing-function', 'ease-out', null); |
+ list.style.setProperty(prefix + 'animation-fill-mode', 'forwards', null); |
+ count++; |
+} |
+function next() { |
+ if (index > lists.length - 1) { |
+ index = 0; |
+ } |
+ animate(index, 'slideOut'); |
+ if (++index > lists.length - 1) { |
+ index = 0; |
+ } |
+ animate(index, 'slideIn'); |
+} |
+document.addEventListener(prefix ? 'webkitAnimationEnd' : 'animationend', function() { |
+ console.log('animationend'); |
+ if (--count === 0) { |
+ next(); |
+ } |
+}, true); |
+next(); |
+</script> |