rem自适应
随着现在互联网设备的日益更新,各大尺寸的屏幕参差不穷
导致我们的布局在某些小屏或者大屏上与UI的表现并不一致
所以,很多人寻求各种解决方案,我们现在的很多移动端框架都是支持了的,包括小程序,很多都采用了rpx的方式,这里不去深究它们的实现方案。
像手机淘宝网,就是在根标签设置font-size,然后使用rem去设置尺寸大小,它们可能有更精细化的优化处理,这里就只实现普通的方法。
淘宝示例图如上
实现过程
获取当前的设备宽度
1
| const view_width = document.getElementsByTagName('html')[0].getBoundingClientRect().width;
|
计算rem的值
1 2 3
| // 750 是设计稿的宽度 , 按设计稿调整 // 乘以100 是为了具体宽度值书写不会太大 const fontSize = fontSize = 100 * (view_width / 750) + 'px'
|
赋值到根标签
1 2
| const _html = document.getElementsByTagName('html')[0]; _html.style.fontSize = fontSize
|
监听宽度变化
1 2
| // onWindowResize 即上述处理过程 window.addEventListener('resize', onWindowResize)
|
使用效果
1 2 3 4 5 6 7 8 9 10
| /* * 设计稿盒子宽100px * 高100px * 字体30px */ .box{ width:1rem; height:1rem; font-size:0.3rem; }
|
完整示例(Vue3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <script setup> import { onMounted, onUnmounted, ref } from "vue";
const flag = ref(false)
// 防止频繁触发 const onWindowResize = () => { if (!flag.value) { flag.value = true setTimeout(() => { initFontSize() flag.value = false }, 300) } }
const initFontSize = () => { const view_width = document.getElementsByTagName('html')[0].getBoundingClientRect().width; const _html = document.getElementsByTagName('html')[0];
_html.style.fontSize = 100 * (view_width / 1280) + 'px' }
onMounted(() => { initFontSize() window.addEventListener('resize', onWindowResize) })
onUnmounted(() => { window.removeEventListener('resize', onWindowResize) })
</script>
|