1. @media媒体查询适配
利用html标签为基准,然后用rem设配页面
1html {
2 font-size: 16px;
3}
4...
5@media (min-width: 1024px) {
6 html {
7 font-size: 14px;
8 }
9}
10@media (min-width: 1440px) {
11 html {
12 font-size: 16px;
13 }
14}
2. 插件postcss-pxtorem
他是postcss插件npm install postcss-pxtorem --save-dev
配置如下:
1
2module.exports = {
3 plugins: {
4 'postcss-pxtorem': {
5 rootValue: 16,
6 unitPrecision: 5,
7 propList: ['*', '!min-width', '!max-width'],
8 selectorBlackList: [],
9 replace: true,
10 mediaQuery: false,
11 minPixelValue: 0
12 }
13 }
14};
15
16export default defineConfig({
17 css: {
18 postcss: './postcss.config.cjs',
19 }
20})
在我们的css、less、scss
文件里面,你可以自由的使用px
,在打包的时候postcss-pxtorems
插件,他会自动将px
转化成rem
3. 利用js动态修改根元素的 font-size
利用js,无论视口宽度如何变化,页面元素都会根据基准值动态调整大小,确保良好的适配效果。在加上px转化为rem的技术更是提高了适配的灵活性。
工具函数
1
2function setRootFontSize(): void {
3 const docEl = document.documentElement;
4 const clientWidth = docEl.clientWidth;
5 if (!clientWidth) return;
6 const baseFontSize = 16;
7 const designWidth = 1920;
8 docEl.style.fontSize = (baseFontSize * (clientWidth / designWidth)) + 'px';
9 }
10 export default setRootFontSize;
11
12
app 组件使用
1
2import setRootFontSize from '../utils/setRootFontSize';
3import { useEffect } from 'react';
4
5export default function App() {
6 useEffect(() => {
7 setRootFontSize();
8 window.addEventListener('resize', setRootFontSize);
9 return () => {
10 window.removeEventListener('resize', setRootFontSize);
11 };
12 }, []);
13
14 return (
15 <>
16 <div>
17 <MyRoutes />
18 </div>
19 </>
20 )
21}
22
注:如果你使用了 setRootFontSize 动态调整根元素的 font-size
,就不再需要使用 @media 查询来调整根元素的字体大小了。这是因为 setRootFontSize
函数已经根据视口宽度动态调整了 font-size,从而实现了自适应。
注意事项:
- 动态
rem
此方案比较适合H5屏幕适配 - 注意:
PostCSS
转换rem
应排除min-width
、max-width
、min-height
和max-height
,以免影响整体界面
1. 弹性盒模型(Flexbox)
1.container {
2 display: flex;
3 flex-wrap: wrap;
4}
5
6.item {
7 flex: 1 1 100%;
8}
9
10@media (min-width: 600px) {
11 .item {
12 flex: 1 1 50%;
13 }
14}
15
16@media (min-width: 1024px) {
17 .item {
18 flex: 1 1 33.33%;
19 }
20}
2. 栅格系统(Grid System)
1.container {
2 display: grid;
3 grid-template-columns: 1fr;
4 gap: 10px;
5}
6
7@media (min-width: 600px) {
8 .container {
9 grid-template-columns: 1fr 1fr;
10 }
11}
12
13@media (min-width: 1024px) {
14 .container {
15 grid-template-columns: 1fr 1fr 1fr;
16 }
17}
3. 百分比和视口单位
1
2 .container {
3 width: 100%;
4 height: 50vh;
5}
6
7.element {
8 width: 50%;
9 height: 10vw;
10}
4. 响应式图片
利用img的srcset 和 sizes 属性,实现根据设备分辨率和尺寸加载不同版本的图片,以提高性能和视觉效果。
1<!-- 示例:响应式图片 -->
2 <img
3 src="small.jpg"
4 srcset="medium.jpg 600w, large.jpg 1024w"
5 sizes="(max-width: 600px) 100vw, (max-width: 1024px) 50vw, 33.33vw"
6 alt="Responsive Image"
7 />
5. CSS变量
利用:root
在全局下面定义样式变量,然后利用var
引入
1:root {
2 --main-padding: 20px;
3}
4
5.container {
6 padding: var(--main-padding);
7}
8
9@media (min-width: 600px) {
10:root {
11 --main-padding: 40px;
12 }
13}
个人笔记记录 2021 ~ 2025