前端大屏适配几种方案
后台-插件-广告管理-内容页头部广告(手机) |
1920*1080的设计稿。
方案一:vw(单位)
假设设计稿尺寸为 1920*1080(做之前一定问清楚 ui 设计稿的尺寸)
即: 网页宽度=1920px 网页高度=1080px
我们都知道 网页宽度=100vw 网页宽度=100vh 所以,在 1920px*1080px 的屏幕分辨率下 1920px = 100vw 1080px = 100vh
这样一来,以一个宽 300px 和 200px 的 div 来说,其所占的宽高,以 vw 和 vh 为单位,
计算方式如下: vwDiv = (300px / 1920px ) * 100vw vhDiv = (200px / 1080px ) * 100vh
所以,就在 1920*1080 的屏幕分辨率下,计算出了单个 div 的宽高 当屏幕放大或者缩小时,div 还是以 vw 和 vh 作为宽高的,就会自动适应不同分辨率的屏幕
使用scss
util.scss
- // 使用 scss 的 math 函数,https://sass-lang.com/documentation/breaking-changes/slash-div
- @use "sass:math";
- // 默认设计稿的宽度
- $designWidth: 1920;
- // 默认设计稿的高度
- $designHeight: 1080;
- // px 转为 vw 的函数
- @function vw($px) {
- @return math.div($px, $designWidth) * 100vw;
- }
- // px 转为 vh 的函数
- @function vh($px) {
- @return math.div($px, $designHeight) * 100vh;
- }
路径配置
只需在vue.config.js里配置一下utils.scss的路径,就可以全局使用了
vue.config.js
- const path = require("path");
- function resolve(dir) {
- return path.join(__dirname, dir);
- }
- module.exports = {
- publicPath: "",
- configureWebpack: {
- name: "app name",
- resolve: {
- alias: {
- "@": resolve("src"),
- },
- },
- },
- css: {
- // 全局配置 utils.scs,详细配置参考 vue-cli 官网
- loaderOptions: {
- sass: {
- prependData: `@import "@/styles/utils.scss";`,
- },
- },
- },
- };
如果是vite.config.ts得这样配置
- return {
- resolve: {
- // Vite路径别名配置
- alias: {
- "@": pathSrc,
- },
- },
- css: {
- // CSS 预处理器
- preprocessorOptions: {
- //define global scss variable
- scss: {
- javascriptEnabled: true,
- additionalData: `
- @use "@/styles/variables.scss" as *;
- // 必须这样配置才能生效!
- @use "@/styles/until.scss" as *;
- `,
- },
- },
- },
- };
在.vue文件中直接使用
- <template>
- <div class="box">
- div>
- template>
- <script>
- export default{
- name: "Box",
- }
- script>
- <style lang="scss" scoped="scoped">
- /*
- 直接使用 vw 和 vh 函数,将像素值传进去,得到的就是具体的 vw vh 单位
- */
- .box{
- width: vw(300);
- height: vh(100);
- font-size: vh(16);
- background-color: black;
- margin-left: vw(10);
- margin-top: vh(10);
- border: vh(2) solid red;
- }
- style>
定义 js 样式处理函数
- // 定义设计稿的宽高
- const designWidth = 1920;
- const designHeight = 1080;
- // px转vw
- export const px2vw = (_px) => {
- return (_px * 100.0) / designWidth + 'vw';
- };
- export const px2vh = (_px) => {
- return (_px * 100.0) / designHeight + 'vh';
- };
- export const px2font = (_px) => {
- return (_px * 100.0) / designWidth + 'vw';
- };
屏幕变化后,图表自动调整
这种使用方式有个弊端,就是屏幕尺寸发生变化后,需要手动刷新一下才能完成自适应调整
为了解决这个问题,你需要在各个图表中监听页面尺寸变化,重新调整图表,在 vue 项目中,也可以借助element-resize-detector,最好封装个 resize 的指令,在各图表中就只要使用该指令就可以了,毕竟作为程序员,能偷懒就偷懒
1.安装 element-resize-detector
npm install element-resize-detector --save
2.引入工具包在组件中使用或者在单独的 js 中使用
import resizeDetector from 'element-resize-detector'
3.封装 directive
- // directive.js
- import * as ECharts from "echarts";
- import elementResizeDetectorMaker from "element-resize-detector";
- import Vue from "vue";
- const HANDLER = "_vue_resize_handler";
- function bind(el, binding) {
- el[HANDLER] = binding.value
- ? binding.value
- : () => {
- let chart = ECharts.getInstanceByDom(el);
- if (!chart) {
- return;
- }
- chart.resize();
- };
- // 监听绑定的div大小变化,更新 echarts 大小
- elementResizeDetectorMaker().listenTo(el, el[HANDLER]);
- }
- function unbind(el) {
- // window.removeEventListener("resize", el[HANDLER]);
- elementResizeDetectorMaker().removeListener(el, el[HANDLER]);
- delete el[HANDLER];
- }
- // 自定义指令:v-chart-resize 示例:v-chart-resize="fn"
- Vue.directive("chart-resize", { bind, unbind });
4.main.js中引入
import '@/directive/directive';
5.html 代码
- <template>
- <div class="linechart">
- <div ref="chart" v-chart-resize class="chart">div>
- div>
- template>
这里要注意的是,图表中如果需要 tab 切换动态更新图表数据,在更新数据时一定不要用 echarts 的 dispose 方法先将图表移除,再重新绘制,因为 resize 指令中挂载到的图表实例还是旧的,就监听不到新的 chart 元素的 resize 了,更新数据只需要用 chart 的 setOption 方法重新设置配置项即可。
图表字体、间距、位移等尺寸自适应
echarts 的字体大小只支持具体数值(像素),不能用百分比或者 vw 等尺寸,一般字体不会去做自适应,当宽高比跟 ui 稿比例出入太大时,会出现文字跟图表重叠的情况
这里我们就需要封装一个工具函数,来处理图表中文字自适应了
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |