#vue项目,需要实现各个屏幕适配,推荐一实现响应式布局的方法
1、使用 CSS 媒体查询:通过使用 CSS 媒体查询,可以根据不同的屏幕尺寸来设置不同的样式。可以在 CSS 文件中设置多个 @media 规则,每个规则对应一个屏幕尺寸,例如:
/* 当屏幕宽度小于等于 768px 时应用的样式 */
@media (max-width: 768px) {
/* 样式 */
}
/* 当屏幕宽度大于 768px 且小于等于 992px 时应用的样式 */
@media (min-width: 769px) and (max-width: 992px) {
/* 样式 */
}
/* 当屏幕宽度大于 992px 时应用的样式 */
@media (min-width: 993px) {
/* 样式 */
}
2、使用 CSS 预处理器:CSS 预处理器如 Sass、Less 等可以使用变量、函数等高级特性来简化 CSS 编写,并且支持嵌套规则和条件语句等功能,可以更方便地实现响应式布局。
3、使用 CSS 框架:常用的 CSS 框架如 Bootstrap、ElementUI 等都提供了响应式布局的样式和组件,可以直接使用这些组件来实现响应式布局。
4、使用 JavaScript 库:JavaScript 库如 jQuery、Vue-Responsive、Enquire.js 等可以根据屏幕尺寸来动态修改样式或触发事件,可以实现更复杂的响应
.box {
width: 10vw; /* 10% of viewport width */
height: 10vh; /* 10% of viewport height */
}
<template>
<div class="box" :class="boxClass">...</div>
</template>
<script>
export default {
data() {
return {
boxClass: ''
}
},
mounted() {
window.addEventListener('resize', this.handleResize)
},
methods: {
handleResize() {
if (window.innerWidth < 768) {
this.boxClass = 'small'
} else {
this.boxClass = ''
}
}
}
}
</script>
然后可以在small class中自定义小屏幕下的样式。
<template>
<div class="box" :class="boxClass">...</div>
</template>
<script>
export default {
data() {
return {
screenWidth: 0,
boxClass: ''
}
},
watch: {
screenWidth() {
if (this.screenWidth < 768) {
this.boxClass = 'small'
} else {
this.boxClass = ''
}
}
},
mounted() {
this.screenWidth = window.innerWidth
window.addEventListener('resize', () => {
this.screenWidth = window.innerWidth
})
}
}
</script>
这三种方法实现响应式布局的原理是监听屏幕宽度的变化,然后动态应用不同的CSS类或样式。除此之外,也可以使用CSS的@media查询配合vw/vh单位一起使用,实现更加灵活的响应式效果。
以上说的这些是通过手动解决,也可以利用已经成熟的前端框架解决 例如ElementUI、ANT、Vant等
module.exports = {projectName:'xxx'}
dev.js
let projectName = process.argv[2];
if (!projectName) {
throw Error('Project name cannot be empty and must match the directory name');
}
let fs = require('fs');
let template = `module.exports = {projectName:"${projectName}"}`;
fs.writeFileSync('./config/project.js', template);
let exec = require('child_process').execSync;
exec('npm run d', {stdio: 'inherit'});
build.js
let projectName = process.argv[2];
if (!projectName) {
throw Error('Project name cannot be empty and must match the directory name');
}
let fs = require('fs');
let template = `module.exports = {projectName:'${projectName}'}`;
fs.writeFileSync('./config/project.js', template);
let exec = require('child_process').execSync;
exec('npm run b', {stdio: 'inherit'});
"scripts": {
"d": "vue-cli-service serve",
"b": "vue-cli-service build",
"dev": "node config/dev.js",
"build": "node config/build.js"
}
const project = require('./project');
const config = {};
const projectName = project.projectName;
config[projectName] = {
entry:`./src/projects/${projectName}/main.js`,
template:`./src/projects/${projectName}/${projectName}.html`,
fileName:`${projectName}.html`
}
5.创建vue.config.js文件
相关的配置在这个文件进行配置
publicPath: publicPath,
outputDir: config.build.assetsRoot + '/' + project.projectName,
assetsDir: process.env.NODE_ENV === "production" ?
config.build.assetsSubDirectory : config.dev.assetsSubDirectory,
indexPath: pageConfig.filename,
lintOnSave: false,
productionSourceMap: false,
configureWebpack: config => {
config.entry = {
app: ['babel-polyfill', pageConfig.entry]
}
},
chainWebpack: config => {
config.output.filename('[name].js');
config.plugin('html').tap(args => {
args[0].template = resolve(pageConfig.template);
args[0].filename = pageConfig.filename;
return args;
});
config.resolve.alias
.set('vue$', "vue/dist/vue.esm.js")
}
使用devServer配置开发调试模式的内容
index: pageConfig.filename,
contentBase: resolve('public'),
historyApiFallback: {
rewrites: [
{from: /^\//, to: path.posix.join(config.dev.assetsPublicPath, pageConfig.filename)},
{from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, pageConfig.filename)}
]
}
在Vue项目中实现响应式布局可以采用以下几种方法:
<style scoped>
@media(max-width: 768px){
.container{
display: flex;
flex-direction: column;
}
}
</style>
npm install vuetify --save
使用方法:
<template>
<v-container fluid>
<v-row>
<v-col md="6">Column 1</v-col>
<v-col md="6">Column 2</v-col>
</v-row>
</v-container>
</template>
<script>
import 'vuetify/dist/vuetify.min.css'
import Vuetify from 'vuetify'
import Vue from 'vue'
Vue.use(Vuetify)
</script>
npm install bootstrap --save
使用方法:
在组件中引入Bootstrap CSS:
<style>
@import '~bootstrap/dist/css/bootstrap.css';
</style>
在HTML中使用Bootstrap的网格系统布局:
<template>
<div class="row">
<div class="col-md-6">Column 1</div>
<div class="col-md-6">Column 2</div>
</div>
</template>
<template>
<div class="container">
<div class="row">
<div class="col-md-6">Column 1</div>
<div class="col-md-6">Column 2</div>
</div>
</div>
</template>
<style>
.container{
display: flex;
flex-direction: column;
}
@media(max-width: 768px){
.container{
flex-direction: row;
}
}
.col-md-6{
flex:1;
}
</style>
以上方法都可以实现响应式布局,选择合适的方法根据自己的需求和喜好来决定。