上一篇:
vue实战入门基础篇八:从零开始仿门户网站实例-全局检索实现
https://blog.csdn.net/m0_37631110/article/details/123045374一、目录
第一篇:前期准备工作
第二篇:开发框架搭建
第三篇:公共组件实现
第四篇:网站首页实现
第五篇:关于我们实现
第六篇:新闻资讯实现
第七篇:业务介绍及加入我们实现
第八篇:全局检索实现
第九篇:移动端界面适配
第十篇:代码重构并发布项目
二、适配方式
移动端适配方式总结:
- 尺寸尽量写成百分比自适应的方式。
- 通过js代码判断浏览器类型是否是移动端的。
- 可以根据js代码引入不同的css样式定义文件,实现界面的适配。
- 可以使用vue的css动态设定来实现样式的适配,具体如下:
2.1演示视频
vue实战入门基础篇九:移动端界面适配
2.2效果预览
2.3适配引入:
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="applicable-device" content="mobile">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
2.4判断浏览器是否是移动端
_isMobile() { //判断是否是移动端
let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
return flag;
}
2.5首页移动端适配代码
首页代码:
<script>
import Swiper from 'swiper';
import 'swiper/dist/css/swiper.min.css';
export default {
data() {
return {
left: 0,
banerHeight: '573px',
news_tab: 1,
ismobel: navigator.userAgent.match(
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
),
news: [{
id: 1,
title: '外媒:乌总统公布最新伤亡数字',
date: '02-02',
img: './src/assets/img001.png',
content: '【俄乌开战第二日最新局势图】财联社2月25日电,俄罗斯与乌克兰武装冲突昨日正式开始后,开战已超24小时。'
}, {
id: 2,
title: '外媒:乌总统公布最新伤亡数字',
date: '02-03',
img: './src/assets/img002.png',
content: '【俄乌开战第二日最新局势图】财联社2月25日电,俄罗斯与乌克兰武装冲突昨日正式开始后,开战已超24小时。'
}, {
id: 3,
title: '外媒:乌总统公布最新伤亡数字',
date: '02-04',
img: './src/assets/img003.png',
content: '【俄乌开战第二日最新局势图】财联社2月25日电,俄罗斯与乌克兰武装冲突昨日正式开始后,开战已超24小时。'
}],
inner_width: 1024,
cases: [
[{
id: 1,
name: '百度一下',
logo: './src/assets/img009.png'
}, {
id: 2,
name: '百度一下',
logo: './src/assets/img010.png'
}, {
id: 3,
name: '百度一下',
logo: './src/assets/img011.png'
}, {
id: 4,
name: '百度一下',
logo: './src/assets/img012.png'
}],
[{
id: 5,
name: '百度一下',
logo: './src/assets/img013.png'
}, {
id: 6,
name: '百度一下',
logo: './src/assets/img014.png'
}, {
id: 7,
name: '百度一下',
logo: './src/assets/img015.png'
}, {
id: 8,
name: '百度一下',
logo: './src/assets/img016.png'
}]
],
tabitemsPaddingTop: '30px',
tabitemsPaddingBottom: '30px',
aboutPanelPaddingTop: '50px',
aboutPanelPaddingBottom: '50px',
directionPanelPaddingTop: '100px',
directionPanelPaddingTop: '100px',
}
},
computed: {
},
mounted() {
this.inner_width = document.querySelector(".inner").offsetWidth;
if (this.ismobel) {
this.tabitemsPaddingTop = '10px';
this.tabitemsPaddingBottom = '10px';
this.aboutPanelPaddingTop = '10px';
this.aboutPanelPaddingBottom = '10px';
this.directionPanelPaddingTop = '10px';
this.directionPanelPaddingTop = '10px';
this.banerHeight = "400px";
this.left = -((1340 - this.inner_width) / 2);
}
var mySwiper = new Swiper('.swiper-container', {
autoplay: 3000, //可选选项,自动滑动
pagination: '.swiper-pagination',
height: this.banerHeight, //你的slide高度
lazyLoading: true,
lazyLoadingInPrevNext: true,
// loop : true,
effect: 'fade',
fade: {
crossFade: false,
}
})
},
methods: {
newstab: function(index) { //点击后打开新闻详情页并传递id
this.news_tab = index;
this.news = [{
id: 1,
title: 'XXX项目已近发布' + new Date().getTime(),
date: '02-02',
img: './src/assets/img001.png',
content: '【俄乌开战第二日最新局势图】财联社2月25日电,俄罗斯与乌克兰武装冲突昨日正式开始后,开战已超24小时。'
}, {
id: 2,
title: '外媒:乌总统公布最新伤亡数字',
date: '02-03',
img: './src/assets/img002.png',
content: '【俄乌开战第二日最新局势图】财联社2月25日电,俄罗斯与乌克兰武装冲突昨日正式开始后,开战已超24小时。'
}, {
id: 3,
title: '外媒:乌总统公布最新伤亡数字',
date: '02-04',
img: './src/assets/img003.png',
content: '【俄乌开战第二日最新局势图】财联社2月25日电,俄罗斯与乌克兰武装冲突昨日正式开始后,开战已超24小时。'
}];
this.$forceUpdate();
},
opennews: (app, id) => { //点击后打开新闻详情页并传递id
app.$router.push("Detail?id=" + id)
},
openPage: (app, page) => {
app.$router.push(page)
}
}
}
</script>
<template>
<div>
<div>
<div class="banner">
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="banner_item">
<img src="../assets/banner1.png" style="height: 100%;position: relative;"
:style="{left:left+'px'}" />
</div>
</div>
<div class="swiper-slide">
<div class="banner_item">
<img src="../assets/banner2.png" style="height: 100%;position: relative;"
:style="{left:left+'px'}" />
</div>
</div>
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
</div>
</div>
<div class="news">
<div class="inner">
<div class="title">
<span class="line"></span>
<span>新闻资讯</span>
<span class="sub_title">/NEWS</span>
</div>
<div class="pannel">
<div class="tabs flex">
<div class="flex-item">
<div class="tab_item " @click="newstab(1)" :class="{tab_item_active:news_tab==1}">
<div>公司新闻</div>
</div>
<div class="tab_item" @click="newstab(2)" :class="{tab_item_active:news_tab==2}">
<div>项目动态</div>
</div>
</div>
<div class="more_btn_pannel" v-if="!ismobel">
<span class="more_btn" @click="openPage(this,'News')">MORE</span>
</div>
</div>
<div class="tabitems " :class="{flex:!ismobel}">
<div class=" flex" v-if="!ismobel" v-for="(item, index) in news"
:style="{ width: ((inner_width)/3) + 'px' }" :key="item.id">
<div v-if="index!=0" class="news_item_split"></div>
<div class="item "
:style="{ width: (((inner_width)/3)-((index==0||index==(news.length-1))?15:30)-60) + 'px' }"
@click="opennews(this,item.id)">
<div class="item_panel">
<div class="new_title">{{item.title}}</div>
<div class="">
<img :src="item.img" />
</div>
<div class="date">
{{item.date}}
</div>
<div class="desc">
{{item.content}}
</div>
</div>
</div>
<div v-if="index!=news.length-1" class="news_item_split"></div>
</div>
<div class=" " v-if="ismobel" v-for="(item, index) in news" :key="item.id">
<div class="item mobelitem " @click="opennews(this,item.id)">
<div class="item_panel flex">
<div style="width:100px;">
<img :src="item.img" />
</div>
<div class="flex-item" style="padding-left:10px">
<div class="new_title">{{item.title}}</div>
<div class="desc">
{{item.content}}
</div>
<div class="date">
{{item.date}}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="about">
<div class="inner">
<div class="title flex">
<div class="flex-item">
<span class="line"></span>
<span>关于我们</span>
<span class="sub_title">/ABOUT US</span>
</div>
<div class="more_btn_pannel" v-if="!ismobel">
<span class="more_btn" @click="openPage(this,'About')">MORE</span>
</div>
</div>
<div class="flex about_panel" v-if="!ismobel">
<div class="flex-item img">
<img src="../assets/img004.png">
</div>
<div class="flex-item about_desc">
<div class="about_title">贝贝网络科技有限公司(简称:贝贝网络)</div>
<div class="about_line flex">
<div class="about_filed">
创 始 人:
</div>
<div class="flex-item about_filed_value">军军君</div>
</div>
<div class="about_line flex">
<div class="about_filed">
公司理念:
</div>
<div class="flex-item about_filed_value">公司专注于互联网IT开发,坚持科技创新,开拓市场,做一个有温度的科技公司</div>
</div>
<div class="about_line flex">
<div class="about_filed">
公司简介:
</div>
<div class="flex-item about_filed_value">
贝贝网络科技有限公司成立于19xx年,是一家专注于xx产品和...产品研究、开发、生产及销售的高科技企业,总部及研发基地设立于……
</div>
</div>
</div>
</div>
<div class=" about_panel" v-if="ismobel">
<div class=" img" style="margin-top: 10px;">
<img src="../assets/img004.png" style="width: 100%;">
</div>
<div class="about_desc" style="padding-left: 0px;">
<div class="about_title">贝贝网络科技有限公司(简称:贝贝网络)</div>
<div class="about_line flex">
<div class="about_filed">
创 始 人:
</div>
<div class="flex-item about_filed_value">军军君</div>
</div>
<div class="about_line flex">
<div class="about_filed">
公司理念:
</div>
<div class="flex-item about_filed_value">公司专注于互联网IT开发,坚持科技创新,开拓市场,做一个有温度的科技公司</div>
</div>
<div class="about_line flex">
<div class="about_filed">
公司简介:
</div>
<div class="flex-item about_filed_value">
贝贝网络科技有限公司成立于19xx年,是一家专注于xx产品和...产品研究、开发、生产及销售的高科技企业,总部及研发基地设立于……
</div>
</div>
</div>
</div>
</div>
</div>
<div class="direction">
<div class="inner">
<div class="title">
<span class="line"></span>
<span>业务方向</span>
<span class="sub_title">/DIRECTION</span>
</div>
<div class="pannel">
<div class="flex" v-if="!ismobel">
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img005.png">
</div>
<div>
<div class="direction_title">互联网领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
<div class="direction-item-split"></div>
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img006.png">
</div>
<div>
<div class="direction_title">智慧物联网领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
<div class="direction-item-split"></div>
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img007.png">
</div>
<div>
<div class="direction_title">元宇宙领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
<div class="direction-item-split"></div>
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img008.png">
</div>
<div>
<div class="direction_title">智能农业领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
</div>
<div v-if="ismobel">
<div class="flex">
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img005.png">
</div>
<div>
<div class="direction_title">互联网领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img006.png">
</div>
<div>
<div class="direction_title">智慧物联网领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
</div>
<div class="flex" style="margin-top: 20px;">
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img007.png">
</div>
<div>
<div class="direction_title">元宇宙领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
<div class="flex-item direction_item">
<div class="icon">
<img src="../assets/img008.png">
</div>
<div>
<div class="direction_title">智能农业领域</div>
<div class="direction_esc">贝贝网络会利于互联网领域的创新开发,科技创新,共同升级提高</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="case">
<div class="inner">
<div class="flex title">
<div class="flex-item">
<span class="line"></span>
<span>成功案例</span>
<span class="sub_title">/CASE</span>
</div>
<div class="more_btn_pannel" v-if="!ismobel">
<span class="more_btn" @click="openPage(this,'Case')">MORE</span>
</div>
</div>
<div class="pannel">
<div v-if="!ismobel" class="line flex" v-for="(item, index) in cases" :key="item.id">
<div class=" flex" v-for="(subitem, subindex) in item"
:style="{ width: ((inner_width)/4) + 'px' }" :key="subitem.id">
<div v-if="subindex!=0" class="case_item_split"></div>
<div class="case_item"
:style="{width: (((inner_width)/4)-((subindex==0||subindex==(item.length-1))?15:30)-10) + 'px',height: (inner_width-30*3)/4+'px'}">
<div class="case_item_inner">
<div class="case_item_logo"
:style="{height: ((inner_width-30*3)/4 - 80)+'px',lineHeight: ((inner_width-30*3)/4 - 60)+'px'}">
<img :src="subitem.logo">
</div>
<div class="desc">{{subitem.name}}</div>
</div>
</div>
<div v-if="index!=item.length-1" class="case_item_split"></div>
</div>
</div>
<div v-if="ismobel" class="line" v-for="(item, index) in cases" :key="item.id">
<div class=" " v-for="(subitem, subindex) in item" :key="subitem.id">
<div class="case_item" style="" :style="{height: (inner_width-30*3)/2+'px'}">
<div class="case_item_inner">
<div class="case_item_logo"
:style="{height: ((inner_width-30*3)/2 - 80)+'px',lineHeight: ((inner_width-30*3)/2 - 60)+'px'}">
<img :src="subitem.logo" style="width: 20%;margin-top: 20px;">
</div>
<div class="desc">{{subitem.name}}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="team">
<div class="inner">
<div class="title">
<span class="line"></span>
<span>团队介绍</span>
<span class="sub_title">/TEAM</span>
</div>
<div class="pannel">
<div class="desc" v-if="!ismobel">
贝贝网络科技有限公司成立于19xx年,是一家专注于xx产品和...产品研究、开发、生产及销售的高科技企业,总部及研发基地设立于风景秀丽的广州软件园,并在全国各地设有分支机构。公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业。公司自成立以来,始终坚持以人才为本、诚信立业的经营原则,荟萃业界精英,将国外先进的信息技术、管理方法及企业经验与国内企业的具体实际相结合,为企业供给全方位的解决方案…
</div>
<div class="flex line" v-if="!ismobel">
<div class="flex-item team_item">
<div class="header">
<img src="../assets/img016.png" />
</div>
<div class="team_item_title">军军君</div>
<div class="team_item_desc">
<span>创始人</span>
<span>董事长</span>
</div>
</div>
<div class="team_item_split"></div>
<div class="flex-item team_item">
<div class="header">
<img src="../assets/img016.png" />
</div>
<div class="team_item_title">军军君</div>
<div class="team_item_desc">
<span>创始人</span>
<span>董事长</span>
</div>
</div>
<div class="team_item_split"></div>
<div class="flex-item team_item">
<div class="header">
<img src="../assets/img016.png" />
</div>
<div class="team_item_title">军军君</div>
<div class="team_item_desc">
<span>创始人</span>
<span>董事长</span>
</div>
</div>
</div>
<div class="desc" v-if="ismobel"
style="line-height: 25px;height: 75px;overflow: hidden;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;overflow: hidden;">
贝贝网络科技有限公司成立于19xx年,是一家专注于xx产品和...产品研究、开发、生产及销售的高科技企业,总部及研发基地设立于风景秀丽的广州软件园,并在全国各地设有分支机构。公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业。公司自成立以来,始终坚持以人才为本、诚信立业的经营原则,荟萃业界精英,将国外先进的信息技术、管理方法及企业经验与国内企业的具体实际相结合,为企业供给全方位的解决方案…
</div>
<div class=" line" v-if="ismobel" style="padding-top:10px">
<div class=" team_item" style="padding-top: 10px;padding-bottom: 10px;">
<div class="header">
<img src="../assets/img016.png" />
</div>
<div class="team_item_title">军军君</div>
<div class="team_item_desc">
<span>创始人</span>
<span>董事长</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<style>
.banner {
height: v-bind(banerHeight);
overflow: hidden;
/* 后续此处的高度可以根据图片的大小进行换算 */
}
.swiper-container {
width: 100%;
height: v-bind(banerHeight);
}
.swiper-container .banner_item {
height: v-bind(banerHeight);
position: relative;
}
.title {
height: 60px;
line-height: 60px;
border-bottom: 1px solid #b5b5b5;
}
.title .line {
display: inline-block;
width: 2px;
height: 30px;
margin-right: 15px;
background: #f85c29;
vertical-align: middle;
}
.title span {
font-size: 22px;
}
.title sub_title {
font-size: 16px;
color: #999999
}
.news {
background: #fff;
padding-bottom: v-bind(tabitemsPaddingTop);
}
.tabs {
height: 60px;
line-height: 60px;
}
.tabs .tab_item {
height: 100%;
width: 100px;
text-align: center;
font-size: 18px;
display: inline-block;
cursor: pointer;
}
.tabs .tab_item:hover {
color: #f85c29;
}
.tabs .tab_item_active {
color: #f85c29;
border-bottom: 2px solid #f85c29;
}
.more_btn_pannel {
width: 80px;
}
.more_btn_pannel .more_btn {
display: inline-block;
border: 1px solid #f85c29;
text-align: center;
height: 30px;
line-height: 30px;
font-size: 16px;
cursor: pointer;
width: 80px;
color: #f85c29;
border-radius: 30px;
}
.more_btn_pannel .more_btn:hover {
color: #fff;
background: #f85c29;
}
.news .tabitems {
padding-top: v-bind(tabitemsPaddingTop);
padding-bottom: v-bind(tabitemsPaddingBottom);
}
.news .news_item_split {
width: 15px;
height: 100px;
}
.news .item {
background: #f8f8f8;
border-radius: 3px;
border: 2px solid #efefef;
padding: 30px;
cursor: pointer;
box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.1);
}
.news .mobelitem {
background: #f8f8f8;
border-radius: 0px;
border: none;
border-botom: 1px solid #efefef;
cursor: pointer;
box-shadow: none;
padding: 5px 10px;
}
.news .item:hover {
border: 2px solid #f85c29;
}
.news .mobelitem:hover {
border: none;
border-botom: 1px solid #efefef;
}
.news .item .new_title {
height: 30px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 30px;
font-size: 16px;
font-weight: bold;
}
.news .mobelitem .new_title {}
.news .item .img_panel {
height: 243px;
}
.news .mobelitem .img_panel {
height: 150px;
}
.news .item img {
width: 100%;
}
.news .mobelitem img {
width: 100%;
height: 80%;
margin-top: 10%;
}
.news .item .date {
height: 30px;
line-height: 30px;
font-size: 14px;
color: #999
}
.news .item .desc {
line-height: 25px;
font-size: 14px;
color: #999
}
.news .mobelitem .desc {
line-height: 20px;
max-height: 40px;
display: -webkit-box;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.news .mobelitem .img_panel {
height: 150px;
}
.about {
padding-top: v-bind(tabitemsPaddingTop);
background: #f8f8f8;
}
.about .about_panel {
padding-top: v-bind(aboutPanelPaddingTop);
padding-bottom: v-bind(aboutPanelPaddingBottom);
}
.about .about_panel .img {
vertical-align: middle;
}
.about .about_panel .img img {
vertical-align: middle;
width: 100%;
}
.about .about_panel .about_desc {
padding-left: 30px;
}
.about .about_panel .about_desc .about_title {
line-height: 45px;
height: 45px;
font-size: 22px;
color: #000
}
.about .about_panel .about_desc .about_line {
line-height: 45px;
vertical-align: middle;
}
.about .about_panel .about_desc .about_filed {
color: #999
}
.about .about_panel .about_desc .about_filed_value {
color: #000;
}
.direction {
padding-top: 25px;
}
.direction .pannel {
padding-top: v-bind(directionPanelPaddingTop);
padding-bottom: v-bind(directionPanelPaddingBottom);
}
.direction .pannel .icon {
text-align: center;
}
.direction .pannel .icon img {
width: 50%;
}
.direction .pannel .direction_title {
text-align: center;
font-size: 20px;
font-weight: bold;
height: 45px;
line-height: 45px;
}
.direction .pannel .direction_desc {
font-size: 16px;
height: 35px;
line-height: 35px;
color: #999;
}
.direction .pannel .direction-item-split {
width: 1px;
background: #B5B5B5;
}
.direction .pannel .direction_item {
padding: 25px;
}
.case {
padding-top: 25px;
background: #f5f5f5;
}
.case .pannel {
padding-top: v-bind(aboutPanelPaddingTop);
padding-bottom: v-bind(aboutPanelPaddingBottom);
}
.case .line {
margin-bottom: 20px;
}
.case .line .case_item_split {
width: 15px;
height: 10px;
}
.case .line .case_item {}
.case .line .case_item .case_item_inner {
background: #fff;
cursor: pointer;
border: 1px solid #f8f8f8;
box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.1);
border-radius: 3px;
}
.case .line .case_item .case_item_inner:hover {
box-shadow: 0 0 10px 5px rgba(248, 92, 41, 0.3);
}
.case .line .case_item .case_item_inner .case_item_logo {
text-align: center;
vertical-align: middle;
align-items: center
}
.case .line .case_item .case_item_inner .case_item_logo img {
max-width: 100%;
align-items: center
}
.case .line .case_item .case_item_inner .desc {
text-align: center;
height: 60px;
line-height: 60px;
color: #999;
}
.team {
padding-top: 25px;
}
.team .pannel {
padding-bottom: 50px;
}
.team .pannel .desc {
line-height: 35px;
font-size: 16px;
text-indent: 2em
}
.team .pannel .line {
padding-top: 50px;
}
.team .pannel .line .team_item_split {
width: 50px;
height: 100px;
}
.team .pannel .line .team_item {
background: #f8f8f8;
padding-top: 50px;
padding-bottom: 50px;
}
.team .pannel .line .team_item .header {
text-align: center;
vertical-align: middle;
}
.team .pannel .line .team_item .header img {
text-align: center;
}
.team .pannel .line .team_item .team_item_title {
text-align: center;
height: 45px;
line-height: 45px;
font-size: 20px;
}
.team .pannel .line .team_item .team_item_desc {
text-align: center;
height: 35px;
line-height: 35px;
font-size: 18px;
color: #816b53;
}
</style>
顶部导航栏代码:
<script setup>
import Menu from "./Menu.vue"
import Search from "./Search.vue"
var menu_bar_width = "600px";
var search_bar_width = "300px";
let flag = navigator.userAgent.match(
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
);
if (flag) {
menu_bar_width = '40px';
search_bar_width = "0";
}
</script>
<template>
<div class="top_bar">
<div class="inner">
<div class="flex">
<div class="logo">
<img src="../assets/logo.png" />
</div>
<div class="flex-item flex">
<div class="flex-item"></div>
<div class="menu_bar">
<Menu></Menu>
</div>
</div>
<div class="search_bar" v-if="!flag">
<Search></Search>
</div>
</div>
</div>
</div>
</template>
<style scoped>
.top_bar {
height: 60px;
line-height: 60px;
border-bottom: 1px solid #eeefff;
}
.top_bar .inner {}
.top_bar .inner .logo {
height: 60px;
}
.top_bar .inner .logo img {
height: 40px;
vertical-align: middle;
}
.top_bar .inner .menu_bar {
width: v-bind(menu_bar_width);
}
.top_bar .inner .search_bar {
width: v-bind(search_bar_width);
}
</style>
菜单代码:
<template>
<ul class="items" v-if="!_isMobile()">
<li class="menu_item">
<router-link class="menu_item" active-class="menu_item_active" to="/Index">首页</router-link>
</li>
<li class="menu_item">
<router-link class="menu_item" active-class="menu_item_active" to="/News">新闻资讯</router-link>
</li>
<li class="menu_item about_menu" @mouseover="menuImgChagne('about','1')" @mouseout="menuImgChagne('about','2')">
<div class="flex" :class="{menu_item_active:isabout}">
<div class="flex-item">关于我们</div>
<img :src="aboutMenuIconSrc">
</div>
<div class="menu_subpanel" style="">
<div class="menu_sub_item">
<router-link class="menu_item" active-class="menu_item_active" to="/About">
公司介绍
</router-link>
</div>
<div class="menu_sub_item">
<router-link class="menu_item" active-class="menu_item_active" to="/Corporate">
企业文化
</router-link>
</div>
<div class="menu_sub_item">
<router-link class="menu_item" active-class="menu_item_active" to="/Team">
团队介绍
</router-link>
</div>
</div>
</li>
<li class="menu_item case_menu" @mouseover="menuImgChagne('case','1')" @mouseout="menuImgChagne('case','2')">
<div class="flex" :class="{menu_item_active:iscase}">
<div class="flex-item">业务介绍</div>
<img :src="caseMenuIconSrc">
</div>
<div class="menu_subpanel" style="">
<div class="menu_sub_item">
<router-link class="menu_item" active-class="menu_item_active" to="/Service">
业务介绍
</router-link>
</div>
<div class="menu_sub_item">
<router-link class="menu_item" active-class="menu_item_active" to="/Case">
成功案例
</router-link>
</div>
</div>
</li>
<li class="menu_item">
<router-link class="menu_item" active-class="menu_item_active" to="Job">加入我们</router-link>
</li>
</ul>
<div v-if="_isMobile()">
<img src="../assets/icon-92.png" style="width: 40px;margin-top: 10px;" />
</div>
</template>
<script>
export default {
data() {
return {
subIconSrc: '/src/assets/sub.png',
subIconHiberSrc: '/src/assets/sub_hover.png',
aboutMenuIconSrc: '/src/assets/sub.png',
isabout: this.$route.name == 'About',
caseMenuIconSrc: '/src/assets/sub.png',
iscase: this.$route.name == 'Service'
}
},
watch: {
$route(to, from) {
if (to.name == 'About' || to.name == 'Corporate' || to.name == 'Team') {
this.aboutMenuIconSrc = this.subIconHiberSrc;
this.isabout = true;
} else {
this.aboutMenuIconSrc = this.subIconSrc;
this.isabout = false;
}
if (to.name == 'Service' || to.name == 'Case') {
this.caseMenuIconSrc = this.subIconHiberSrc;
this.iscase = true;
} else {
this.caseMenuIconSrc = this.subIconSrc;
this.iscase = false;
}
if (to.name == 'Detail') {
}
}
},
mounted: () => {
},
methods: {
_isMobile() { //判断是否是移动端
let flag = navigator.userAgent.match(
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
)
return flag;
},
menuImgChagne: function(menu, status) {
if (menu == 'about') {
if (status == "2") {
this.aboutMenuIconSrc = this.subIconSrc;
} else {
this.aboutMenuIconSrc = this.subIconHiberSrc;
}
if (this.$route.name == 'About' || to.name == 'Corporate' || to.name == 'Team') {
this.aboutMenuIconSrc = this.subIconHiberSrc;
}
}
if (menu == 'case') {
if (status == "2") {
this.iscase = this.subIconSrc;
} else {
this.caseMenuIconSrc = this.subIconHiberSrc;
}
if (this.$route.name == 'Service' || to.name == 'Case') {
this.caseMenuIconSrc = this.subIconHiberSrc;
}
}
}
}
}
</script>
<style>
.items {
margin: 0;
padding: 0;
list-style: none;
}
.items .menu_item {
display: inline-block;
width: 120px;
height: 60px;
font-size: 16px;
text-align: center;
color: #222;
cursor: pointer;
text-decoration: none;
position: relative;
}
.items .menu_item img {
height: 8px;
margin-top: 26px;
}
.menu_subpanel {
position: absolute;
background: #fff;
width: 100%;
height: 90px;
left: 0px;
z-index: 100;
display: none;
}
.menu_subpanel .menu_sub_item {
background: #fff;
width: 100%;
height: 30px;
line-height: 30px;
}
.about_menu:hover {}
.about_menu:hover .menu_subpanel {
display: block;
}
.case_menu .menu_subpanel {
height: 60px;
}
.case_menu:hover {}
.case_menu:hover .menu_subpanel {
display: block;
}
.items .menu_item:hover {
color: #f8b053
}
.items .menu_item:active {
color: #f8b053
}
.items .menu_item_active {
color: #f8b053
}
</style>
底部导航栏代码:
<template>
<div class="footer_bar" :style="{height:(!ismobel?'250px':'330px')}">
<div class="inner">
<div>
<div class="line_title">友情链接</div>
<div class="links">
<div class="link_item"><a href="https://www.beidu.com" target="_blank">百度</a></div>
<div class="link_item"><a href="https://www.beidu.com" target="_blank">阿里云</a></div>
<div class="link_item"><a href="https://www.beidu.com" target="_blank">华为云</a></div>
<div class="link_item"><a href="https://www.beidu.com" target="_blank">腾讯云</a></div>
<div class="link_item"><a href="https://www.beidu.com" target="_blank">开源中国</a></div>
</div>
</div>
<div class="flex">
<div class="flex-item desc">
<div class="name">贝贝网络科技有限公司</div>
<div class="address">公司总部:陕西省西安市高新区99999号</div>
<div class="desc_items" v-if="!ismobel">
<div class="flex">
<div class="flex-item">总部电话:029-15451313</div>
<div class="flex-item">咨询微信:748151561</div>
</div>
<div class="flex">
<div class="flex-item">联系邮箱:beibei@163.com</div>
<div class="flex-item">简历投递:beibeihr@163.com</div>
</div>
</div>
<div class="desc_items" v-if="ismobel">
<div class="flex-item">总部电话:029-15451313</div>
<div class="flex-item">咨询微信:748151561</div>
<div class="flex-item">联系邮箱:beibei@163.com</div>
<div class="flex-item">简历投递:beibeihr@163.com</div>
</div>
</div>
<div class="split_line"></div>
<div class="qrcode" :style="{paddingTop:(!ismobel?'0px':'30px')}">
<img src="../assets/qrcode.png" />
<div>关注我们</div>
</div>
</div>
<div class="beian" :style="{lineHeight:(!ismobel?'40px':'30px')}">
贝贝网络科技有限公司版权所有 2022-2030 陕ICP备案121214545号-1
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
ismobel: navigator.userAgent.match(
/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
)
}
}
}
</script>
<style>
.footer_bar {
height: 250px;
background: #2C3E50;
color: #fff;
}
.line_title {
height: 40px;
line-height: 40px;
font-size: 18px;
color: #b3c7dc;
}
.link_item {
height: 30px;
line-height: 30px;
font-size: 14px;
color: #b3c7dc;
display: inline-block;
width: 60px;
}
.link_item a {
height: 30px;
line-height: 30px;
font-size: 14px;
color: #b3c7dc;
display: inline-block;
width: 80px;
text-decoration: none;
}
.link_item a:hover {
color: #F8B053;
}
.beian {
font-size: 14px;
text-align: center;
height: 40px;
line-height: 40px;
}
.name {
height: 45px;
line-height: 45px;
font-size: 20px;
}
.address {
height: 30px;
line-height: 30px;
color: #f8b053;
}
.desc_items {
line-height: 30px;
font-size: 14px;
}
.split_line {
width: 1px;
background: #EFEFEF;
}
.qrcode {
width: 150px;
text-align: center;
padding-top: 10px;
}
.qrcode img {
width: 100px;
}
.qrcode div {
height: 30px;
line-height: 30px;
}
</style>
三、总结
实际开发中移动端界面需要单独出对应的设计稿,适配的时候根据设计稿进行实现,移动端和电脑端的页面布局等是不一致的,电脑端界面展示的一些布局在移动端无法展示,所以移动端的界面适配工作量还是挺大的。
下一篇:代码重构及项目发布。