vue项目网页自适应,等比例放大缩小

news2025/2/25 17:41:04

        同样是,虽然标题写的vue项目适用,但其它前端框架应该也可以。其它框架我没什么经验,可以参考着看看,应该适用。

        本文章不涉及第三方插件,纯js。

        自适应这个问题,老早以前就有一个解决方式,css中的%,比如height:100%; width:100%;给主容器赋予该样式,那主容器就可以自适应屏幕,但里面的内容不会,如果要里面的内容也自适应,那里面也得写%,但问题随之而来,font-size呢?

        %虽然现在依然有用,但现在的项目很多都有设计稿,比如我接触比较多的数据大屏,这类网页,长宽比是固定的,%无法解决字体自适应的问题。熟悉rem的,可以用rem,这个单位类似于微信小程序的rpx,算是自适应属性,但我没用过,不讲,今天的主角不是它。

        接下来就是正文了。在长宽比固定的情况下,网页自适应,其实就是将网页等比例放大或者缩小。我们提出一个 设想在网页初始化的时候,正确地放大或者缩小网页,来适应屏幕;并在浏览器显示区域发生变化时,修改放大或者缩小的比例,使网页始终能够适应屏幕

        放大和缩小,有什么现有的方法或者样式吗?有, css中的 zoom 以及 scale(),浅讲一下两个样式的不同之处:

zoom:

        1. 使用该样式的标签会等比例缩放。zoom:0.5 (缩放50%),zoom:2(放大两倍)。

        2. 缩放的基准点在原容器的左上角(应该没记错,想证实的可以自己试试),意思就是,使用zoom放大缩小,原容器的左上角作为原点不动,然后边长放大缩小。在数学里的话,差不多就是原点固定,然后在第四象限放大缩小。

        3. 火狐firefox不支持。

scale():

        1. 使用该样式的标签也会放大缩小,不过它可以让长宽独立放大缩小。transform: scale(2, 2); (放大两倍),transform: scale(0.5, 2); (水平方向缩放50%,垂直方向放大2倍)。

        2. 缩放的基准点在原容器的中心,意思大概是以原容器中心为原点,然后想一二三四象限扩张火收缩。

        3. 火狐firefox支持。

        对比下来,scale()优势明显,我们就用scale(),它是css3的属性,我们不考虑什么兼容问题,现在还不支持css3的浏览器,我都不稀罕用。如果非要用zoom,也可以,因为代码方面差不多。

        既然上面的 设想 可以有方法实现,现在就剩最后一个问题了,缩放多少呢?

        场景假设:我们以设计稿 1920px*1080px为例,但是现在我们的屏幕没有1920*1080,或者浏览器没有最大化,就占了屏幕的一半,这时候很可能浏览器长宽比连16:9都不是,我们可以宽度做基准,高度来适应宽度(高度为基准,宽度适应高度也可以,看场景和具体需要)。设计稿的宽度是1920px,而浏览器可视宽度是 window.innerWidth,我们需要在浏览器可视范围内自适应缩放容器,也就是在 window.innerWidth 的宽度中来显示 1920px的东西,那我们的 缩放比例 就是 window.innerWidth / 1920。

        所有问题都解决了,现在就来实现我们的设想。下面我以scale()为例了。

        在网页初始化的时候,正确地放大或者缩小网页,来适应屏幕。翻译:mounted() 的时候scale()主容器。

mounted() {
    var browerWidth = window.innerWidth; //浏览器可视宽度
    var baseWidth = 1920; //设计稿宽度
    var zoomValue = browerWidth / baseWidth; //缩放比例计算
    document.getElementById("mainContainer").style.transform = 
        "scale(" + zoomValue + "," + zoomValue + ")"; //mainContainer为主容器id
}

        在浏览器显示区域发生变化时,修改放大或者缩小的比例,使网页始终能够适应屏幕。翻译:窗口尺寸变化时,重新计算缩放比例,并重新scale()主容器。

window.onresize = function () {
      var browerWidth = window.innerWidth;
      var baseWidth = 1920;
      var zoomValue = browerWidth / baseWidth;
      document.getElementById("mainContainer").style.transform = 
        "scale(" + zoomValue + "," + zoomValue + ")";
    }

        整合一下:

mounted() {
    var browerWidth = window.innerWidth; //浏览器可视宽度
    var baseWidth = 1920; //设计稿宽度
    var zoomValue = browerWidth / baseWidth; //缩放比例计算
    document.getElementById("mainContainer").style.transform = "scale(" + zoomValue + "," + zoomValue + ")"; //mainContainer为主容器id
    window.onresize = function () { //窗口尺寸变化时,重新计算和缩放
      browerWidth = window.innerWidth;
      zoomValue = browerWidth / baseWidth;
      document.getElementById("mainContainer").style.transform = "scale(" + zoomValue + "," + zoomValue + ")";
    }
}

        到这里,自适应的内容已经结束,但还不完美。如果显示区域的比例不是16:9。两种情况:

        1. 宽度更大,高度为了适应宽度,会导致垂直方向显示不全,需要上下滚动显示。这个就改成以高度为基准。上面的 场景假设 有提到。

        2. 高度更大,或者使用了1的解决方法。因为显示区域不是16:9,而设计稿是16:9,总会有部分区域不属于主容器,那这部分区域就是白色的很难看,像这样:

         这个问题其实就很简单了,我们给主容器再套一个父容器,父容器来设置背景色填充留白。父容器的样式这么写(自适应窗口,并让子元素水平垂直居中,留白部分用背景色填充):

#app {
  width: 100vw;
  height: 100vh;
  background: rgb(24, 25, 35);
  display: flex;
  align-items: center;
  justify-content: center;
}

最终效果图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端实现vue3使用axios调用后端接口

前言:在探索vue3.0的道路上调接口这件事很重要,所以我就把我探索出来的这条道展示出来,为大家提供便利,望喜欢,废话不多说展示!!! 第一步:在src下创建一个http文件夹&am…

vue-devtools的安装与使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、vue-devtools是什么?二、vue-devtools安装1.下载vue-devtools工具2.安装vue-devtools工具三、vue-devtools的使用总结前言 主要介绍vue-devtool…

nvm详细安装步骤以及使用(window10系统)

nvm详细安装步骤以及使用 nvm是一个管理nodejs版本的工具。在实际的开发中,有些项目的开发依赖需要低版本的nodejs运行环境,此时我们就需要使用nvm来降低nodejs版本。 1.下载安装nvm,首先安装目录不要有空格和中文,会出现乱码 下…

若依框架详细使用

目录 🏳‍🌈若依是用来干什么的❓ 🚩技术支持: 🏳‍🌈如何下载❓ 🚩官网地址: 🏳‍🌈如何搭建ruoyi环境❓ 🚩若依框架的目录结构 🚩 修改配…

WKHtmltoPdf

踩过的坑 请一定要使用下面的这种方式获取系统的可执行命令,否则会报一堆的找不到目录等错误!!! String osname System.getProperty("os.name").toLowerCase();String cmd osname.contains("windows") ? …

如何运行vue项目(超详细图解)

📖本篇超级详细案例截图教学 如何运行别人的vue项目,图片点击可放大仔细看 一、查看node.js版本 Vue环境配置教程 :https://blog.csdn.net/m0_57545353/article/details/124366678 配置完成后分别在cmd中执行node -v查看是否安装成功&…

js常用的加密/解密方法

1.前言(老司机直接跳过) 为什么js需要加密 谈到加密,大多数人应用场景都在于后端接口的加密签名校验。这种一般都用于服务端与服务端之间的相互调用,避免第三方使用你的接口做违法违规的事情,这种加密校验比较安全,因为没有暴露在…

React中使用Redux (一) - 在React中直接使用Redux

React中使用Redux 开始之前需要强调一下,redux和react没有直接的关系,你完全可以在React, Angular, Ember, jQuery, or vanilla JavaScript中使用Redux。 尽管这样说,redux依然是和React库结合的更好,因为他们是通过state函数来描…

Vue3中Vuex的使用

Vuex是做什么的? Vue官方:状态管理工具 状态管理是什么? 需要在多个组件中共享的状态、且是响应式的、一个变,全都改变。 例如一些全局要用的的状态信息:用户登录状态、用户名称、地理位置信息、购物车中商品、等等 这时候我…

el-input无法输入的问题和表单验证失败问题

1.el-input无法输入的问题原因1、el-input组件没有绑定双向响应式数据(v-model)解决方案:在data中定义一个变量,然后在el-input组件中使用v-model进行双向数据绑定,这样子就会解决el-input组件无法输入的问题了。原因2、组件嵌套太深还是该组件是一个坑(…

【node】升级 Node 版本教程

文章目录Window 系统Mac 或 Linux系统Window 系统 window系统升级node只能到node官网下载window安装包来覆盖之前的node。node 安装教程附下载地址:https://blog.csdn.net/qq_45677671/article/details/114535955因为 n 模块是不支持window系统: PS C:…

el-table表格动态合并行、合并行列及详解

📝 个人简介 ⭐ 个人主页:我是段段🙋‍ 🍊 博客领域:编程基础、前端💻 🍅 写作风格:干货!干货!都是干货! 🍑 精选专栏:Vue…

解决Vuex刷新页面数据丢失的问题

一:数据丢失的原因 vuex存储的数据只是在页面中,相当于全局变量,页面刷新的时候vuex里的数据会重新初始化,导致数据丢失。因为vuex里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例&#…

Nuxt3项目搭建(Nuxt3+element-plus+scss详细步骤)

小聊: 本次记录一次使用Nuxt3搭建前端项目的过程,内容包含Nuxt3的安装,基于Vite脚手架(默认)构建的vue3项目,element-plus的安装配置(可选),scss的安装(可选&…

HTML的基本标签及属性

HTML1. 标题与段落标签2. 文本修饰标签3. 图片标签4. 链接标签5. 无序、有序列表与定义列表6. 表格、表单标签7. div与span标签1. 标题与段落标签 (1) 标题标签是一对双标签&#xff1a;<h1></h1>&#xff0c;<h2></h2>&#xff0c;<h3></h3&…

Layui表格可编辑 可动态新增一行 删除当前行

Layui 表格 可编辑&#xff1a;点击表格实现可编辑 cols: [[ //表头 {type: numbers, title: ID, width: 80, align: "center", sort: true} , {field: project, title: 项目, minWidth: 80, align: "center", edit: text} ]] 在表头的对象中增加 edit: …

前端必学的CSS3波浪效果演示

目录 文章目录 前言 CSS3波浪效果 1.Html构建 2.CSS编写 3.完整代码 index.html文件 style.css文件 总结 前言 随着前端技术的不断发展与进步&#xff0c;界面交互的样式要求和美感也越来越高&#xff0c;很多网页的交互都加上了css3动画,这里作者给大家分享一个前端开…

vue路由配置

1、路由的使用 一、安装路由 npm i vue-router 二、配置路由 在根目录下创建文件夹router&#xff0c;在router文件夹下创建index.js文件&#xff0c;如下图所示 在index.js文件中写入如下代码&#xff0c;实现创建一个路由器 import VueRouter from "vue-router&qu…

Object.defineproperty方法(详解)

Object.defineproperty 的作用就是直接在一个对象上定义一个新属性&#xff0c;或者修改一个已经存在的属性 Object.defineproperty可以接收三个参数 Object.defineproperty(obj, prop, desc) obj : 第一个参数就是要在哪个对象身上添加或者修改属性 prop : 第二个参数就是…

HTML网站导航栏的制作

一、导航条的制作 &#xff08;1&#xff09;代码图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport…