Day4-6 CSS 进阶 + JS 基础 —— 实现 “交互效果 + 样式复用”(对标职场 “组件化思维” 入门)

一、为什么这 3 天是 "从静态到动态" 的关键跃迁?

职场前端开发中,"只会写静态页面" 远远不够 ------ 产品经理常要求 "hover 时按钮变色""点击显示弹窗""表单输入验证" 等交互效果,而设计师则希望 "样式统一、视觉一致"。这 3 天我们聚焦 2 个核心职场需求:

  1. CSS 样式复用与维护(避免写重复代码,对接团队协作);
  2. 基础 JS 交互(实现 "用户操作→页面响应",告别纯静态)。

很多新手卡在 "样式混乱""交互不会写",核心是没掌握 "CSS 模块化" 和 "JS 事件驱动" 的底层逻辑 ------ 这正是从 "入门" 到 "能干活" 的核心门槛。

二、Day4:CSS 进阶 ------ 样式复用(职场 "模块化" 思维落地)
1. 职场痛点:为什么不能 "写一次样式用一次"?

新手写 CSS 常犯的错误:每个元素单独写样式,重复代码多、修改麻烦。比如:

css

复制代码
/* 错误示范:重复样式冗余,维护成本高 */
.btn-login {
  width: 120px;
  height: 40px;
  background-color: #42b983;
  color: #fff;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

.btn-register {
  width: 120px;
  height: 40px;
  background-color: #fff;
  color: #42b983;
  border: 1px solid #42b983;
  border-radius: 4px;
  cursor: pointer;
}

职场问题:如果需要修改按钮圆角(比如从 4px 改成 8px),要改所有按钮样式;团队协作时,每个人写的样式不统一,导致页面视觉混乱。

2. 核心知识点:CSS 模块化的 2 种职场用法(附对比表)
用法 核心逻辑 代码示例 职场适用场景
公共类(基础类) 提取重复样式,复用调用 .btn { width: 120px; height: 40px; border-radius: 4px; cursor: pointer; } 按钮、卡片、表单等通用组件
差异化类 基于基础类,修改个性样式 .btn-primary { background: #42b983; color: #fff; border: none; } 不同状态 / 类型的同一组件(登录 / 注册按钮)
3. 实战:封装 "通用按钮组件"(对接职场 "样式统一" 需求)

css

复制代码
/* 1. 基础类:提取所有按钮的公共样式 */
.btn {
  display: inline-block; /* 支持padding和width */
  padding: 0 20px;
  height: 40px;
  line-height: 40px; /* 垂直居中(文字单行时用) */
  border-radius: 8px; /* 职场常用圆角 */
  cursor: pointer; /* 鼠标悬浮变指针,提示可点击 */
  text-align: center;
  text-decoration: none; /* 清除a标签下划线 */
  font-size: 14px; /* 职场常用字体大小 */
  transition: all 0.3s; /* 过渡动画:交互更丝滑 */
}

/* 2. 差异化类:不同类型按钮 */
.btn-primary {
  background-color: #42b983; /* 主色:成功/确认 */
  color: #fff;
  border: none;
}

.btn-secondary {
  background-color: #fff; /* 次色:取消/返回 */
  color: #42b983;
  border: 1px solid #42b983;
}

.btn-danger {
  background-color: #ff4d4f; /* 警示色:删除/危险操作 */
  color: #fff;
  border: none;
}

/* 3. 交互状态:hover/active(职场必加) */
.btn:hover {
  opacity: 0.9; /* 悬浮时轻微变暗,提升交互感 */
  transform: translateY(-2px); /* 轻微上浮,视觉优化 */
}

.btn:active {
  transform: translateY(0); /* 点击时回归原位 */
}

html

预览

复制代码
<!-- 调用方式:基础类+差异化类,复用性极强 -->
<button class="btn btn-primary">登录</button>
<button class="btn btn-secondary">注册</button>
<button class="btn btn-danger">删除</button>
<a href="/back" class="btn btn-secondary">返回</a>

职场验收标准

  • 所有按钮样式统一,修改基础类(如圆角、高度)可全局生效;
  • 交互状态(hover/active)有反馈,符合用户操作习惯;
  • 支持<button><a>标签复用,适配不同场景。
三、Day5-6:JS 基础 ------ 事件驱动与 DOM 操作(实现 "用户交互" 核心)
1. 职场认知:JS 的核心作用是什么?

HTML 是 "页面结构",CSS 是 "页面样式",而 JS 是 "页面行为"------ 职场中 80% 的基础交互都依赖 "用户操作→JS 响应→DOM 变化" 的逻辑链。比如:

  • 点击按钮显示 / 隐藏弹窗;
  • 输入框实时验证内容格式;
  • 点击导航切换页面内容。
2. 核心知识点:3 个 "职场高频" JS 基础(拒绝死记硬背)
知识点 核心作用 代码示例 职场使用场景
DOM 选择器 找到页面元素 document.querySelector('.btn') 操作指定按钮、输入框等
事件绑定 监听用户操作 btn.addEventListener('click', 函数) 点击、输入、悬浮等交互
DOM 修改 改变页面内容 / 样式 element.style.display = 'none' 显示 / 隐藏元素、修改样式、更新文本
3. 实战:实现 "登录弹窗交互"(对接职场 "弹窗组件" 高频需求)

需求拆解(职场真实需求):

  1. 点击 "登录" 按钮,显示弹窗;
  2. 点击 "关闭" 按钮或弹窗外部,隐藏弹窗;
  3. 输入框实时验证:用户名不能为空,密码长度≥6 位。

html

预览

复制代码
<!-- 弹窗结构 -->
<div class="modal" id="loginModal">
  <div class="modal-content">
    <span class="close-btn" id="closeBtn">×</span>
    <h3>用户登录</h3>
    <form id="loginForm">
      <div class="form-item">
        <label>用户名:</label>
        <input type="text" id="username" placeholder="请输入用户名">
        <span class="error-message" id="usernameError"></span>
      </div>
      <div class="form-item">
        <label>密码:</label>
        <input type="password" id="password" placeholder="请输入密码">
        <span class="error-message" id="passwordError"></span>
      </div>
      <button type="submit" class="btn btn-primary">登录</button>
    </form>
  </div>
</div>

<!-- 触发按钮 -->
<button class="btn btn-primary" id="showLoginBtn">登录</button>

css

复制代码
/* 弹窗样式:默认隐藏 */
.modal {
  display: none; /* 初始隐藏 */
  position: fixed; /* 固定定位,覆盖整个页面 */
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5); /* 半透明遮罩 */
  z-index: 999; /* 确保弹窗在最上层 */
  align-items: center;
  justify-content: center;
}

.modal-content {
  background-color: #fff;
  padding: 30px;
  border-radius: 8px;
  width: 350px;
  position: relative;
}

.close-btn {
  position: absolute;
  top: 15px;
  right: 20px;
  font-size: 20px;
  cursor: pointer;
  color: #999;
}

.close-btn:hover {
  color: #333;
}

.form-item {
  margin-bottom: 20px;
}

.form-item label {
  display: block;
  margin-bottom: 8px;
  font-size: 14px;
}

.form-item input {
  width: 100%;
  height: 40px;
  padding: 0 10px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

.error-message {
  display: block;
  margin-top: 5px;
  font-size: 12px;
  color: #ff4d4f; /* 错误提示色 */
}

javascript

运行

复制代码
// 1. 获取页面元素(DOM选择器)
const showLoginBtn = document.getElementById('showLoginBtn');
const loginModal = document.getElementById('loginModal');
const closeBtn = document.getElementById('closeBtn');
const loginForm = document.getElementById('loginForm');
const username = document.getElementById('username');
const password = document.getElementById('password');
const usernameError = document.getElementById('usernameError');
const passwordError = document.getElementById('passwordError');

// 2. 显示弹窗(事件绑定+DOM修改)
showLoginBtn.addEventListener('click', function() {
  loginModal.style.display = 'flex'; // 从none改为flex,显示弹窗
});

// 3. 隐藏弹窗(多个触发场景:关闭按钮、遮罩层)
function hideModal() {
  loginModal.style.display = 'none';
  loginForm.reset(); // 隐藏时重置表单
  usernameError.textContent = ''; // 清空错误提示
  passwordError.textContent = '';
}

closeBtn.addEventListener('click', hideModal);

// 点击遮罩层关闭弹窗
loginModal.addEventListener('click', function(e) {
  // 只有点击遮罩层(modal本身)时才关闭,避免点击弹窗内容也关闭
  if (e.target === loginModal) {
    hideModal();
  }
});

// 4. 表单验证(输入事件+提交事件)
// 用户名验证
username.addEventListener('input', function() {
  if (!this.value.trim()) {
    usernameError.textContent = '用户名不能为空';
  } else {
    usernameError.textContent = ''; // 输入合法时清空错误
  }
});

// 密码验证
password.addEventListener('input', function() {
  if (this.value.length < 6) {
    passwordError.textContent = '密码长度不能少于6位';
  } else {
    passwordError.textContent = '';
  }
});

// 表单提交验证
loginForm.addEventListener('submit', function(e) {
  e.preventDefault(); // 阻止表单默认提交行为(关键:避免页面刷新)
  
  let isValide = true;
  
  // 再次验证(防止用户直接提交空表单)
  if (!username.value.trim()) {
    usernameError.textContent = '用户名不能为空';
    isValide = false;
  }
  
  if (password.value.length < 6) {
    passwordError.textContent = '密码长度不能少于6位';
    isValide = false;
  }
  
  // 验证通过:模拟登录成功
  if (isValide) {
    alert(`登录成功!用户名:${username.value}`);
    hideModal();
  }
});

职场逻辑拆解

  1. 元素获取:用getElementById精准选择元素(职场优先使用 ID 选择器,效率高);
  2. 事件绑定:每个交互(点击、输入、提交)都对应一个事件,逻辑清晰;
  3. DOM 修改:通过style.display控制显示隐藏,textContent修改文本内容;
  4. 边界处理:阻止表单默认提交、点击弹窗内容不关闭遮罩层,这些都是职场中 "用户体验" 的关键细节。
四、3 天总结:职场能力落地清单
  1. 能封装 CSS 通用组件(基础类 + 差异化类),实现样式复用和统一;
  2. 能通过 JS 实现 "点击、输入" 等基础交互,理解 "事件驱动" 逻辑;
  3. 掌握 DOM 选择器、事件绑定、DOM 修改的核心用法,能独立完成弹窗、表单验证等常见需求;
  4. 完成作业:基于本文代码,添加 "注册弹窗",实现 "点击注册→显示注册表单→验证手机号格式(11 位数字)→提交成功提示",并提交到 GitHub(练习代码版本管理)。
下一篇预告:Day7-9 响应式布局 + JS DOM 进阶 ------ 实现 "多端兼容 + 动态数据渲染"(对接职场 "移动端适配" 核心需求)
相关推荐
seven_7678230981 小时前
MateChat自然语言生成UI(NLG-UI):从描述到可交互界面的自动生成
ui·交互·devui·matechat
今天也想MK代码1 小时前
JS 注入机制深度解析
java·前端·javascript
一字白首1 小时前
Vue 进阶,指令补充 + computed+watch
前端·javascript·vue.js
苏打水com1 小时前
Day1-3 夯实基础:HTML 语义化 + CSS 布局实战(对标职场 “页面结构搭建” 核心需求)
前端·css·html·js
m0_740043731 小时前
mapState —— Vuex 语法糖
java·前端·javascript·vue.js
哟哟耶耶1 小时前
WebPage-postcss-px-to-viewport前端适配
前端·javascript·postcss
EB_Coder2 小时前
前端面试题-JavaScript高级篇
前端·javascript·面试
好奇的候选人面向对象2 小时前
实现一个左右树形结构一对一关联的组件。这个方案使用两个el-tree组件,并实现它们之间的互相关联选择。
javascript·vue.js·elementui
苏打水com2 小时前
第三篇:Day7-9 响应式布局+JS DOM进阶——实现“多端兼容+动态数据渲染”(对标职场“移动端适配”核心需求)
前端·css·html·js