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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...