Browse Source

初始项目

master
lillillli 3 years ago
parent
commit
d5f0140086
  1. 3
      .browserslistrc
  2. 29472
      package-lock.json
  3. 51
      package.json
  4. 15
      public/index.html
  5. 41
      src/App.vue
  6. BIN
      src/assets/img/1.png
  7. BIN
      src/assets/img/Frame01.png
  8. BIN
      src/assets/img/Frame02.png
  9. BIN
      src/assets/img/Mask01.png
  10. BIN
      src/assets/img/Mask02.png
  11. BIN
      src/assets/img/Rectangle2221.png
  12. BIN
      src/assets/img/Vector01.png
  13. BIN
      src/assets/img/Vector02.png
  14. BIN
      src/assets/img/bg.png
  15. BIN
      src/assets/img/bg01.png
  16. BIN
      src/assets/img/ray.png
  17. BIN
      src/assets/img/title.png
  18. 53
      src/components/HelloWorld.vue
  19. 98
      src/components/TimeComponent.vue
  20. 27
      src/main.js
  21. 83
      src/router/index.js
  22. 43
      src/utils/browser.js
  23. 370
      src/views/home.vue
  24. 260
      src/views/homeInfo.vue
  25. 16
      vue.config.js

3
.browserslistrc

@ -0,0 +1,3 @@
> 1%
last 2 versions
not dead

29472
package-lock.json

File diff suppressed because it is too large

51
package.json

@ -1,44 +1,25 @@
{ {
"name": "vue-tv-focusable", "name": "vue-tv-focusable-demo",
"version": "0.1.0", "version": "0.1.1",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
"build": "vue-cli-service build", "build": "vue-cli-service build"
"lint": "vue-cli-service lint"
}, },
"dependencies": { "dependencies": {
"core-js": "^3.8.3", "axios": "^0.26.1",
"vue": "^2.6.14", "core-js": "^3.6.5",
"vue-tv-focusable": "^1.0.8" "swiper": "^8.0.7",
"vue": "^2.6.11",
"vue-router": "^3.2.0",
"vue-tv-focusable": "^1.0.7"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.12.16", "@vue/cli-plugin-babel": "^4.5.0",
"@babel/eslint-parser": "^7.12.16", "@vue/cli-service": "^4.5.0",
"@vue/cli-plugin-babel": "~5.0.0", "less": "^3.0.4",
"@vue/cli-plugin-eslint": "~5.0.0", "less-loader": "^5.0.0",
"@vue/cli-service": "~5.0.0", "vue-loader": "^14.2.4",
"eslint": "^7.32.0", "vue-template-compiler": "^2.6.11"
"eslint-plugin-vue": "^8.0.3", }
"vue-template-compiler": "^2.6.14"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "@babel/eslint-parser"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
} }

15
public/index.html

@ -1,11 +1,20 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang=""> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title> <title>tv-focusable</title>
<script src="https://cdn.bootcss.com/vue/2.6.11/vue.min.js"></script>
<script src="https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js"></script>
<!---element-ui-->
<link href="https://cdn.bootcss.com/element-ui/2.9.2/theme-chalk/index.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/element-ui/2.6.1/index.js"></script>
<!---ant-design-vue-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/ant-design-vue/1.6.4/antd.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/ant-design-vue/1.6.4/antd.min.js"></script>
</head> </head>
<body> <body>
<noscript> <noscript>

41
src/App.vue

@ -1,28 +1,37 @@
<template> <template>
<div id="app"> <div id="app">
<img alt="Vue logo" src="./assets/logo.png"> <router-view />
<HelloWorld msg="Welcome to Your Vue.js App"/> <Home />
</div> </div>
</template> </template>
<script> <script>
import HelloWorld from './components/HelloWorld.vue' // import Home from "./views/home.vue";
export default { export default {
name: 'App', name: "App",
components: {
HelloWorld
} created() {},
} methods: {
// go(path) {
// this.$router.push({ path: path });
// setTimeout(() => {
// location.reload();
// }, 100);
// },
},
};
</script> </script>
<style> <style lang="less">
* {
margin: 0;
padding: 0;
list-style: none;
margin: auto;
}
#app { #app {
font-family: Avenir, Helvetica, Arial, sans-serif; width: 1280px;
-webkit-font-smoothing: antialiased; height: 720px;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
} }
</style> </style>

BIN
src/assets/img/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

BIN
src/assets/img/Frame01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

BIN
src/assets/img/Frame02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

BIN
src/assets/img/Mask01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/assets/img/Mask02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
src/assets/img/Rectangle2221.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
src/assets/img/Vector01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

BIN
src/assets/img/Vector02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

BIN
src/assets/img/bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
src/assets/img/bg01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
src/assets/img/ray.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
src/assets/img/title.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

53
src/components/HelloWorld.vue

@ -1,58 +1,15 @@
<template> <template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template> </template>
<script> <script>
export default { export default {
name: 'HelloWorld', name: 'Title',
props: {
msg: String
}
} }
</script> </script>
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped> <style scoped lang="less">
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style> </style>

98
src/components/TimeComponent.vue

@ -0,0 +1,98 @@
<template>
<div
style="display: flex; width: 410px; align-items: center; line-hegin: 1.8"
>
<p style="font-size: 44px; width: 110px; padding-right: 25px">
{{ nowDate }}
</p>
<div
style="
width: 95px;
text-align: center;
border-left: solid;
border-right: solid;
padding: 0 21px;
"
>
<p>{{ time }}</p>
<p style="margin-left: 30px">{{ nowWeek }}</p>
</div>
<div style="display: flex; width: 140px">
<img src="../assets/img/1.png" alt="" />
<div>
<p>{{ high }}-{{ low }}</p>
<div style="display: flex">
<p style="flex: 1">剑阁</p>
<p>{{ currentWeather.type }}</p>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "TimeComponent",
data() {
return {
nowDate: "", //
time: "", //
nowWeek: "",
currentWeather: {}, //
high: "",
low: "",
};
},
mounted() {
this.currentTime();
},
created() {
return this.$axios
.get("http://wthrcdn.etouch.cn/weather_mini?city=剑阁")
.then((response) => {
// console.log(response.data.data);
this.currentWeather = response.data.data.yesterday;
this.high = this.currentWeather.high.slice(3);
this.low = this.currentWeather.low.slice(3);
})
.catch(function (error) {
console.log(error);
});
},
methods: {
currentTime() {
setInterval(this.formatDate, 500);
},
formatDate() {
let date = new Date();
let year = date.getFullYear(); //
let month = date.getMonth() + 1; //
let day = date.getDate(); //
let week = date.getDay(); //
let weekArr = [
"星期日",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六",
];
let hour = date.getHours(); //
hour = hour < 10 ? "0" + hour : hour; //
let minute = date.getMinutes(); //
minute = minute < 10 ? "0" + minute : minute; //
let second = date.getSeconds(); //
second = second < 10 ? "0" + second : second; //
this.nowDate = ` ${hour}:${minute}`;
this.time = `${year}-${month}-${day}`;
this.nowWeek = weekArr[week];
},
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="less">
</style>

27
src/main.js

@ -1,9 +1,32 @@
import Vue from 'vue' import Vue from 'vue'
import App from './App.vue' import App from './App.vue'
import focusable from 'vue-tv-focusable'; import router from './router'
import axios from "axios"
import focusable from 'vue-tv-focusable'
Vue.use(focusable); Vue.use(focusable);
import TimeComponent from "@/components/TimeComponent.vue";
Vue.config.productionTip = false Vue.config.productionTip = false
Vue.prototype.$axios = axios
Vue.component("TimeComponent", TimeComponent); //注册组件
// 全局配置,可写可不写,不做配置的情况下就使用vue-tv-focusable默认的配置
const vm = new Vue();
vm.$tv.init({
KEYS: {
KEY_LEFT: [37], // ←
KEY_UP: [38], // ↑
KEY_RIGHT: [39], // →
KEY_DOWN: [40], // ↓
KEY_ENTER: [83, 13], // 83: s键 13:enter键
},
});
new Vue({ new Vue({
render: h => h(App), router,
render: h => h(App)
}).$mount('#app') }).$mount('#app')

83
src/router/index.js

@ -0,0 +1,83 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'Home',
component: () => import(/* webpackChunkName: "about" */ '../views/home.vue')
},
{
path: '/HomeInfo',
name: 'HomeInfo',
component: () => import(/* webpackChunkName: "about" */ '../views/homeInfo.vue')
},
// {
// path: '/Example1',
// name: 'Example1',
// component: () => import(/* webpackChunkName: "about" */ '../views/example1.vue')
// },
// {
// path: '/Example2',
// name: 'Example2',
// component: () => import(/* webpackChunkName: "about" */ '../views/example2.vue')
// },
// {
// path: '/Example3',
// name: 'Example3',
// component: () => import(/* webpackChunkName: "about" */ '../views/example3.vue')
// },
// {
// path: '/Example4',
// name: 'Example4',
// component: () => import(/* webpackChunkName: "about" */ '../views/example4.vue')
// },
// {
// path: '/Example5',
// name: 'Example5',
// component: () => import(/* webpackChunkName: "about" */ '../views/example5.vue')
// },
// {
// path: '/Example6',
// name: 'Example6',
// component: () => import(/* webpackChunkName: "about" */ '../views/example6.vue')
// },
// {
// path: '/Example8',
// name: 'Example8',
// component: () => import(/* webpackChunkName: "about" */ '../views/example8.vue')
// },
// {
// path: '/tv-detail8',
// name: 'tvDetail8',
// component: () => import(/* webpackChunkName: "about" */ '../views/example8-detail.vue')
// },
// {
// path: '/Example9',
// name: 'Example9',
// component: () => import(/* webpackChunkName: "about" */ '../views/example9.vue')
// },
// {
// path: '/Example10',
// name: 'Example10',
// component: () => import(/* webpackChunkName: "about" */ '../views/example10.vue')
// },
// {
// path: '/Example11',
// name: 'Example11',
// component: () => import(/* webpackChunkName: "about" */ '../views/example11.vue')
// },
// {
// path: '/Example12',
// name: 'Example12',
// component: () => import(/* webpackChunkName: "about" */ '../views/example12.vue')
// },
]
const router = new VueRouter({
routes
})
export default router

43
src/utils/browser.js

@ -0,0 +1,43 @@
// 获取IE版本
export const IEVersion = () => {
// 取得浏览器的userAgent字符串
const userAgent = navigator.userAgent;
// 判断是否为小于IE11的浏览器
const isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1;
// 判断是否为IE的Edge浏览器
const isEdge = userAgent.indexOf('Edge') > -1 && !isLessIE11;
// 判断是否为IE11浏览器
const isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1;
if (isLessIE11) {
const IEReg = new RegExp('MSIE (\\d+\\.\\d+);');
// 正则表达式匹配浏览器的userAgent字符串中MSIE后的数字部分,,这一步不可省略!!!
IEReg.test(userAgent);
// 取正则表达式中第一个小括号里匹配到的值
const IEVersionNum = parseFloat(RegExp['$1']);
if (IEVersionNum === 7) {
// IE7
return 7
} else if (IEVersionNum === 8) {
// IE8
return 8
} else if (IEVersionNum === 9) {
// IE9
return 9
} else if (IEVersionNum === 10) {
// IE10
return 10
} else {
// IE版本<7
return 6
}
} else if (isEdge) {
// edge
return 'edge'
} else if (isIE11) {
// IE11
return 11
} else {
// 不是ie浏览器
return -1
}
}

370
src/views/home.vue

@ -0,0 +1,370 @@
<template>
<div class="ancestor">
<!-- header -->
<div style="color: #ffffff; display: flex; height: 92px">
<div style="width: 50%; flex: 1">
<img src="../assets/img/title.png" alt="" />
</div>
<TimeComponent />
</div>
<!-- 导航栏 -->
<nav style="width: 100%; height: 70px">
<ul>
<li
v-for="(item, index) in navData"
:class="{ nav_li: active === index }"
:key="index"
>
{{ item.name }}     
</li>
</ul>
</nav>
<article class="home_article">
<section style="width: 520px" class="border">
<div class="home_slideshow">
<swiper>
<!-- <swiper-slide v-for="(item, index) in swiperList" :key="index">
<div class="swiper-item">
<img
class="swiper-image"
:src="item.url"
style="cursor: pointer; width: 520px; height: 393px"
/>
</div>
</swiper-slide> -->
</swiper>
</div>
<div class="home_inform">
<div
class="home_informOverall"
style="
background: linear-gradient(180deg, #32b3c5 0%, #2f948e 100%);
"
>
<img src="../assets/img/Frame01.png" alt="" />
<p style="width: 138px">通知信息</p>
</div>
<div
class="home_informOverall"
style="
background: linear-gradient(180deg, #367fc4 0%, #1c52ad 100%);
"
>
<img src="../assets/img/Frame02.png" alt="" />
<p style="width: 138px">雪亮工程</p>
</div>
</div>
</section>
<section style="width: 304px" class="border">
<div class="scenic">
<p class="_overall" style="background-color: rgb(0 0 0 / 46%)">
文化宣传
</p>
</div>
<div class="publicity">
<p class="_overall" style="background-color: rgb(0 0 0 / 53%)">
景区风采
</p>
</div>
<div class="box_section" @down="menuDown(item, $event)">
<div
class="information"
v-focusable
v-for="(item, index) in infoData"
:key="index"
>
<p
style="
width: 164px;
height: 51px;
margin-right: 8px;
font-size: 12px;
color: #ffffff;
"
>
{{ item.info }}
</p>
<img :src="item.print" alt="" style="width: 96px; height: 66px" />
</div>
</div>
</section>
<section style="width: 356px" class="border">
<div style="display: flex">
<div style="text-align: center; margin-right: 20px">
<figure
style="
background: linear-gradient(180deg, #e3b233 0%, #e17e22 100%);
"
>
<img src="../assets/img/Vector01.png" />
<figcaption style="color: #ffffff">疫情防控</figcaption>
</figure>
<figure
style="
background: linear-gradient(180deg, #3db542 0%, #178636 100%);
margin-top: 20px;
"
>
<img src="../assets/img/Vector02.png" />
<figcaption style="color: #ffffff">我的村组</figcaption>
</figure>
</div>
<div
style="
width: 218px;
height: 364px;
border: solid red;
border-radius: 10px;
"
></div>
</div>
<div class="right_section">
<div class="right_sectionBox">
<div class="right_sectionNest">
<p>剑阁县推广大豆玉米兼容发展 一地双丰收模式</p>
<p style="color: #798190">2022年03月11日 11:35</p>
</div>
</div>
</div>
</section>
</article>
</div>
</template>
<script>
// import { Swiper, SwiperSlide, directive } from "vue-awesome-swiper";
// import "swiper/css/swiper.css";
export default {
name: "Home",
data() {
return {
active: 0,
navData: [
{ name: "首页" },
{ name: "农民夜校" },
{ name: "慢直播" },
{ name: "党建引领" },
{ name: "资讯服务" },
{ name: "办事指南" },
{ name: "我的服务" },
],
infoData: [
{
info: "近日,剑阁县龙源镇纪委联合镇疫情防控领导专班深入场镇干单位、村(社区)开展疫...",
print: require("../assets/img/Rectangle2221.png"),
},
{
info: "近日,剑阁县龙源镇纪委联合镇疫情防控领导专班深入场镇干单位、村(社区)开展疫...",
print: require("../assets/img/Rectangle2221.png"),
},
{
info: "近日,剑阁县龙源镇纪委联合镇疫情防控领导专班深入场镇干单位、村(社区)开展疫...",
print: require("../assets/img/Rectangle2221.png"),
},
],
swiperList: [
{ url: require("../assets/img/bg.png") },
{ url: require("../assets/img/bg.png") },
{ url: require("../assets/img/bg.png") },
],
};
},
// components: {
// Swiper,
// SwiperSlide,
// directive,
// },
created() {
this.$nextTick(() => {
console.log(this.$tv);
this.$tv.reset();
this.$tv.setScrollEl(document.querySelector(".box_section"));
// this.$tv.setScrollEl(this.$tv.getElementByPath('//div[@class="demo"]'));
// this.$tv.requestFocus(this.$refs.fo5);
});
},
destroyed() {
// initinit
this.$tv.resetScrollEl();
// this.$tv.distanceToCenter = false;
},
methods: {
menuDown(item) {
// console.log(item,event);
//menuitem
// if (item == 10) {
// this.$tv.requestFocus(event.target);
// }
},
},
};
</script>
<style scoped lang="less">
p {
margin: 0px;
}
.ancestor {
background: url("../assets/img/bg.png");
width: 1280px;
height: 720px;
padding: 0px 32px 32px 32px;
box-sizing: border-box;
}
.home_article {
width: 100%;
height: 511px;
margin-top: 15px;
display: flex;
align-items: center;
justify-content: space-between;
//
.home_slideshow {
width: 520px;
height: 390px;
border: solid red;
border-radius: 10px;
}
//
.home_inform {
width: 520px;
color: #ffffff;
font-size: 24px;
display: flex;
align-items: center;
margin-top: 20px;
justify-content: space-between;
}
.home_informOverall {
width: 250px;
height: 99px;
display: flex;
align-items: center;
border-radius: 10px;
margin: 0;
}
}
ul {
line-height: 70px;
color: #798190;
font-size: 18px;
display: flex;
}
li {
width: 148px;
text-align: center;
}
.nav_li {
background: url("../assets/img/ray.png");
color: #fff;
width: 148px;
height: 73px;
text-align: center;
font-size: 20px;
}
.border {
margin: 0;
height: 511px;
}
.information {
display: flex;
align-items: center;
height: 67px;
margin-bottom: 16px;
}
.scenic {
position: relative;
width: 300px;
height: 128px;
border-radius: 10px;
background: url("../assets/img/Mask01.png");
}
.publicity {
position: relative;
width: 300px;
height: 128px;
border-radius: 10px;
margin-top: 18px;
margin-bottom: 20px;
background: url("../assets/img/Mask02.png");
}
//
._overall {
color: aliceblue;
background-color: rgb(0 0 0 / 41%);
height: 40px;
width: 294px;
border-radius: 0px 0px 4px 4px;
text-align: center;
line-height: 40px;
position: absolute;
bottom: 0px;
}
.box_section {
overflow: hidden;
width: 300px;
height: 221px;
box-sizing: border-box;
padding: 16px;
overflow-y: hidden;
border-radius: 10px;
background: linear-gradient(180deg, #163d7e 0%, #1d3256 100%);
}
figure {
width: 118px;
height: 172px;
line-height: 3;
padding-top: 35px;
box-sizing: border-box;
border-radius: 10px;
}
.right_section {
width: 356px;
height: 125px;
border-radius: 10px;
margin-top: 20px;
background: url("../assets/img/Mask02.png");
//
.right_sectionBox {
width: 100%;
height: 128px;
color: #ffffff;
background: linear-gradient(
270deg,
#163d7e 45%,
rgba(196, 196, 196, 0) 120.18%
);
filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25));
border-radius: 8px;
padding: 20px;
box-sizing: border-box;
}
.right_sectionNest {
padding-left: 170px;
width: 154px;
height: 85px;
font-weight: 400;
font-size: 14px;
line-height: 1.6;
}
}
</style>

260
src/views/homeInfo.vue

@ -0,0 +1,260 @@
<template>
<div class="ancestor">
<div style="color: #ffffff; display: flex; height: 92px">
<div style="width: 50%; flex: 1">
<h1 style="font-size: 26px; font-weight: 400; margin-left: 53px">
双旗村摄像头
</h1>
</div>
<TimeComponent />
</div>
<div class="demo">
<div class="menu">
<!-- onFocus:聚焦 up: down: right: v-focusable-->
<div
@onFocus="menuFocus(i)"
@up="menuUp(i, $event)"
@down="menuDown(i, $event)"
@right="menuRight"
v-focusable
class="item"
v-for="i in list"
:key="i"
>
<div
style="
display: flex;
height: 72px;
align-items: center;
color: #ffffff;
"
>
<div
style="
font-size: 12px;
border: 1px solid;
width: 38px;
height: 19px;
margin-left: 46px;
margin-right: 24px;
"
>
{{ i.state == 0 ? "离线" : "在线" }}
</div>
<p style="margin-left: 0">{{ i.name }}</p>
</div>
</div>
</div>
<div v-focusable class="content" v-for="index in contentCount" :key="index" @down="contentDown(index, $event)">
<div
@onFocus="contentFocus"
@up="contentUp(index, $event)"
@down="contentDown(index, $event)"
@left="contentLeft(index)"
class="item"
v-focusable
>
<img
src="../assets/img/bg01.png"
alt=""
style="width: 865px; height: 480px;"
/>
</div>
<div class="contentInfo">
{{ currentMenu }}
摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄像头信息摄
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Example6",
data() {
return {
currentMenu: 0,
contentCount: 1,
list: [
{
id: 1,
name: "摄像头1",
state: 1,
},
{
id: 2,
name: "摄像头1",
state: 1,
},
{
id: 3,
name: "摄像头1",
state: 1,
},
{
id: 4,
name: "摄像头1",
state: 1,
},
],
state: 0,
};
},
created() {
this.$nextTick(() => {
this.$tv.requestFocus(
this.$tv.getElementByPath(
'//div[@class="demo"]/div[@class="menu"]/div[1]'
)
);
});
},
destroyed() {
//
this.$tv.reset();
},
methods: {
menuFocus(i) {
//menu
this.currentMenu = i;
this.$tv.setScrollEl(this.$tv.getElementByPath("//div[@class='menu']"));
},
contentFocus() {
//
this.$tv.setScrollEl(
this.$tv.getElementByPath("//div[@class='content']")
);
},
menuUp(i, event) {
//menu
if (i == 1) {
this.$tv.requestFocus(event.target);
}
},
menuDown(i, event) {
//menuitem
if (i == 10) {
this.$tv.requestFocus(event.target);
}
},
menuRight() {
//menu
this.$tv.requestFocus(
this.$tv.getElementByPath("//div[@class='content']/div[1]"),
false
);
},
contentDown(index, event) {
if (this.contentCount - index < 3) {
//,
this.$tv.requestFocus(event.target);
}
console.log(event);
},
contentLeft(i) {
if (i % 3 == 1) {
//menuitem
this.$tv.requestFocus(
this.$tv.getElementByPath(
`//div[@class='menu']/div[${this.currentMenu}]`
),
false
);
}
},
contentUp(index, event) {
if (index <= 3) {
this.$tv.requestFocus(event.target);
}
},
},
};
</script>
<style lang="less" scoped>
.ancestor {
background: url("../assets/img/bg01.png");
width: 1280px;
height: 720px;
padding: 0px 32px 32px 0px;
box-sizing: border-box;
}
.demo {
text-align: center;
margin: 0 auto;
display: flex;
flex-direction: row;
.content {
width: 870px;
height: 600px;
// overflow: auto;
margin-left: 59px;
// background-color: bisque;
.item {
width: 870px;
height: 488px;
display: inline-block;
box-sizing: border-box;
vertical-align: top;
border: solid red;
border-radius: 10px;
margin-bottom: 16px;
color: aliceblue;
}
.contentInfo {
width: 870px;
height: 92px;
background: #ffffff12;
border-radius: 5.7px;
overflow: auto;
text-align: justify;
color: aliceblue;
padding: 16px 24px;
box-sizing: border-box;
}
}
.menu {
width: 331px;
height: 580px;
overflow: hidden;
padding: 20px;
padding-top: 0px;
margin: 0px;
border-right: 1px solid #ffffff63;
padding-right: 0;
.item {
width: 100%;
height: 72px;
box-sizing: border-box;
display: inline-block;
// background: rgba(255, 255, 255, 0.08);
// color: rgb(255, 165, 100);
margin-bottom: 8px;
}
}
}
.focus {
// transform: scale(1);
font-size: 28px;
div,
p {
color: #ffa564;
}
}
</style>

16
vue.config.js

@ -1,4 +1,12 @@
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({ module.exports = {
transpileDependencies: true publicPath: "./",
}) configureWebpack: {
externals: {
'vue': 'Vue',
// 'element-ui': 'ELEMENT',
// 'ant-design-vue':'antd',
'moment': 'moment'
}
},
}
Loading…
Cancel
Save