面试常问:rem布局,flex布局等

本文详细介绍了前端开发中的关键概念,包括REM布局,如何通过设置html字体大小实现不同设备的适配;Flexbox布局用于灵活的页面元素排列;媒体查询构建响应式设计,确保页面在不同屏幕尺寸下表现良好。此外,深入解析了Event Loop的工作原理,宏任务与微任务的区别,以及如何使用async/await和Promise处理异步操作。同时,文章还探讨了如何利用Promise.all并发处理多个请求,并展示了如何利用dataset属性操作DOM元素的自定义数据属性。最后,讨论了事件代理技术,提高大型列表事件处理的效率。

目录

1、rem布局

2、flex布局

3、媒体查询-响应式布局

​4、event loop

 5、宏任务/微任务

 6、async/await

8、Promise.all 

9、dataset

10、事件代理


1、rem布局

html{font-size: 16px} div{font-size: 1rem}

这里的rem就是16px;

给html{font-size: 26.66667vw;};//

26.66667vw = 100px / 375px *100vw,这是iPhone5下的值,如果是其他更大尺寸的手机,26.66667vw的实际像素数要大于100px.

div{font-size:0.16rem};//以100px作为rem,根据UI的px计算更方便

2、flex布局

3、媒体查询-响应式布局

4、event loop

 

console.log('Hello, 哈默!)进入callstack调用栈,执行结果,在控制台输出Hello,哈默!调用栈清空。

 

 setTimeout(() => {

        console.log('回调函数执行')

      }, 3000);

 

进入调用栈,setTimeout(callback, time)是个webapi,5s后才执行callback。此时,调用栈也清空了。

console.log('Hi, 哈默!)进入callstack调用栈,执行结果,在控制台输出Hi,哈默!调用栈清空。

5s过后,callback被推入callback queue,然后被event loop发现,进入调用栈执行。而后调用栈再次清空。

 5、宏任务/微任务

 

 

 

 6、async/await

await 后面跟的可以是promise对象,简单字符串等,或者是async 函数,但是都会被包装成promise对象。

7、promise避免回调地狱

需求:多个promise请求,且前面的方法返回值后面的正好需要

      this.getTodos()
          .then(res=>{
            //xxxx
            return this.getComments();//返回的是promise,故而可以继续使用 .then
          })
          .then(res=>{
            // xxxx
            return this.getAlbums()
          })
          .then(res=>{
            console.log('xxx')
          })

8、Promise.all 

Promise.all(p1, p2, p3)

    .then(res=>{

        // 全部请求结果返回了

})

9、dataset

dom元素的一个属性,在HTML中,使用data-xxx-yyy-zzz这种格式定义的,可以通过dataset获取:

//html
<div id="user" data-id="1234567890" data-user="johndoe" data-date-of-birth>John Doe</div>

//js
const el = document.querySelector('#user');
//可以获取
console.log(el.dataset.id)
//可以设置
el.dataset.dateOfBirth = '1960-10-03';
//可以删除
delete el.dataset.dateOfBirth

10、事件代理

将许多重复的元素,比如li等的对于事件的处理函数,交由父元素来统一处理 。

 let ul = document.querySelector('ul')
 let curId = undefined
    ul.onclick = function (e) {
      console.log(e)
      let event = e || window.event
      let target = event.target || event.srcElement
      let className = target.className
      
      switch (className) {
        case value1:
          xxx
          break;
        case value2:
          xxx
          break;
        default:
          break;
      }
        //配合刚才的dataset,比如data-id,下面就可以使用id
        curId = target.dataset.id
    }

当然可以!以下是针对你提供的两道前端面试题的**专业、简洁、准确且适合面试场景的回答**,既体现技术深度,又便于口头表达: --- ### **1. JavaScript 内置的常用对象有哪些?并列举该对象常用的方法?** JavaScript 提供了多个内置对象(Built-in Objects),它们是语言核心的一部分,无需引入即可使用。常见的包括: #### ✅ 常用内置对象及方法: - **Object** - `Object.keys(obj)` —— 获取对象自身可枚举属性名数组 - `Object.values(obj)` —— 获取对象自身可枚举属性值数组 - `Object.entries(obj)` —— 获取键值对数组 `[key, value]` - `Object.assign(target, ...sources)` —— 合并对象 - **Array** - `arr.map()` / `filter()` / `reduce()` —— 函数式操作 - `arr.push()`, `pop()`, `shift()`, `unshift()` —— 增删元素 - `arr.slice()`, `splice()` —— 截取/修改数组 - `arr.find()`, `findIndex()`, `includes()` —— 查找元素 - **String** - `str.split()`, `join()` —— 字符串与数组转换 - `str.substring()`, `substr()`, `slice()` —— 截取字符串 - `str.indexOf()`, `includes()`, `startsWith()`, `endsWith()` —— 查找匹配 - `str.replace()`, `replaceAll()` —— 替换内容 - `str.trim()`, `toUpperCase()`, `toLowerCase()` —— 格式化 - **Number** - `Number.isNaN()`, `Number.isFinite()` —— 判断数值类型 - `parseInt()`, `parseFloat()` —— 解析字符串为数字 - `toFixed()`, `toPrecision()` —— 格式化输出 - **Date** - `new Date()` —— 创建日期对象 - `getDate()`, `getMonth()`, `getFullYear()` —— 获取年月日 - `setDate()`, `setHours()` 等 —— 设置时间 - `toISOString()`, `toLocaleString()` —— 格式化输出 - **Math** - `Math.random()` —— 生成随机数 - `Math.floor()`, `Math.ceil()`, `Math.round()` —— 取整 - `Math.max()`, `Math.min()` —— 最大最小值 - `Math.pow()`, `Math.sqrt()` —— 幂运算和开方 - **JSON** - `JSON.stringify(obj)` —— 对象转 JSON 字符串 - `JSON.parse(str)` —— JSON 字符串转对象 > 💡 面试加分点:可以说“这些对象都是全局可用的,不需要 new 实例化(除了 Date 和 Array 等构造函数)”,或举例说明在实际项目中如何使用,比如用 `Array.prototype.map` 做数据渲染,用 `JSON.parse` 处理接口返回数据等。 --- ### **2. 在 CSS 中,简述弹性盒子 flex 布局rem 布局?** #### 🟢 Flex 布局(弹性盒子布局Flexbox 是一种一维布局模型,用于在容器内高效地排列子元素,特别适合响应式设计和动态调整空间分配。 **核心概念:** - 容器设置 `display: flex;` 或 `display: inline-flex;` - 主轴方向由 `flex-direction` 控制(row/column) - 子元素通过 `flex-grow`, `flex-shrink`, `flex-basis` 控制伸缩行为 - 对齐方式: - `justify-content` → 主轴对齐(如 center, space-between) - `align-items` → 交叉轴对齐(如 stretch, center) - `align-self` → 单个子元素覆盖 align-items **优点:** - 自动适应屏幕尺寸 - 轻松实现居中、等分、顺序调整 - 支持复杂布局结构(如导航栏、卡片列表) **示例:** ```css .container { display: flex; justify-content: space-around; align-items: center; } .item { flex: 1; /* 平均分配空间 */ } ``` --- #### 🟢 Rem 布局(相对单位布局) `rem` 是相对于根元素 `<html>` 的 `font-size` 的单位,常用于移动端适配或统一缩放比例。 **原理:** - 默认 `1rem = 16px`(浏览器默认字体大小) - 可通过 JS 动态设置 `html { font-size: ... }` 实现按比例缩放 - 所有以 `rem` 为单位的大小都会随根字体变化而等比缩放 **应用场景:** - 移动端 H5 页面适配不同屏幕宽度 - 配合媒体查询或 JS 计算 viewport 宽度来动态设置 root font-size **示例:** ```css html { font-size: 16px; /* 基准 */ } .box { width: 10rem; /* 实际 160px */ padding: 1rem; /* 实际 16px */ } ``` **结合方案(推荐):** - 使用 `flex + rem` 组合:flex 负责内部结构排布,rem 负责整体尺度缩放。 - 或使用 `vw/vh + rem` 更精细控制响应式。 > 💡 面试加分点:可以说“rem 布局本质是‘基准缩放’思想,配合 media query 或 JS 动态计算 root font-size,能实现一套代码多端适配;而 flex 是解决局部布局问题的利器,两者常搭配使用。” --- ✅ 总结建议: 面试时不要死记硬背,要结合项目经验举例说明,比如:“我在上一个电商项目中用 flex 做了商品列表的横向滚动布局,同时用 rem 保证了在手机和平板上的视觉一致性”。 祝你面试顺利,拿到心仪 offer!🎉 如果需要我帮你模拟面试问答或者扩展其他知识点,也可以继续问我~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值