Vue搭建課程首頁

来源:https://www.cnblogs.com/chenyingying0/archive/2020/04/01/12604614.html
-Advertisement-
Play Games

按照國際慣例先放效果圖 項目結構搭建 首先修改app.vue <template> <div id="app"> <router-view/> </div> </template> <script> export default { name: 'App' } </script> <style> * ...


按照國際慣例先放效果圖

 

 

項目結構搭建

首先修改app.vue

<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>
*{
  margin:0;
  padding: 0;
  list-style:none;
}
</style>

 

修改main.js,引入rem公式文件

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import './config/rem'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>'
})

 

在src文件夾下,創建文件夾config,新建文件rem.js

(function(){function a(){var b=document.documentElement.clientWidth;b=b>750?750:b;var c=b/750*100;document.getElementsByTagName("html")[0].style.fontSize=c+"px"}a();window.onresize=a})();

這個代碼可以去網上找,有很多,效果都一樣,實現方法也差不太多

 

修改router/index.js 路由文件

 

 

瀏覽器訪問:

 

 

移動端項目配置:

在根目錄下的index.html中添加移動端meta頭

 

 

安裝px移動轉換為rem單位的插件

cnpm install px2rem-loader --save-dev

(安裝依賴,最好是加上--save-dev,否則重啟的時候需要再次安裝)

 

 

在build文件夾下的utils.js中配置:

 

remUnit設置原理:

如果設計稿給的是375,就在調試工具375頁面下查看html元素的font-size

顯示是50,那麼就設置50

 

 如果給的設計稿是750,那麼就調到750尺寸下,查看html的font-size,來設置remUnit

 

然後重啟項目即可生效

在detail.vue中設置寬度單位為px作為測試

 

 

瀏覽器里觀察到單位自動轉換為了rem

 

 

不想要轉為rem單位的,就在後面加上/*no*/

 

效果

 

 

sketch設計稿介紹:

佈局一般都是有設計稿的,mac推薦sketch

windows就pxcook或者photoshop,如果想體驗sketch,可以在windows上裝mac虛擬機(這個我晚上研究研究再發一篇博)

 

修改項目總體樣式 app.vue

<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>
*{
  margin:0;
  padding: 0;
  list-style:none;
}
a{
  text-decoration: none;
  color:#333;
}
</style>

 

components組件:

共用的組件一般都作為組件來實現

頭部組件

創建header文件夾下的index.vue,放代碼

<template>
    <div class="c-header">
        <ul class="header-ul">
            <li>推薦</li>
            <li>課程</li>
            <li>實戰</li>
            <li>職業路線</li>
            <li class="class-search"><img src="../../assets/search.png"></li>
            <li class="class-history"><img src="../../assets/history.png"></li>
        </ul>
    </div>
</template>

// scoped表示樣式只在該組件中生效,不會影響其他頁面
<style scoped>
    .c-header{
        position:fixed;
        width:375px;
        top:0;
        background:#fff;
        box-shadow:0 2px 4px 0 rgba(0,0,0,.1);
    }
    .header-ul{
        font-size:0;
    }
    .header-ul li{
        display: inline-block;
        padding-left:20px;
        font-size:16px;
        color:#71777d;
        height:44px;
        line-height:44px;
    }
    .header-ul img{
        width:18px;
    }
    .header-ul .class-search{
        padding-left:60px;
    }
</style>

 

創建列表組件

list文件夾下的index.vue

 

<template>
    <ul class="c-course">
        <router-link to="/detail">
            <li v-for="item in courseList">
                <img :src="item.imgUrl">
                <h1>{{item.title}}</h1>
                <p>{{item.msg}}</p>
            </li>
        </router-link>
    </ul>
</template>

<script>
export default {
    props:{//過濾器
        courseList:Array
    }
}
</script>

<style scoped>
    .c-course{
        padding:24px 0;
        background:#fff;
    }
    .c-course li{
        position: relative;
        width:335px;
        height:72px;
        margin:0 auto 24px;
    }
    .c-course li img{
        position:absolute;
        width:108px;
        border-radius:5px;
    }
    .c-course li h1{
        font-size:15px;
        padding-left:124px;
    } 
    .c-course li p{
        font-size:14px;
        padding-left:124px;
    } 
</style>

 

底部組件

創建footer目錄下的index.vue

<template>
    <div class="footer">
        <ul class="footer-ul">
            <li>
                <img src="../../assets/home.png" alt="">
                <span>首頁</span>
            </li>
            <li>
                <img src="../../assets/sea.png" alt="">
                <span>發現</span>
            </li>
            <li>
                <img src="../../assets/download.png" alt="">
                <span>下載</span>
            </li>
            <li>
                <img src="../../assets/me.png" alt="">
                <span>我的</span>
            </li>
        </ul>
    </div>
</template>

<style scoped>
    .footer{
        position:fixed;
        z-index:3;
        width:375px;
        background:#fff;
        border-top:1px solid #f3f5f7;
        bottom:0;
    }
    .footer-ul{
        display:flex;
    }
    .footer-ul li{
        display:flex;
        height:50px;
        flex:1;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        font-size:10px;
    }
    .footer-ul li img{
        width:24px;
    }
</style>

 

首頁文件home.vue

<template>
    <div class="home">
        <v-header></v-header>

        <ul class="nav">
            <li v-for="item in webList">
                <img :src="item.imgUrl"><!-- 冒號用來接收變數 -->
                <span>{{item.name}}</span>
            </li>
        </ul>

        <v-list :courseList="courses"></v-list>

        <v-footer></v-footer>
    </div>
</template>

<script>
//導入組件
import Header from '@/components/header/'
import List from '@/components/list/'
import Footer from '@/components/footer/'
// 圖片必須通過import來導入
import webImg from '@/assets/web.png'
import webserviceImg from '@/assets/webservice.png'
import moveImg from '@/assets/move.png'
import dataImg from '@/assets/data.png'
import bigdataImg from '@/assets/bigdata.png'

import course1 from '@/assets/course1.jpg'
import course2 from '@/assets/course2.jpg'
import course3 from '@/assets/course3.jpg'
import course4 from '@/assets/course4.jpg'
import course5 from '@/assets/course5.jpg'

export default {
    data(){
        return{
            webList:[],
            courses:[]
        }
    },
    mounted(){
        //值的初始化
        this.webList=[{
            imgUrl:webImg,
            name:"前端開發"
        },
        {
            imgUrl:webserviceImg,
            name:"後端開發"
        },
        {
            imgUrl:moveImg,
            name:"移動開發"
        },
        {
            imgUrl:dataImg,
            name:"資料庫"
        },
        {
            imgUrl:bigdataImg,
            name:"雲計算"
        }];

        this.courses=[{
            imgUrl:course1,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        },
        {
            imgUrl:course2,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        },
        {
            imgUrl:course3,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        },
        {
            imgUrl:course4,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        },
        {
            imgUrl:course5,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        },{
            imgUrl:course1,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        },
        {
            imgUrl:course2,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        },
        {
            imgUrl:course3,
            title:'實例秒解sed和ak的秘密',
            msg:'中級,330人在學'
        }]
    },
    components:{//註冊組件
        'v-header':Header,
        'v-list':List,
        'v-footer':Footer
    }
}
</script>

<style scoped>
    .home .nav{
       height:100px;
       padding-top:44px;
       background:#f3f5f7;
       overflow-x:scroll;
       white-space: nowrap;
       font-size:0; 
    }
    .nav li{
        width:88px;
        display:inline-block;
        text-align: center;
        font-size:14px;
    }
    .nav li img{
        display:block;
        width:32px;
        margin:20px auto 12px;
    }
</style>

 

詳情頁文件 detail.vue

 

<template>
    <div class="detail">
        <div class="video">
            <video src="http://v3.mukewang.com/shizhan/59f8498ae420e5be578b459b/H.mp4" controls="controls"></video>
            <router-link to="/">
            <div class="video-back"><</div>
            </router-link>
        </div>

        <ul class="nav">
            <li v-for="item in navArr">{{item}}</li>
        </ul>

        <div class="title">
            <h1>{{title}}</h1>
            <p>{{des}}</p>
        </div>

        <ul class="question">
            <li v-for="(item,index) in questionArr">
                <h1>{{arrTitle[index]}}</h1>
                <p v-html="item"></p><!-- 由於讀取的數據中存在html結構<br>,因此必須使用v-html -->
            </li>
        </ul>
    </div>
</template>

<style scoped>
    .detail{
        position: relative;
        height:3.82rem;
    }
    .video video{
        width:100%;
        height:100%;
    }
    .video-back{
        position:absolute;
        top:21px;
        left:16px;
        text-align: center;
        color:#fff;
        font-size:18px;
        line-height:32px;
        border-radius: 3px;
        width:32px;
        height:32px;
        background:rgba(0,0,0,.5);
    }
    .nav{
        position: relative;
        z-index:1;
        display:flex;
        box-shadow:0 2px 4px 0 rgba(0,0,0,0.1);
    }
    .nav li{
        flex:1;
        text-align:center;
        line-height:44px;
        height:44px;
        background:#fff;
        font-size:14px;
    }
    .title{
        padding: 24px 0 0 20px;
        margin-bottom: 8px;
    }
    .title h1{
        font-size: 16px;
        color: #2B333B ;
    }
    .title p{
        font-size: 14px;
        color: #71777D;
        padding : 16px 0 34px;
        width: 335px;
    }
    .question{
        padding: 20px;
        background: #fff;
        
    }
    .question li h1{
        font-size: 14px;
        color: #2B333B; 
    }
    .question li p{
        padding:12px 0 0 30px;
        font-size: 14px;
        color: #71777D ; 
    }
    .question li:nth-child(1){
        padding-bottom: 24px;
    }
</style>

<script>
export default {
    data(){
        return{
            navArr:[],
            title:"",
            des:"",
            questionArr:[],
            arrTitle:["課程須知","老師告訴你能學到什麼?"]
        }

    },
    mounted(){
        //真實開發中,這些數據需要通過後臺讀取
        this.navArr=["章節","詳情","評論","問答","記"];
        
        this.title = "iOS基礎教程之-Camera攝像頭";
        this.des = "從實例出發介紹我們的Camera,可以實現Camera屬性檢測,照片拍攝,視頻錄製,圖片展示,錄製視頻";
        
        this.questionArr=[
            "本課程適合客戶端產品經理,研發人員以及對iOS新特性感興趣的人群", 
            `
            (1)數位相機相關的所有API<br/> 
            (2)利用Camera實現相機的各種屬性檢測<br/> 
            (3)利用Camera拍照、保存、遍歷相冊等功能<br/>
            (4)利用Camera拍攝視頻、視頻剪切功能
            `
        ]
    }
}
</script>

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言 此內容由學習《JavaScript正則表達式迷你書(1.1版)》整理而來(於2020年3月30日看完)。此外還參考了MDN上關於Regex和String的相關內容,還有ECMAScript 6中關於正則的擴展內容,但不多。在文章末尾,會放上所有的鏈接。 迷你書共七章,我都做了相應的標號。不過我 ...
  • "TOC" 1. 增加元素 + 在數組開頭增加 + 通過unshift方法 + 註意點:該方法會返回增加後數組的長度 + 例如: + 含義:將data添加到arr數組的開頭 + 在數組末尾增加 + 通過push方法 + 註意點:該方法會返回增加後數組的長度 + 例如: + 含義:將data添加到ar ...
  • 你也許會覺得Web前端開發是一個很簡單的工作,但當你深入其中時,一定會發現好像Web前端開發不是那麼簡單,光網站性能優化、響應式、框架就讓你焦頭爛額。確實,做前端開發就是先易後難,想成為一個優秀的Web前端開發,沒有那麼簡單。不過,天下事難則不會,會則不難,你只需要掌握11項技能就可以成為Web前端 ...
  • 向組件中插入內容有2種方式 槽點 子組件 demo 使用槽點向組件中插入內容 Vue.component('Parent',{ template:` <!--反引號比引號更好用--> <div> <p>hello</p> <slot></slot> <!--如果後續要在組件中插入元素、內容,需要先留 ...
  • 如圖,想實現模糊查詢點擊文字賦值到搜索框,離開則關閉模糊查詢提示,但失去焦點時模糊查詢div隱藏就無法實現點擊賦值的事件了,這時候需要隱藏時判斷是否離開模糊查詢,附上代碼 //全局變數 var x,y; $(document).mousemove(function(e){ x = e.pageX; ...
  • [toc] 術語 1. web:互聯網。 2. w3c:萬維網聯盟,非盈利組織,官網:w3.org。為互聯網提供各種標準。 1. 代替網址:MDN:Mozilla Development Network。Mozilla開發者社區。有中文。 3. ISO:國際標準組織。 4. XML: 可擴展 的標記 ...
  • 很多讀者經常問我:愷哥,我怎麼樣才能進階前端呀?能推薦一些資料嘛? 首先我們定個基調,這裡的進階指的是讓自己成為厲害點的人,能夠找工作不難的人,相信大家都是想成為這樣的選手吧~ 其實大部分情況下你多學會了一門框架 / 庫的使用,或者多會了一門語言,確實能讓你做的事情更多了,但是離你真正實現技術進階還 ...
  • 將頁面拆分為多個組件,簡化了頁面開發,方便維護,組件也可以復用。 組件的類型 通用組件,比如表單、彈窗、菜單欄、分頁組件等 業務組件,實現某一業務的組件,比如抽獎組件 頁面組件,也叫做單頁,一個頁面就是一個組件,只完成功能,不復用 組件開發流程:聲明、註冊、使用 demo 組件使用流程 <div i ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...