React项目使用vw适配移动端

打开自定义配置选项

yarn eject
//Are you sure you want to eject? This action is permanent. (y/N) 
y
复制代码

修改配置

配置使用scss
  • 修改config文件夹的webpack.config.dev.jswebpack.config.prod.js
# 第一处是:  (大约167行左右)
test: /\.css$/ 变成 test: /\.s?css$/  
# 第二处是: (大约217行左右)
{loader: require.resolve('sass-loader')}
复制代码
  • 安装sass插件
yarn add node-sass sass-loader -D
复制代码
安装postCss插件
yarn add postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano -D
复制代码
配置postcss
  • webpack.config.dev.jswebpack.config.prod.js文件中进行如下修改
// 引入
const postcssAspectRatioMini = require('postcss-aspect-ratio-mini');
const postcssPxToViewport = require('postcss-px-to-viewport');
const postcssWriteSvg = require('postcss-write-svg');
const postcssCssnext = require('postcss-cssnext');
const postcssViewportUnits = require('postcss-viewport-units');
const cssnano = require('cssnano');
// 使用
{
    loader: require.resolve('postcss-loader'),
    options: {
        // Necessary for external CSS imports to work
        // https://github.com/facebookincubator/create-react-app/issues/2677
        ident: 'postcss',
        plugins: () => [
            require('postcss-flexbugs-fixes'),
            autoprefixer({
                browsers: [
                    '>1%',
                    'last 4 versions',
                    'Firefox ESR',
                    'not ie < 9', // React doesn't support IE8 anyway
                ],
                flexbox: 'no-2009',
            }),
            postcssAspectRatioMini({}), // 用来处理元素容器宽高比
            postcssWriteSvg({
            // 用来处理移动端1px的解决方案
                utf8: false,
            }),
            postcssCssnext({}), // 让项目使用CSS未来特性 并对其做兼容性处理
            postcssPxToViewport({
                viewportWidth: 375, // 视窗的宽度,对应我们设计稿的宽度,一般是750
                viewportHeight: 667, // 视窗的高度,根据750设备的宽度来指定,一般指定1334,也可以不配置
                unitPrecision: 3, // 指定'px'转换为视窗单位值得小数位数(很多时候无法整除)
                viewportUnit: 'vw', // 指定需要转换成的视窗单位,建议使用vw
                selectorBlackList: [
                    '.ignore',
                    '.hairliness',
                ], // 指定不转换为视窗单位的类,可以自定义,可以无限添加,建议定义一至两个通用的类名
                minPixelValue: 1, // 小于或等于`1px`不转换为视窗单位,你也可以设置为你想要的值。
                mediaQuery: false, // 允许在媒体查询中转换`px`
            }),
            postcssViewportUnits({}), // 给CSS的属性添加content的属性 配合viewport-units-buggyfill解决个别手机不支持vw
            cssnano({
                // 压缩和清理CSS代码
                autoprefixer: false,
                'postcss-zindex': false,
            }),
        ],
    },
},
复制代码

VW兼容方案

    • 主要使用viewport-units-buggyfill.js和viewport-units-buggyfill.hacks.js,只需要在public/index.html引入它们
    • <head></head>中引入阿里cdn:<script src="//g.alicdn.com/fdilab/lib3rd/viewport-units-buggyfill/0.6.2/??viewport-units-buggyfill.hacks.min.js,viewport-units-buggyfill.min.js"></script>
    • 在HTML文件中调用viewport-units-buggyfill
    <!--使用viewport-units-buggyfill解决个别手机不支持vw-->
    <script>
      window.onload = function () {
        window.viewportUnitsBuggyfill.init({
          hacks: window.viewportUnitsBuggyfillHacks
        });
      }
    </script>
    复制代码
    • 前面配置的postcss-viewport-units插件。这个插件将让你无需关注content的内容,插件会自动帮你处理。

转载于:https://juejin.im/post/5c889f56e51d45192c4a7f83

### ECharts-for-React 移动端 H5 适配指南 #### 设置响应式容器 为了确保图表能够在不同的移动设备上正常显示,首先要创建一个可以自动调整大小的容器。这可以通过CSS中的`flexbox`布局以及媒体查询来实现。 ```css .chart-container { display: flex; justify-content: center; align-items: center; width: 100%; height: calc(100% - 2em); /* 考虑到顶部和底部边距 */ } @media (max-width: 768px) { .chart-container { padding: 1em; /* 对于更小屏幕增加内边距 */ } } ``` #### 动态计算宽度与高度 对于ECharts实例来说,在初始化时应该基于当前窗口尺寸设定合适的宽高属性,并监听窗口变化事件以便实时更新这些参数[^2]。 ```javascript import React, { useEffect } from 'react'; import * as echarts from 'echarts/core'; import { CanvasRenderer } from 'echarts/renderers'; import { LineChart } from 'echarts/charts'; // 注册必须的组件 echarts.use([CanvasRenderer, LineChart]); function MyResponsiveLineChart() { let chartDomRef; const initChart = () => { if (!chartDomRef) return; var myChart = echarts.init(chartDomRef); window.addEventListener('resize', function () { myChart.resize(); }); // 初始化配置项... var option = { xAxis: {}, yAxis: {}, series: [{ type: 'line', data: [820, 932, 901, 934, 1290, 1330, 1320] }] }; myChart.setOption(option); // 首次渲染后立即调用 resize 方法以适应初始状态下的父级元素尺寸 setTimeout(() => { myChart.resize(); }, 0); } useEffect(initChart, []); return ( <div ref={(node) => { chartDomRef = node }} style={{width:'100%',height:'400px'}}></div> ); } export default MyResponsiveLineChart; ``` #### 使用 `rem` 或者 `vw/vh` 单位定义样式 当涉及到具体的数值如字体大小、间距等时候,推荐采用相对单位而不是绝对像素值。这样可以让UI更加灵活地应对各种分辨率的变化[^4]。 例如: ```scss body { font-size: 16px; // 基准字号 @media screen and (min-device-width : 320px){ html{font-size: 14px;} } @media screen and (min-device-width : 768px){ html{font-size: 16px;} } h1{ margin-bottom:.5rem; line-height:1.5rem; } } ``` 通过上述措施,可以在很大程度上提高ECharts图形在H5页面上的兼容性和用户体验质量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值