A · ### 解答思路 不需要精确计算高度的一半,只要把 border-radius 设置成一个足够大的数值(远超过元素实际高度),浏览器会自动把它截断到「高度的一半」,效果等同于胶囊形状。 ### 示例代码 ```css .toast { border-radius: 999999px; } ``` ### 详细说明 CS
A · ### 解答思路 这种写法是可行的:在循环体内创建 Promise,将 resolve 放到 img.onload 回调中,再用 await 阻塞循环,直到图片加载完成后 Promise 被 resolve,循环才会进入下一次迭代。 ### 示例代码 ```js async function a() { for (le
A · ### 解答思路 浏览器是否下载文件,除了看前端 `<a>` 标签本身的属性,还会参考服务端响应头。可以从两方面入手:给 `<a>` 标签加 `download` 属性,同时让服务端返回 `Content-Disposition: attachment` 响应头。 ### 示例代码 ```html <a href="a
A · ### 解答思路 将图片资源地址放在 `<a>` 标签的 `href` 上,并让服务端为该资源响应设置下载相关的响应头,是移动端触发下载兼容性较好的做法。 ### 示例代码 ```html <a href="https://example.com/pic.jpg">点击下载图片</a> ``` ``` Content-
A · ### 解答思路 `res.push(path)` 直接把 `path` 这个数组的引用存入 `res`,之后如果 `path` 本身被修改,`res` 里存的内容也会跟着变;而 `res.push([...path])` 通过展开语法先复制出一个全新数组再存入 `res`,从而切断了与原 `path` 的引用关系,后
A · ### 解答思路 执行顺序由 JavaScript 的事件循环(Event Loop)机制决定:每执行完一个宏任务后,会先把当前微任务队列中的所有任务清空执行完,然后才会去取下一个宏任务继续执行;`Promise.then` 的回调属于微任务,`setTimeout` 的回调属于宏任务。 ### 详细说明 Event
A · ### 解答思路 这类问题的根源几乎都出在「存入的是对象,取出来却当字符串用」或者反过来。可以按顺序排查:先打印取出的值本身,再用 `typeof` 判断它到底是字符串还是对象,是字符串就需要用 `JSON.parse` 转换成对象后再访问属性。 ### 详细说明 排查步骤: 1. **先直接打印 `params`**
A · ### 解答思路 超时问题通常来自两个方向:前端自己设置了过短的 `timeout` 限制,或服务端主动断开了长时间未完成的连接。针对下载进度展示,axios 本身提供了 `onUploadProgress` 和 `onDownloadProgress` 两个回调,可以直接监听原生的进度事件。 ### 示例代码 ```
A · ### 解答思路 禁止元素拖动常见的做法确实是 `user-select: none` 和 `-webkit-user-drag: none` 这两个 CSS 属性,但如果页面没有使用它们、却观察到了拖动相关事件的绑定,说明很可能是通过监听 `dragstart` 等原生拖拽事件、并在事件回调中调用 `preventD
A · ### 解答思路 关键先要区分清楚 `MyObj.showName()`(调用方法,取的是**返回值**)和 `MyObj.showName`(取的是**方法本身的引用**,尚未调用)是两个完全不同的东西;再结合 `this` 的指向规则——默认由「调用者」决定——就能推出为什么直接把方法引用传给 `setTimeou