xDocxDoc
AI
前端
后端
iOS
Android
Flutter
AI
前端
后端
iOS
Android
Flutter
  • JavaScript 100 题

    • JavaScript 面试 100 题及参考答案
  • HTML+CSS 50题

    • 前端面试之 HTML+CSS 50题及参考答案
  • Vue 50题

    • 前端面试之 Vue 50题及参考答案
  • React 50题

    • 前端面试之 React 50题及参考答案
  • 前端工程化50题

    • 前端面试之工程化50题及参考答案
  • 实践案例50题

    • 前端面试之实践案例50题及参考答案

前端面试之 HTML+CSS 50题及参考答案

📘 HTML 部分

1. 什么是 DOCTYPE?它的作用是什么?

DOCTYPE(文档类型声明)用于告知浏览器当前文档使用的 HTML 或 XHTML 规范版本,确保页面以标准模式渲染。例如 <!DOCTYPE html> 表示使用 HTML5 标准。若未声明或格式错误,浏览器可能进入怪异模式(Quirks Mode),导致样式和布局解析不一致。

2. HTML5 有哪些新特性?

HTML5 引入了多项增强功能:

  • 语义化标签:如 <header>, <footer>, <article>, <section>,提升代码可读性和 SEO 效果。
  • 多媒体支持:原生 <audio> 和 <video> 标签,替代 Flash 插件。
  • 图形绘制:<canvas> 和 SVG 支持动态图形。
  • 本地存储:localStorage(持久存储)和 sessionStorage(会话存储)。
  • 表单增强:新增 email, url, date 等输入类型,及 placeholder, required 等属性。
  • APIs:地理定位、Web Workers、WebSocket 等。

3. 什么是 HTML 语义化?为什么重要?

语义化指使用恰当的 HTML 标签描述内容的结构和含义(如用 <nav> 表示导航,<article> 表示文章),而非仅用 <div> 和 <span>。其重要性体现在:

  • SEO 优化:搜索引擎更好理解页面内容结构。
  • 可访问性:屏幕阅读器能准确解析内容,提升无障碍体验。
  • 代码维护:结构清晰,便于团队开发和维护。

4. 块级元素与内联元素的区别?

  • 块级元素(如 <div>, <p>, <h1>):独占一行,可设置宽高,默认宽度撑满父容器。
  • 内联元素(如 <span>, <a>, <img>):不换行,宽高由内容决定,无法直接设置垂直方向的内外边距。

5. 如何理解 HTML 中的 data-* 属性?

data-* 属性用于存储自定义数据,可通过 JavaScript 访问:

<div data-user-id="123" data-role="admin">用户信息</div>
<script>
  const element = document.querySelector('div');
  console.log(element.dataset.userId); // "123"
</script>

优势:符合 HTML 规范,不影响布局,便于数据传递。

6. <meta> 标签有哪些常见用途?

  • 字符集声明:<meta charset="UTF-8">
  • 视口设置:<meta name="viewport" content="width=device-width, initial-scale=1.0">(用于响应式设计)
  • SEO 相关:<meta name="description" content="页面描述"> 和 <meta name="keywords" content="关键词">
  • HTTP 指令:如重定向 <meta http-equiv="refresh" content="5;url=https://example.com">。

7. 什么是 XHTML?与 HTML 的区别?

XHTML(eXtensible HyperText Markup Language)是更严格的 HTML 版本,基于 XML 语法:

  • 标签必须闭合(如 <br />)。
  • 属性值必须用引号包裹。
  • 元素必须正确嵌套。
  • 区分大小写(通常小写)。 HTML5 放宽了部分语法要求,但推荐遵循 XHTML 的严谨风格。

8. 如何实现 HTML 页面的锚点跳转?

使用 <a> 标签的 href 属性指向目标元素的 id:

<a href="#section1">跳转到第一节</a>
<section id="section1">这里是第一节内容</section>

点击链接后页面会滚动至对应 id 的元素处。

9. 什么是 Web Worker?

Web Worker 允许在后台线程运行 JavaScript 脚本,避免阻塞主线程。适用于计算密集型任务(如图像处理、数据分析):

// 主线程
const worker = new Worker('worker.js');
worker.postMessage(data);
worker.onmessage = (e) => console.log(e.data);

// worker.js
self.onmessage = (e) => {
  const result = heavyCalculation(e.data);
  self.postMessage(result);
};

注意:Worker 无法直接操作 DOM。

10. 如何优化 HTML 页面的 SEO?

  • 使用语义化标签(如 <header>, <main>, <article>)。
  • 设置 <title> 和 <meta name="description">。
  • 为图片添加 alt 属性。
  • 使用结构化数据(如 JSON-LD)。
  • 确保 URL 简洁且包含关键词。

🎨 CSS 部分

11. CSS 盒模型是什么?标准盒模型与怪异盒模型的区别?

盒模型描述元素布局的结构,包括:

  • 内容(content):实际内容区域。
  • 内边距(padding):内容与边框的间距。
  • 边框(border):围绕内容和内边距的边界。
  • 外边距(margin):元素与其他元素的间距。

区别:

  • 标准盒模型(默认):width 和 height 仅指内容区域的大小。
  • 怪异盒模型(IE 盒模型):width 和 height 包含内容、内边距和边框。 可通过 box-sizing 切换:
div {
  box-sizing: border-box; /* 怪异盒模型 */
  box-sizing: content-box; /* 标准盒模型 */
}

12. CSS 选择器优先级如何计算?

优先级由选择器的特异性权重决定(从高到低):

  1. !important(覆盖所有规则)
  2. 内联样式(如 style="color:red",权重 1000)
  3. ID 选择器(如 #id,权重 100)
  4. 类选择器、属性选择器、伪类(如 .class, [type="text"], :hover,权重 10)
  5. 元素选择器、伪元素(如 div, ::before,权重 1)
  6. 通配符选择器(如 *,权重 0)

示例:

#nav .menu li:hover a /* 权重: 100 + 10 + 1 + 10 + 1 = 122 */
div#sidebar ul.nav     /* 权重: 1 + 100 + 1 + 10 = 112 */

相同权重时,后定义的样式生效。

13. 如何实现元素的水平垂直居中?

方法 1:Flexbox

.parent {
  display: flex;
  justify-content: center; /* 水平居中 */
  align-items: center;     /* 垂直居中 */
}

方法 2:Grid

.parent {
  display: grid;
  place-items: center; /* 同时水平垂直居中 */
}

方法 3:绝对定位 + transform

.parent {
  position: relative;
}
.child {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

14. 什么是 BFC?如何创建?有什么作用?

BFC(块级格式化上下文)是独立的渲染区域,内部元素不影响外部布局。 创建方式:

  • overflow: hidden(非 visible)
  • float: left 或 right
  • position: absolute 或 fixed
  • display: inline-block, flex, grid

作用:

  • 清除浮动(防止父元素高度塌陷)。
  • 避免外边距重叠(margin collapse)。
  • 隔离内部元素,防止外部浮动影响。

15. Flexbox 布局的核心概念?

Flexbox 是一维布局模型,通过容器和项目属性控制排列: 容器属性:

.container {
  display: flex;
  flex-direction: row | column;   /* 主轴方向 */
  justify-content: flex-start;    /* 主轴对齐 */
  align-items: stretch;           /* 交叉轴对齐 */
  flex-wrap: nowrap;              /* 是否换行 */
}

项目属性:

.item {
  flex: 1;                    /* flex-grow, flex-shrink, flex-basis */
  align-self: auto;           /* 单独对齐 */
  order: 0;                   /* 排序 */
}

适用于导航栏、卡片布局等。

16. CSS Grid 布局的核心概念?

Grid 是二维网格布局系统: 容器属性:

.container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr; /* 列定义 */
  grid-template-rows: 100px auto;      /* 行定义 */
  gap: 10px;                          /* 间隙 */
  place-items: center;                /* 单元格内容对齐 */
}

项目属性:

.item {
  grid-column: 1 / 3;  /* 占据第1至第2列 */
  grid-row: 1;         /* 占据第1行 */
}

适用于复杂布局(如仪表盘、杂志排版)。

17. 什么是响应式设计?如何实现?

响应式设计使网页自适应不同设备屏幕,核心实现方式:

  • 媒体查询(Media Queries):
    /* 移动端优先 */
    .container { padding: 10px; }
    @media (min-width: 768px) { /* 平板 */
      .container { width: 750px; margin: 0 auto; }
    }
    @media (min-width: 1024px) { /* 桌面 */
      .container { display: grid; grid-template-columns: 1fr 3fr; }
    }
  • 流动布局:使用百分比、fr 单位而非固定宽度。
  • 弹性媒体:图片设置 max-width: 100%。
  • 视口单位:vw(视口宽度百分比)、vh(视口高度百分比)。

18. 如何实现移动端适配?

方案 1:rem 布局

// 设置根字体大小(基于设计稿宽度 375px)
function setRem() {
  const fontSize = (window.innerWidth / 375) * 100;
  document.documentElement.style.fontSize = fontSize + 'px';
}
window.addEventListener('resize', setRem);

CSS 中使用 rem 单位:

.header { height: 1.2rem; } /* 设计稿中 45px → 1.2rem */

方案 2:vw/vh 单位

.sidebar { width: 25vw; }
.content { font-size: 4vw; }

结合 Flexbox/Grid 实现灵活布局。

19. CSS 动画与过渡的区别?

  • 过渡(transition):用于状态变化的平滑过渡(如 hover 效果)。
    button {
      transition: background-color 0.3s ease;
    }
    button:hover {
      background-color: blue;
    }
  • 动画(animation):通过 @keyframes 定义复杂多帧动画。
    @keyframes fadeIn {
      from { opacity: 0; }
      to { opacity: 1; }
    }
    .element {
      animation: fadeIn 2s infinite;
    }

。

20. 如何隐藏元素?display: none 与 visibility: hidden 的区别?

  • display: none:完全从文档流移除,不占空间,无法交互。
  • visibility: hidden:隐藏但保留空间,无法交互。
  • opacity: 0:透明但保留空间,可交互。
  • clip-path: circle(0):视觉隐藏但保留空间。

🔧 高级技巧与性能优化

21. 如何减少重绘(repaint)和重排(reflow)?

重排(布局改变)和重绘(外观改变)影响性能:

  • 避免频繁操作样式:合并多次 DOM 操作。
  • 使用 transform 和 opacity:这两个属性触发合成层,避免重排。
  • 批量读取/写入 DOM:先读取所有值,再统一写入。
  • 避免表格布局:表格的重排成本高。

22. 什么是 CSS 变量?如何用?

CSS 变量(自定义属性)实现值复用:

:root {
  --primary-color: #007bff;
  --spacing: 10px;
}
.button {
  background-color: var(--primary-color);
  padding: var(--spacing);
}

优点:便于主题切换和全局调整。

23. 如何实现深色模式?

基于 CSS 变量和媒体查询:

:root {
  --bg-color: #fff;
  --text-color: #000;
}
@media (prefers-color-scheme: dark) {
  :root {
    --bg-color: #333;
    --text-color: #fff;
  }
}
body {
  background: var(--bg-color);
  color: var(--text-color);
}

24. 如何优化 CSS 性能?

  • 减少选择器复杂度:避免深层嵌套(如 .nav ul li a)。
  • 使用压缩工具:如 CSSNano、UglifyCSS。
  • 避免 @import:会增加请求阻塞。
  • 利用缓存:设置 Cache-Control 头部。
  • 代码分割:按需加载 CSS。

25. 什么是 CSS 模块化?如何实现?

CSS 模块化将样式封装到组件级别,避免全局污染:

  • CSS-in-JS:使用 Styled-components、Emotion。
  • BEM 命名规范:block__element--modifier。
  • CSS Modules:
    /* style.module.css */
    .button { background: blue; }
    import styles from './style.module.css';
    <button className={styles.button}>Click</button>

。


🧪 实战代码示例

26. 实现一个三角形

利用 border 属性:

.triangle {
  width: 0;
  height: 0;
  border-left: 50px solid transparent;
  border-right: 50px solid transparent;
  border-bottom: 100px solid red;
}

。

27. 实现一个圆形按钮

.circle-button {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background: #007bff;
  display: flex;
  align-items: center;
  justify-content: center;
  color: white;
}

。

28. 实现一个响应式网格布局

使用 Grid:

.grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 20px;
}

auto-fit 自动调整列数,minmax 限制最小和最大宽度。

29. 实现文本溢出显示省略号

单行文本:

.ellipsis {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

多行文本(WebKit 内核):

.multiline-ellipsis {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

30. 实现一个 sticky 导航栏

.navbar {
  position: sticky;
  top: 0;
  background: white;
  z-index: 1000;
}

当滚动到 top: 0 时元素固定。


📊 综合题目

31. 如何实现一个模态框(Modal)?

HTML:

<div class="modal-overlay">
  <div class="modal">
    <h2>标题</h2>
    <p>内容</p>
    <button class="close">关闭</button>
  </div>
</div>

CSS:

.modal-overlay {
  position: fixed;
  top: 0; left: 0;
  width: 100vw; height: 100vh;
  background: rgba(0,0,0,0.5);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}
.modal {
  background: white;
  padding: 20px;
  border-radius: 8px;
}

通过 JavaScript 控制显示/隐藏。

32. 如何实现一个响应式导航菜单?

移动端折叠菜单:

.nav {
  display: flex;
  flex-direction: column;
}
@media (min-width: 768px) {
  .nav {
    flex-direction: row;
  }
}

结合 JavaScript 切换移动端的菜单展开状态。

33. 如何实现一个图片画廊?

使用 Grid 布局:

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 10px;
}
.gallery img {
  width: 100%;
  height: auto;
  object-fit: cover;
}

34. 如何实现一个渐变背景?

.gradient-bg {
  background: linear-gradient(45deg, #ff9a9e, #fad0c4);
}

可结合 radial-gradient 实现径向渐变。

35. 如何实现一个滚动吸顶效果?

.section-title {
  position: sticky;
  top: 0;
  background: white;
  z-index: 10;
}

当滚动时标题会固定在顶部。


🧩 浏览器与兼容性

36. 如何解决常见浏览器兼容性问题?

  • 前缀处理:使用 Autoprefixer 自动添加 -webkit-, -moz- 等前缀。
  • 特性检测:使用 @supports 查询:
    @supports (display: grid) {
      .container { display: grid; }
    }
  • Polyfills:如使用 respond.js 支持媒体查询。

37. 如何实现跨浏览器的一致样式?

使用 CSS Reset 或 Normalize.css:

/* 简单 Reset */
* { margin: 0; padding: 0; box-sizing: border-box; }

Normalize.css 更细致,保留有用默认值。

38. 如何处理移动端点击延迟?

部分浏览器有 300ms 点击延迟(用于判断双击),解决方案:

  • 设置视口 <meta name="viewport" content="width=device-width, initial-scale=1">。
  • 使用 CSS touch-action: manipulation; 禁用双击缩放。
  • 使用 FastClick 库。

39. 如何优化移动端滚动体验?

.container {
  -webkit-overflow-scrolling: touch; /* 启用弹性滚动 */
  overflow-scrolling: touch;
}

避免使用 overflow: scroll 在移动端的卡顿。

40. 如何实现移动端的 1px 边框?

解决高清屏中 1px 实际显示较粗的问题:

.border-1px {
  position: relative;
}
.border-1px::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 1px;
  background: black;
  transform: scaleY(0.5);
}

通过 transform 缩放实现细边框。


🚀 性能与高级特性

41. 如何使用 CSS 实现硬件加速?

将动画属性提升至 GPU 渲染:

.animate {
  transform: translateZ(0);
  /* 或 */
  will-change: transform;
}

注意:滥用可能导致内存问题。

42. 如何实现懒加载?

图片懒加载通过 data-src 和 Intersection Observer:

<img data-src="image.jpg" class="lazyload">
<script>
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        observer.unobserve(img);
      }
    });
  });
  document.querySelectorAll('.lazyload').forEach(img => observer.observe(img));
</script>

。

43. 如何优化首屏加载时间?

  • 关键 CSS 内联:将首屏所需样式直接内联在 <style> 中。
  • 异步加载非关键 CSS:
    <link rel="preload" href="styles.css" as="style" onload="this.rel='stylesheet'">
  • 压缩资源:使用 Gzip、Brotli 压缩。

44. 如何实现动态主题切换?

基于 CSS 变量和 JavaScript:

:root[data-theme="dark"] {
  --bg-color: #333;
  --text-color: #fff;
}
document.documentElement.setAttribute('data-theme', 'dark');

结合 localStorage 持久化用户选择。

45. 如何检测用户偏好减少动画?

使用 prefers-reduced-motion 媒体查询:

@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

为对运动敏感的用户提供无障碍支持。


💡 总结与建议

46. 如何系统学习 HTML 和 CSS?

  • 基础:掌握语义化 HTML 和 CSS 盒模型、选择器、布局。
  • 布局技术:深入 Flexbox 和 Grid,理解适用场景。
  • 响应式设计:实践媒体查询和移动优先策略。
  • 性能优化:学习重绘/重排、压缩、缓存技术。
  • 无障碍:关注 ARIA 角色和键盘导航。

47. 常见面试考察点?

  • 基础概念:盒模型、选择器优先级、语义化。
  • 布局能力:居中、多栏布局、响应式设计。
  • 动画与交互:过渡、动画、变形。
  • 性能与兼容性:重绘/重排、跨浏览器处理。
  • 实战经验:项目中的解决方案和优化措施。

48. 推荐学习资源?

  • 文档:https://developer.mozilla.org/
  • 练习:https://cssgridgarden.com/, https://flexboxfroggy.com/
  • 书籍:《CSS揭秘》、《现代 CSS》

49. 如何准备面试?

  • 梳理知识体系:按模块复习(如布局、动画、响应式)。
  • 实战练习:手写常见组件(如模态框、导航栏)。
  • 模拟面试:尝试口头解释概念和解决方案。
  • 关注前沿:了解 CSS 新特性(如 Container Queries、:has())。

50. 未来发展趋势?

  • CSS 新特性:层叠层(@layer)、容器查询(@container)、作用域样式(@scope)。
  • 工具链:CSS-in-JS、原子化 CSS(如 Tailwind)。
  • 设计系统:组件化、标准化提升开发效率。
  • 无障碍与包容性设计:更关注可访问性和用户体验。

🎯 总结

本文详细整理了前端面试中常见的 HTML 和 CSS 题目,从基础概念到高级应用,涵盖了布局技术、响应式设计、性能优化及实战技巧。希望通过这些题目和详解,帮助你巩固知识体系,从容应对面试挑战。

关键点回顾:

  • HTML 核心:语义化标签、SEO、可访问性。
  • CSS 核心:盒模型、选择器、Flexbox/Grid 布局。
  • 高级技巧:动画、性能优化、响应式设计。
  • 实战能力:组件实现、跨浏览器兼容。

持续学习和实践是提升技能的关键,祝你面试顺利!

最后更新: 2025/9/18 18:20