vue組件初學--彈射小球

来源:http://www.cnblogs.com/hsianglee/archive/2017/09/06/7482626.html
-Advertisement-
Play Games

1. 定義每個彈射的小球組件( ocicle ) 2. 組件message自定義屬性存放小球初始信息(可修改) 3. 思路 3.1 定時器設置小球每一幀移動 3.2 初始方向:isXtrue為true則小球為橫坐標正方向; isYtrue為true則小球為縱坐標正方向 3.3 每次移動之前獲取小球當 ...


1. 定義每個彈射的小球組件( ocicle )

2. 組件message自定義屬性存放小球初始信息(可修改)

{

   top: "0px",        //小球距離上方坐標
   left: "0px",        //小球距離左邊坐標
   speedX: 12,      //小球每次水平移動距離
   speedY: 6         //小球每次垂直移動距離

}    

3. 思路

  3.1 定時器設置小球每一幀移動

  3.2 初始方向:isXtrue為true則小球為橫坐標正方向;

         isYtrue為true則小球為縱坐標正方向

  3.3 每次移動之前獲取小球當前坐標(oleft,otop),當前坐標加上移動距離為下一幀坐標

  3.4 邊界判斷:橫軸坐標範圍超過最大值則加號變減號

4. vue知識點

  4.1 父子組件傳遞信息使用props

  4.2 模板編譯之前獲取el寬高 

beforeMount: function (){
    this.elWidth=this.$el.clientWidth;
    this.elHeight=this.$el.clientHeight;
}

  4.3 子組件獲取el寬高 ( this.$root.elWidth,this.$root.elHeight )

  4.4 模板編譯完成後更新子組件信息

mounted: function (){
    //根據父組件信息更新小球數據
    this.addStyle.top=this.message.top;
    this.addStyle.left=this.message.left;
    this.speedX=this.message.speedX;
    this.speedY=this.message.speedY;
    //小球初始坐標
    this.oleft=parseInt(this.addStyle.left);
    this.otop=parseInt(this.addStyle.top);
    this.move();
}

5. 代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        html,
        body{
            padding: 0;
            margin: 0;
            width: 100%;
            height: 100%;
        }
        #app{
            width: 800px;
            height: 500px;
            margin: 50px auto;
            outline: 1px solid #f69;
            position: relative;
        }
    </style>
</head>
<body>
    <div id="app">
        <ocicle :message="message1"></ocicle>
        <ocicle :message="message2"></ocicle>
        <ocicle :message="message3"></ocicle>
    </div>
    
    <script src="https://unpkg.com/vue"></script>
    <script>
        var tem={
            props: ["message"],
            template: '<div class="article" :style="addStyle"></div>',
            data: function (){
                return {
                    //初始化小球樣式
                    addStyle: {
                        width: "10px",
                        height: "10px",
                        backgroundColor: "#000",
                        position: "absolute",
                        marginTop: "-5px",
                        marginLeft: "-5px",
                        borderRadius: "50%",
                        top: "0px",
                        left: "0px"
                    },
                    //橫坐標方向的速度
                    speedX: 0,
                    //縱坐標方向的速度
                    speedY: 0,
                    //isX為真,則在橫坐標方向為正
                    isX: true,
                    //isY為真,則在縱坐標方向為正
                    isY: true,
                    //小球當前坐標
                    oleft: 0,
                    otop: 0
                }
            },
            mounted: function (){
                //根據父組件信息更新小球數據
                this.addStyle.top=this.message.top;
                this.addStyle.left=this.message.left;
                this.speedX=this.message.speedX;
                this.speedY=this.message.speedY;
                //小球初始坐標
                this.oleft=parseInt(this.addStyle.left);
                this.otop=parseInt(this.addStyle.top);
                this.move();
            },
            methods: {
                move: function (){
                    var self=this;
                    setInterval(function (){
                        //更新小球坐標
                        self.oleft=parseInt(self.addStyle.left);
                        self.otop=parseInt(self.addStyle.top);
                        self.isXtrue();
                        self.isYtrue();
                    }, 20);
                        
                },
                //判斷橫坐標
                isXtrue: function (){
                    //true 橫坐標正方向
                    //false 橫坐標負方向
                    if(this.isX){
                        this.addStyle.left=this.oleft+this.speedX+"px";
                        //寬度超過最大邊界
                        if(this.oleft>this.$root.elWidth-5){
                            this.addStyle.left=this.oleft-this.speedX+"px";
                            this.isX=false;
                        }
                    }else{
                        this.addStyle.left=this.oleft-this.speedX+"px";
                        //寬度超過最小邊界
                        if(this.oleft<5){
                            this.addStyle.left=this.oleft+this.speedX+"px";
                            this.isX=true;
                        }
                    }
                },
                // 判斷縱坐標
                isYtrue: function (){
                    //true 縱坐標正方向
                    //false 縱坐標負方向
                    if(this.isY){
                        this.addStyle.top=this.otop+this.speedY+"px";
                        //高度超過最大邊界
                        if(this.otop>this.$root.elHeight-5){
                            this.addStyle.top=this.otop-this.speedY+"px";
                            this.isY=false;
                        }
                    }else{
                        this.addStyle.top=this.otop-this.speedY+"px";
                        //高度超過最小邊界
                        if(this.otop<5){
                            this.addStyle.top=this.otop+this.speedY+"px";
                            this.isY=true;
                        }
                    }
                }
            }

        }
        var vm=new Vue({
            el: "#app",
            data: {
                //獲取el節點寬高
                elWidth: 0,
                elHeight: 0,
                //設置小球初始信息
                message1: {
                    top: "0px",
                    left: "600px",
                    speedX: 12,
                    speedY: 6
                },
                message2: {
                    top: "0px",
                    left: "300px",
                    speedX: 8,
                    speedY: 6
                },
                message3: {
                    top: "300px",
                    left: "0px",
                    speedX: 13,
                    speedY: 5
                }
            },
            //更新el節點寬高
            beforeMount: function (){
                this.elWidth=this.$el.clientWidth;
                this.elHeight=this.$el.clientHeight;
            },
            components: {
                "ocicle": tem
            }
            
        })
    </script>
</body>
</html>

6. 鏈接地址 ( http://hsianglee.top/vue/moveBall.html )


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 水平居中佈局 優點:相容性好; 不足:需要同時設置子元素和父元素 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ini ...
  • 一、前言: 前段時間看紅寶書(JavaScript高級程式設計),但沒有計劃的去看,也沒有做詳細的筆記,讀了之後有點空虛,感覺不對勁啊,學的東西很難記住,印象不深啊,有種挫敗感,作前端的js都學不好怎麼做前端。後端都學js了,你說死不死。 因此吾閱之,再閱之,並決心記之以博客,以增強印象,作得讀書筆 ...
  • 很多時候,我們給客戶設計網頁原型的時候,客戶說這裡搭配不好,那裡搭配不好,這裡不對,也說不出來為什麼不對? 是我們的技術問題嗎?答案不是,是客戶習慣看色彩xuanjie比較好的網頁? 本文僅做參考 ...
  • margin-left: 40%; ...
  • CSS佈局這種東西既複雜也簡單,弄清楚常見佈局的各種實現方法,方能實現更加複雜的佈局。本文將講解各種常見的佈局及其實現方法,相信一定會對你有所啟發。 ...
  • 地鐵上逛segmentfault看到一篇用純css和SVG來實現的很贊的效果,覺得拿來做一些開場效果動畫應該不錯。 原文地址:https://segmentfault.com/a/1190000010963326 覺得很有趣,正好925快到了,就擼了一個生日快樂的 效果圖如下: 就像是一圈圈螞蟻在它 ...
  • 自我總結 Angular4 開發環境搭建,含 未 翻 牆 解決方案。 一、前期準備(node、npm) 打開 cmd 驗證 node 版本 驗證 npm 版本 現 node 安裝自帶了 npm若安裝老版本,未 翻 牆 可使用淘寶 npm 鏡像 二、node、npm 已配置後全局安裝 Angular ...
  • javaScript 常用技巧總結 1. 徹底屏蔽滑鼠右鍵 2. 取消選取、防止複製 3. 不准粘貼 4. 防止複製 5. IE地址欄前換成自己的圖標 6. 可以在收藏夾中顯示出你的圖標 7. 關閉輸入法 8. 永遠都會帶著框架 9. 防止被人frame 10. 網頁將不能被另存為 11. 查看網頁 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...