vue项目实现响应式布局

#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 等可以根据屏幕尺寸来动态修改样式或触发事件,可以实现更复杂的响应

  1. 使用vw/vh单位:
    vw/vh是视口单位,1vw equals 1% of viewport width,1vh equals 1% of viewport height。使用这种单位可以实现元素大小响应屏幕大小变化。
    例如:
.box {
  width: 10vw; /* 10% of viewport width */
  height: 10vh; /* 10% of viewport height */
}
  1. 使用Vue的media query监听屏幕变化:
    可以在组件中使用media query监听屏幕宽度变化,动态改变元素样式:
<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中自定义小屏幕下的样式。

  1. 使用Vue的watch监听属性:
    我们可以在组件中定义一个代表屏幕宽度的属性,使用watch监听这个属性的值变化,然后设置不同的样式:
<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等

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7696967
  • 你也可以参考下这篇文章:vue项目实现屏幕自适应
  • 除此之外, 这篇博客: Vue单工程多项目中的 实现过程 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 创建project.js文件用来存储要运行的项目名称,可以通过命令行参数设置。
    module.exports = {projectName:'xxx'}
    
    1. 创建按环境区分的配置文件,获取命令行项目名称,设置node运行命令,执行相应的运行。

    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'});
    
    1. 修改package.json
      新增npm run dev、npm run build 命令。
      npm run dev: 以开发模式运行项目
      npm run build: 打包编译项目到本地dist目录
    "scripts": {
            "d": "vue-cli-service serve",
            "b": "vue-cli-service build",
            "dev": "node config/dev.js",
            "build": "node config/build.js"
        }
    
    1. 新增projectConfig.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项目开发实战课程中的 条件渲染小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    在Vue项目中实现响应式布局可以采用以下几种方法:

    1. 使用CSS Media Queries来设置不同的CSS样式,根据不同的屏幕尺寸来调整布局。在组件中加入类似下面这样的代码:
    <style scoped>
      @media(max-width: 768px){
        .container{
          display: flex;
          flex-direction: column;
        }
      }
    </style>
    
    1. Vue自带的响应式布局框架Vuetify,它基于Vue和Material Design规范。使用Vuetify可以方便地实现各种布局。安装方法:
    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>
    
    1. 使用CSS框架Bootstrap,Bootstrap提供了很多基于网格系统的布局方法,可以快速地搭建响应式布局。安装方法:
    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>
    
    1. 使用Flexbox布局,可以兼容性很好地实现响应式布局。在组件中加入类似下面这样的代码:
    <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>
    

    以上方法都可以实现响应式布局,选择合适的方法根据自己的需求和喜好来决定。