前端面试必备:HTML、CSS与JS综合实战题解析
前端开发岗位的面试中,HTML、CSS和JavaScript的综合应用能力是考察重点。本文将分享几道典型的前端面试题,帮助你全面准备技术面试。
响应式布局实现方案

现代前端开发中,响应式设计已成为标配。面试官常会考察候选人实现响应式布局的能力。
一个常见的题目是:"如何实现一个三栏布局,左右两栏宽度固定为200px,中间栏自适应宽度,并且在屏幕宽度小于600px时变为上下堆叠布局?"
解决方案可以结合Flexbox和媒体查询:
.container {
display: flex;
min-height: 100px;
}
.left, .right {
flex: 0 0 200px;
background: #ccc;
}
.middle {
flex: 1;
background: #eee;
}
@media (max-width: 600px) {
.container {
flex-direction: column;
}
.left, .right, .middle {
flex: 1;
width: 100%;
}
}
DOM操作与事件处理
JavaScript的DOM操作能力是前端基础。典型问题如:"实现一个按钮,点击后动态添加列表项,并且每个列表项都有删除功能。"
完整实现代码如下:
<button id="addBtn">添加项目</button>
<ul id="list"></ul>
<script>
const addBtn = document.getElementById('addBtn');
const list = document.getElementById('list');
let count = 1;
addBtn.addEventListener('click', () => {
const li = document.createElement('li');
li.textContent = `项目 ${count++}`;
const delBtn = document.createElement('button');
delBtn.textContent = '删除';
delBtn.addEventListener('click', () => {
li.remove();
});
li.appendChild(delBtn);
list.appendChild(li);
});
</script>
CSS选择器优先级问题
理解CSS选择器优先级对解决样式冲突至关重要。面试题可能问:"以下选择器的优先级顺序是什么?"
示例选择器:
#header .nav li a:hover div#header ul.nav > li > a .nav li a.active a
优先级从高到低依次是:
div#header ul.nav > li > a(1ID+2类+3元素)#header .nav li a:hover(1ID+1类+3元素+伪类).nav li a.active(2类+2元素)a(1元素)
闭包的实际应用
JavaScript闭包是面试高频考点。实际问题可能是:"利用闭包实现一个计数器函数,每次调用返回递增的数字。"
解决方案:
function createCounter() {
let count = 0;
return function() {
return ++count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
跨域问题解决方案
前端开发中跨域问题是必考点。面试官可能问:"列举你知道的跨域解决方案并简要说明原理。"
常见方案包括:
JSONP - 利用
<script>标签不受同源策略限制的特性CORS - 服务器设置
Access-Control-Allow-Origin响应头代理服务器 - 后端转发请求绕过浏览器限制
postMessage - 跨文档通信API
WebSocket - 不受同源策略限制的全双工通信协议
CSS动画性能优化
前端性能优化中,CSS动画是重点。面试问题可能是:"如何优化CSS动画性能?"
关键优化点:
使用
transform和opacity属性,它们不会触发重排避免在动画中使用
height、width、margin等会触发重排的属性使用
will-change属性预先告知浏览器哪些元素会变化减少动画元素的数量和复杂度
使用
requestAnimationFrame替代setTimeout/setInterval
ES6+新特性应用
现代JavaScript特性是考察重点。典型题目:"使用ES6+语法重构以下代码..."
原始代码可能是:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function() {
console.log('Hello, ' + this.name);
};
重构后:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, ${this.name}`);
}
}
前端安全防护措施
安全问题不容忽视。面试可能问:"如何防范XSS攻击?"
主要防护措施:
对所有用户输入进行转义处理
使用CSP(内容安全策略)限制脚本执行
避免使用
innerHTML,优先使用textContent对特殊字符进行编码
使用HttpOnly标记cookie防止JavaScript访问
综合实战题目
最后来看一个综合题目:"实现一个图片懒加载组件,要求:
初始只加载视口内的图片
滚动时动态加载进入视口的图片
图片加载时显示占位图
支持响应式图片"
解决方案核心代码:
class LazyLoad {
constructor(selector) {
this.images = document.querySelectorAll(selector);
this.init();
this.addScrollListener();
}
init() {
this.images.forEach(img => {
img.setAttribute('data-src', img.src);
img.src = 'placeholder.jpg';
if (this.isInViewport(img)) {
this.loadImage(img);
}
});
}
isInViewport(el) {
const rect = el.getBoundingClientRect();
return (
rect.top <= window.innerHeight &&
rect.bottom >= 0
);
}
loadImage(img) {
img.src = img.getAttribute('data-src');
img.onload = () => {
img.removeAttribute('data-src');
};
}
addScrollListener() {
window.addEventListener('scroll', () => {
this.images.forEach(img => {
if (img.hasAttribute('data-src') && this.isInViewport(img)) {
this.loadImage(img);
}
});
});
}
}
new LazyLoad('img.lazy');
总结
前端面试考察的是综合能力,以上题目涵盖了HTML结构、CSS样式和JavaScript交互的核心知识点。准备面试时,建议不仅要理解这些概念,还要能动手实现。多练习实际项目,遇到问题时深入思考原理,这样才能在面试中游刃有余。



还没有评论,来说两句吧...