前端开发作为连接用户与产品的重要桥梁,涉及 HTML、CSS 和 JavaScript 的综合运用。但在实际开发过程中,开发者常常会遇到各种“坑”,比如页面布局异常、跨域请求失败、性能瓶颈、浏览器兼容性差等问题。
本文将围绕 前端开发中常见的十大问题 展开讲解:
每部分都配有 完整的代码示例和解决方案,适合初学者学习掌握,也适合中级开发者深入理解。
元素宽度超出预期,或在不同浏览器下显示不一致。
使用 box-sizing: border-box;
统一盒模型计算方式。
* {
box-sizing: border-box;
}
父容器无法包裹浮动子元素,高度为0。
<div class="container">
<div class="left">左侧内容div>
<div class="right">右侧内容div>
div>
.left, .right {
float: left;
width: 50%;
}
.container::after {
content: "";
display: table;
clear: both;
}
Flex 布局中元素未按预期居中。
.container {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
/* good */
.card {}
.card__title {}
/* bad */
.title {}
父元素样式被子元素意外继承。
all: initial;
重置继承样式!important
(慎用)getData(function(data) {
process(data, function(result) {
save(result, function() {
console.log("完成");
});
});
});
async function handleData() {
const data = await getData();
const result = await process(data);
await save(result);
console.log("完成");
}
浏览器同源策略限制了跨域请求。
Access-Control-Allow-Origin: *
// vite.config.js
server: {
proxy: {
'/api': 'http://localhost:3000'
}
}
<img src="placeholder.jpg" data-src="real-image.jpg" alt="图片" class="lazy-img">
document.addEventListener("DOMContentLoaded", function () {
const images = document.querySelectorAll(".lazy-img");
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
observer.unobserve(entry.target);
}
});
});
images.forEach(img => observer.observe(img));
});
function debounce(fn, delay) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
function throttle(fn, delay) {
let last = 0;
return (...args) => {
const now = Date.now();
if (now - last > delay) {
fn.apply(this, args);
last = now;
}
};
}
let
、const
、箭头函数
<meta name="viewport" content="width=device-width, initial-scale=1.0">
function setRem() {
const baseSize = 16;
const scale = document.documentElement.clientWidth / 750;
document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + "px";
}
window.addEventListener("resize", setRem);
setRem();
<header>header>
<nav>nav>
<main>main>
<footer>footer>
<title>首页 - 我的网站title>
<meta name="description" content="这是一个优秀的前端开发博客网站">
避免直接插入用户输入内容:
element.innerHTML = userInput; // ❌ 危险
element.textContent = userInput; // ✅ 安全
以下就是常见的问题点了
模块 | 技能点 |
---|---|
页面布局 | 盒模型、浮动、Flex 布局 |
CSS 冲突 | BEM 命名、scoped 样式、继承控制 |
JS 异步 | Promise、async/await、防抖节流 |
跨域问题 | CORS、代理配置 |
性能优化 | 懒加载、分页、缓存策略 |
浏览器兼容 | Polyfill、Babel、IE 适配 |
移动适配 | REM、视口设置 |
SEO 优化 | 语义化标签、meta 标签 |
构建优化 | Webpack/Vite 配置、压缩策略 |
安全防护 | XSS、CSRF 防御手段 |