使用JavaScript控制rem单位实现动态响应式设计

使用JavaScript控制rem单位实现动态响应式设计,根据视口(viewport)的宽度来设置根元素的字体大小。以下是一个简单的JavaScript代码示例,用于设置rem基准值:

<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="UTF-8">  
<meta name="viewport" content="width=device-width, initial-scale=1.0">  
<title>Rem Dynamic Sizing</title>  
<style>  
  html {  
    font-size: 16px; /* 默认字体大小,会被JS覆盖 */  
  }  
  .box {  
    width: 7.8125rem; /* 125px / 16px = 7.8125rem */  
    height: 7.8125rem;  
    background-color: skyblue;  
  }  
</style>  
</head>  
<body>  
  
<div class="box">动态rem尺寸示例</div>  
  
<script>  
// 获取视口宽度  
function setRem() {  
  const baseFontSize = 16; // 基础字体大小,这里设为16px  
  const viewportWidth = window.innerWidth || document.documentElement.clientWidth; // 获取视口宽度  
  const designWidth = 750; // 设计稿宽度,可以根据实际情况设置  
  const rem = viewportWidth / designWidth * baseFontSize; // 根据视口宽度动态计算rem值  
  
  // 设置根元素的字体大小  
  document.documentElement.style.fontSize = rem + 'px';  
}  
  
// 初始化时设置rem  
setRem();  
  
// 监听窗口大小变化事件,动态调整rem  
window.addEventListener('resize', setRem);  
</script>  
  
</body>  
</html>

在这个示例中,setRem函数用于计算并设置根元素的字体大小。这个函数首先获取视口的宽度,然后基于设计稿的宽度(在这个例子中是750)来计算出rem值。最后,它将计算出的rem值设置为html元素的font-size

当页面加载时,setRem函数会被调用一次以设置初始的rem值。同时,通过监听resize事件,当窗口大小变化时,setRem函数也会被调用,以确保rem值始终与视口宽度保持正确的比例关系。

这样,CSS中使用rem单位的元素(如.box)就会根据视口宽度的变化而自动调整大小,实现响应式设计的效果。

在 Vue 3 的 <script setup> 语法中

<template>  
  <div class="box">动态rem尺寸示例</div>  
</template>  
  
<script setup>  
import { onMounted, onUnmounted, ref, watchEffect } from 'vue';  
  
// 定义一个响应式引用,用于存储根元素的字体大小  
const fontSize = ref(16); // 初始字体大小为16px  
  
// 设置根元素的字体大小  
function setRootFontSize() {  
  const baseFontSize = 16; // 基础字体大小  
  const designWidth = 750; // 设计稿宽度  
  const viewportWidth = window.innerWidth || document.documentElement.clientWidth; // 视口宽度  
  const newFontSize = (viewportWidth / designWidth) * baseFontSize;  
  document.documentElement.style.fontSize = `${newFontSize}px`;  
}  
  
// 监听窗口大小变化  
function onResize() {  
  setRootFontSize();  
}  
  
// 在组件挂载后设置初始字体大小并添加监听事件  
onMounted(() => {  
  setRootFontSize();  
  window.addEventListener('resize', onResize);  
});  
  
// 在组件卸载前移除监听事件  
onUnmounted(() => {  
  window.removeEventListener('resize', onResize);  
});  
  
// 使用watchEffect来响应式地更新字体大小(可选,如果你需要更精细的控制)  
watchEffect(() => {  
  setRootFontSize();  
});  
</script>  
  
<style scoped>  
.box {  
  width: 7.8125rem; /* 125px / 16px = 7.8125rem */  
  height: 7.8125rem;  
  background-color: skyblue;  
}  
</style>

在这个例子中,使用了 Vue 3 的 Composition API 中的 refonMounted 和 onUnmounted 函数。ref 用于创建一个响应式引用,onMounted 和 onUnmounted 分别用于在组件挂载和卸载时执行逻辑。

setRootFontSize 函数计算新的字体大小,并设置到根元素上。onResize 函数是一个事件处理函数,当窗口大小变化时会被调用。

在 onMounted 钩子中,我们调用 setRootFontSize 来设置初始字体大小,并给 window 对象添加 resize 事件监听器。在 onUnmounted 钩子中,我们移除这个事件监听器,以避免内存泄漏。

最后,我们使用 <style scoped> 来定义组件的样式,其中的 .box 类的宽高使用 rem 单位来定义,这样它们就会随着根元素字体大小的变化而自动调整。

请注意,<script setup> 语法是 Vue 3 的新特性,它提供了一种更简洁的方式来编写组件逻辑。这个特性要求你正在使用的构建系统或运行时环境支持 Vue 3。如果你正在使用 Vite、Vue CLI 或其他支持 Vue 3 的工具,那么你应该能够直接使用 <script setup>

### 构建任务失败解决方案 当遇到 `Execution failed for task ':app:shrinkReleaseRes'` 错误时,这通常意味着资源压缩过程中出现了问题。此错误可能由多种原因引起,包括但不限于配置不正确、依赖冲突或特定于项目的其他因素。 #### 可能的原因分析 1. **ProGuard 或 R8 配置不当** ProGuard R8 是用于优化混淆代码以及减少 APK 大小的工具。如果这些工具的配置存在问题,可能会导致资源无法正常处理[^1]。 2. **重复资源** 如果项目中有多个模块定义了相同的资源名称,可能导致冲突并引发该错误。检查是否存在重名的 drawable、string 等资源文件[^2]。 3. **第三方库兼容性** 某些第三方库可能当前使用的 Gradle 插件版本或其他库存在兼容性问题,从而影响到资源打包过程中的行为[^3]。 4. **Gradle 缓存问题** 有时旧缓存数据会干扰新编译的结果,尝试清理本地仓库重新同步项目可以帮助排除此类潜在障碍[^4]。 #### 推荐的操作方法 为了有效解决问题,建议按照以下步骤逐一排查: ```bash # 清理项目构建目录 ./gradlew clean # 删除 .gradle 文件夹下的所有内容以清除缓存 rm -rf ~/.gradle/caches/ ``` 调整 `build.gradle` 中的相关设置也是一个重要环节: ```groovy android { ... buildTypes { release { minifyEnabled true // 是否启用代码缩减 shrinkResources true // 是否开启资源压缩 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' // 尝试禁用 shrinkResources 来测试是否为资源压缩引起的错误 // shrinkResources false } } } ``` 此外,在 `proguard-rules.pro` 文件内添加必要的保留规则,防止关键类被意外移除: ```text -keep class com.example.yourpackage.** { *; } # 替换为你自己的包路径 -dontwarn androidx.**,com.google.** # 忽略警告信息 ``` 最后,确保所使用的 Android Studio 版本是最新的稳定版,并且已经应用了所有的补丁更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值