| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>vue.js version</title>
- <script src="https://cdn.jsdelivr.net/stats.js/r11/stats.min.js"></script>
- <script src="../../dist/vue.min.js"></script>
- <style>
- html, body {
- height: 100%;
- width: 100%;
- padding: 0;
- margin: 0;
- }
- svg {
- width: 800px;
- height: 600px;
- }
- </style>
- </head>
- <body>
- <h1>Animating 1000 SVG dots</h1>
- <div id="app">
- <p>
- <button @click="toggleOptimization">
- {{ optimized ? 'disable' : 'enable' }} optimization (Object.freeze)
- </button>
- </p>
- <svg>
- <circle v-for='point in model.points' :cx='point.x' :cy='point.y' r='2px' fill='#FC309D'></circle>
- </svg>
- </div>
- <script type="text/javascript" charset="utf-8">
- var stats = new Stats()
- stats.setMode(0)
- stats.domElement.style.position = 'absolute'
- stats.domElement.style.right = '0px'
- stats.domElement.style.top = '0px'
- document.body.appendChild(stats.domElement)
- var WIDTH = 800
- var HEIGHT = 600
- new Vue({
- el: '#app',
- data: {
- model: createModel(1000),
- optimized: false
- },
- created: function () {
- var self = this
- requestAnimationFrame(render)
- stats.begin()
- function render () {
- stats.end()
- stats.begin()
- requestAnimationFrame(render)
- self.model.step()
- if (self.optimized) {
- self.$forceUpdate()
- }
- }
- },
- methods: {
- toggleOptimization: function () {
- this.model = this.optimized
- ? createModel(1000)
- : Object.freeze(createModel(1000))
- this.optimized = !this.optimized
- }
- }
- });
- function createModel (count) {
- var points = []
- for (var i = 0; i < count; ++i) {
- points.push({
- x: Math.random() * WIDTH,
- y: Math.random() * HEIGHT,
- vx: Math.random() * 4 - 2,
- vy: Math.random() * 4 - 2
- })
- }
- return {
- points: points,
- step: step
- }
- function step () {
- points.forEach(move)
- }
- function move (p) {
- if (p.x > WIDTH || p.x < 0) p.vx *= -1
- if (p.y > HEIGHT || p.y < 0) p.vy *= -1
- p.y += p.vy
- p.x += p.vx
- }
- }
- </script>
- </body>
- </html>
|