在前端开发中,JS负责交互逻辑,CSS负责样式呈现,二者配合是实现网页功能的基础。本文聚焦新手必学的JS事件处理方法和CSS常用属性,用「概念+语法+案例」的形式拆解核心知识点,所有代码可直接复制运行,帮你快速打通前端基础关。
一、JS基础事件处理:让网页"动"起来
JS事件处理的核心是「监听用户行为(如点击、输入),并执行对应逻辑」。常见的事件类型包括鼠标事件、键盘事件、表单事件等,处理方式主要有行内绑定、DOM属性绑定、事件监听三种,下面逐一拆解。
(一)3种核心事件绑定方式
- 行内绑定(简单但不推荐,耦合性高)
直接在HTML标签内通过on+事件名绑定JS代码,适合快速测试简单逻辑。
语法:<标签 on事件名="JS代码">
示例:点击按钮弹出提示
<!-- 行内绑定点击事件 -->
<button onclick="alert('点击成功!')">点击我</button>
<!-- 也可调用外部函数 -->
<script>
function showMsg() {
console.log("按钮被点击了");
}
</script>
<button onclick="showMsg()">点击调用函数</button>
缺点:HTML与JS代码混写,后期维护困难,不适合复杂项目。
- DOM属性绑定(中等推荐,逻辑分离)
通过JS获取DOM元素后,直接给元素的on+事件名属性赋值函数,实现HTML与JS分离。
语法:元素.on事件名 = 函数
示例:输入框内容变化时实时打印
<input type="text" id="userInput" placeholder="输入内容...">
<script>
// 1. 获取DOM元素
const input = document.getElementById("userInput");
// 2. 绑定输入事件(input事件:输入框内容变化时触发)
input.oninput = function() {
// this指向当前元素(即input),this.value获取输入值
console.log("当前输入:", this.value);
};
// 3. 解绑事件(赋值为null即可)
// input.oninput = null;
</script>
特点:一个元素同一事件只能绑定一个函数,后绑定的会覆盖前一个。
- 事件监听(推荐,灵活可扩展)
通过addEventListener方法绑定事件,支持同一事件绑定多个函数,还能自由解绑,是项目中最常用的方式。
语法:元素.addEventListener('事件名', 函数, 可选参数)
示例:按钮绑定多个点击事件
<button id="myBtn">多事件按钮</button>
<script>
const btn = document.getElementById("myBtn");
// 第一个点击事件:打印日志
function logClick() {
console.log("按钮被点击(日志)");
}
// 第二个点击事件:修改按钮文字
function changeText() {
this.textContent = "已点击"; // this指向btn元素
}
// 绑定两个点击事件
btn.addEventListener("click", logClick);
btn.addEventListener("click", changeText);
// 解绑第一个事件(需保留原函数引用,匿名函数无法解绑)
btn.removeEventListener("click", logClick);
</script>
关键优势:
• 同一事件可绑定多个函数,按绑定顺序执行;
• 支持事件捕获/冒泡(第三个参数控制,默认false为冒泡);
• 解绑灵活,避免内存泄漏。
(二)常用事件类型与实战场景
事件分类 事件名 触发时机 实战场景
鼠标事件 click 鼠标左键单击 按钮提交、卡片跳转
mouseover 鼠标移入元素 导航栏下拉菜单显示
mouseout 鼠标移出元素 导航栏下拉菜单隐藏
键盘事件 keydown 按下任意键(包括功能键) 快捷键触发(如Ctrl+S保存)
keyup 松开任意键 输入完成后验证
表单事件 submit 表单提交(点击提交按钮或按Enter) 表单数据验证
change 表单元素值改变且失去焦点 下拉框选择后触发查询
窗口事件 load 页面所有资源加载完成 初始化页面数据
resize 窗口大小改变 响应式布局调整
实战案例:表单提交验证(阻止默认行为)
表单提交时默认会刷新页面,通过event.preventDefault()可阻止默认行为,先做数据验证:
<form id="loginForm">
<input type="text" name="username" placeholder="用户名" required>
<button type="submit">登录</button>
</form>
<script>
const form = document.getElementById("loginForm");
form.addEventListener("submit", function(event) {
// 1. 阻止表单默认提交行为(避免页面刷新)
event.preventDefault();
// 2. 获取表单数据
const username = this.username.value;
// 3. 数据验证
if (username.length < 3) {
alert("用户名至少3个字符!");
return;
}
// 4. 验证通过,提交数据(实际项目中用AJAX/fetch)
alert(`登录成功,欢迎${username}!`);
});
</script>
(三)事件对象(event)的核心属性
当事件触发时,JS会自动传递一个「事件对象」(通常命名为event或e),包含事件相关的关键信息,常用属性如下:
• event.target:触发事件的具体元素(如点击列表项时,target是当前列表项);
• event.currentTarget:绑定事件的元素(如列表绑定事件,currentTarget是列表本身);
• event.preventDefault():阻止事件的默认行为(如表单提交、链接跳转);
• event.stopPropagation():阻止事件冒泡(避免父元素触发相同事件)。
示例:事件冒泡与阻止
<div id="parent" style="width: 200px; height: 200px; background: #f0f0f0; padding: 20px;">
父元素
<div id="child" style="width: 100px; height: 100px; background: #42b983; color: white;">
子元素
</div>
</div>
<script>
const parent = document.getElementById("parent");
const child = document.getElementById("child");
// 父元素点击事件
parent.addEventListener("click", () => {
console.log("父元素被点击");
});
// 子元素点击事件(默认会冒泡到父元素)
child.addEventListener("click", (e) => {
console.log("子元素被点击");
// 阻止事件冒泡,父元素不再触发
e.stopPropagation();
});
</script>
点击子元素时,若不阻止冒泡,会同时打印"子元素被点击"和"父元素被点击";阻止后只打印前者。
二、CSS常用属性:让网页"美"起来
CSS属性按功能可分为「布局属性、样式属性、交互属性」三类,下面聚焦新手高频使用的属性,结合场景说明用法,所有示例可直接复制到HTML的<style>标签中运行。
(一)布局类属性:控制元素位置与大小
- display:元素的显示模式(核心)
控制元素是块级、行内还是行内块,直接影响布局逻辑,常用值如下:
值 特点 常用元素
block 独占一行,可设置宽高 div、p、h1~h6
inline 不独占一行,不可设置宽高 span、a、strong
inline-block 不独占一行,可设置宽高(兼顾两者) button、input
flex 弹性布局(父元素设置,子元素自动适配) 导航栏、卡片列表、表单
none 隐藏元素(不占空间) 弹窗关闭、条件隐藏内容
示例:弹性布局实现导航栏(水平居中+均匀分布)
<!-- HTML -->
<nav class="nav-container">
<a href="#" class="nav-item">首页</a>
<a href="#" class="nav-item">文章</a>
<a href="#" class="nav-item">教程</a>
<a href="#" class="nav-item">关于</a>
</nav>
<!-- CSS -->
<style>
.nav-container {
/* 1. 父元素设置flex */
display: flex;
/* 2. 子元素水平均匀分布 */
justify-content: space-around;
/* 3. 子元素垂直居中 */
align-items: center;
/* 4. 导航栏高度 */
height: 60px;
background: #333;
}
.nav-item {
color: white;
text-decoration: none;
padding: 0 10px;
}
.nav-item:hover {
color: #42b983; /* 鼠标 hover 时变色 */
}
</style>
- position:元素定位方式
控制元素在页面中的精确位置,常用值如下:
值 定位基准 实战场景
static 默认值,无定位(忽略top/right等) 普通元素
relative 相对于自身原位置(不脱离文档流) 子元素绝对定位的父容器
absolute 相对于最近的定位父元素(脱离文档流) 弹窗、下拉菜单、标签
fixed 相对于浏览器窗口(固定位置,不滚动) 顶部导航栏、回到顶部按钮
示例:固定在右下角的"回到顶部"按钮
<!-- HTML -->
<button class="back-to-top">↑ 回到顶部</button>
<!-- CSS -->
<style>
.back-to-top {
/* 1. 固定定位(相对于浏览器窗口) */
position: fixed;
/* 2. 定位到右下角 */
bottom: 20px;
right: 20px;
/* 3. 样式优化 */
padding: 8px 16px;
background: #42b983;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
/* 4. 默认隐藏,滚动后显示(配合JS) */
display: none;
}
.back-to-top.show {
display: block;
}
</style>
<!-- JS:滚动时显示按钮 -->
<script>
const btn = document.querySelector(".back-to-top");
window.addEventListener("scroll", () => {
// 滚动距离超过500px时显示按钮
if (window.scrollY > 500) {
btn.classList.add("show");
} else {
btn.classList.remove("show");
}
});
// 点击按钮回到顶部
btn.addEventListener("click", () => {
window.scrollTo({ top: 0, behavior: "smooth" }); // smooth:平滑滚动
});
</script>
- width/height:元素宽高
• 单位:px(固定像素)、%(相对于父元素)、vw/vh(相对于窗口宽高,1vw=窗口宽1%);
• 特殊值:auto(默认,自动适应内容)、max-width(最大宽度,防止元素过大)。
示例:响应式图片(最大宽度不超过父容器,高度自动)
img {
width: 100%; /* 占满父容器宽度 */
max-width: 600px; /* 最大宽度600px,避免过大 */
height: auto; /* 高度自动,保持图片比例 */
border-radius: 8px; /* 圆角,优化样式 */
}
(二)样式类属性:控制元素外观
- 颜色与背景
• color:文字颜色(支持十六进制#42b983、RGBrgb(66, 185, 131)、英文green);
• background:背景(可合并background-color、background-image、background-size等);
• background-color:背景色(单独设置背景色,比background更简洁)。
示例:渐变背景按钮
.button {
padding: 10px 20px;
border: none;
border-radius: 4px;
color: white;
font-size: 16px;
/* 线性渐变背景(从左到右,蓝色→绿色) */
background: linear-gradient(to right, #2196F3, #4CAF50);
cursor: pointer;
}
- 文字与字体
• font-size:字体大小(常用14px、16px,标题可用24px);
• font-weight:字体粗细(normal=400,bold=700,也可直接写数字500);
• text-align:文字对齐(left左对齐、center居中、right右对齐);
• line-height:行高(控制文字垂直间距,line-height: 1.5表示行高为字体大小1.5倍,常用于文字垂直居中)。
示例:居中标题(文字居中+垂直居中)
.title {
font-size: 24px;
font-weight: 600;
color: #333;
text-align: center; /* 文字水平居中 */
line-height: 80px; /* 行高=容器高度,实现文字垂直居中 */
height: 80px; /* 容器高度 */
background: #f5f5f5;
}
- 边框与圆角
• border:边框(合并border-width、border-style、border-color,如border: 1px solid #eee);
• border-radius:圆角(值越大圆角越明显,50%可实现圆形);
• box-shadow:阴影(增强立体感,语法:box-shadow: 水平偏移 垂直偏移 模糊度 颜色)。
示例:带阴影的卡片
.card {
width: 300px;
padding: 20px;
margin: 20px;
background: white;
border: none;
border-radius: 8px;
/* 阴影:水平0,垂直4px,模糊10px,淡灰色 */
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05);
}
(三)交互类属性:增强用户体验
- cursor:鼠标指针样式
控制鼠标 hover 到元素上时的指针形状,常用值:
• pointer:手型(表示可点击,如按钮、链接);
• text:文本型(表示可选中文字,如段落、输入框);
• wait:加载中(表示正在处理,如表单提交时);
• default:默认箭头(普通元素)。
示例:不同元素的鼠标样式
button { cursor: pointer; } /* 按钮:手型 */
input { cursor: text; } /* 输入框:文本型 */
.loading { cursor: wait; } /* 加载中:转圈 */
- transition:过渡动画
让元素样式变化更平滑(如hover时颜色、大小变化),语法:transition: 属性 时长 过渡曲线。
示例:hover时按钮放大+变色(平滑过渡)
.button {
padding: 10px 20px;
background: #42b983;
color: white;
border: none;
border-radius: 4px;
/* 所有样式变化都有0.3秒平滑过渡 */
transition: all 0.3s ease;
}
.button:hover {
/* hover时变化:背景色变深+放大10% */
background: #359469;
transform: scale(1.1); /* 放大1.1倍 */
}
三、JS与CSS配合实战:实现"暗黑模式"切换
结合上面的知识点,用「JS事件处理+CSS样式切换」实现一个实用功能------暗黑模式切换,帮你理解二者协同逻辑:
<!-- HTML:开关按钮 + 内容区域 -->
<div class="container">
<button id="themeToggle">切换暗黑模式</button>
<h2>JS与CSS配合实战</h2>
<p>这是一段测试文本,暗黑模式下会切换背景和文字颜色。</p>
</div>
<!-- CSS:默认样式 + 暗黑模式样式 -->
<style>
/* 基础样式(默认浅色模式) */
.container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
background: white;
color: #333;
/* 样式变化平滑过渡 */
transition: background 0.3s, color 0.3s;
}
#themeToggle {
padding: 8px 16px;
background: #42b983;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
margin-bottom: 20px;
}
/* 暗黑模式样式(通过添加dark类触发) */
.container.dark {
background: #1a1a1a;
color: #eee;
}
.container.dark #themeToggle {
background: #666;
}
</style>
<!-- JS:点击按钮切换类(控制暗黑模式) -->
<script>
const toggleBtn = document.getElementById("themeToggle");
const container = document.querySelector(".container");
// 点击按钮切换dark类
toggleBtn.addEventListener("click", () => {
// toggleClass:有则移除,无则添加
container.classList.toggle("dark");
// 同步修改按钮文字
if (container.classList.contains("dark")) {
toggleBtn.textContent = "切换浅色模式";
} else {
toggleBtn.textContent = "切换暗黑模式";
}
});
</script>
核心逻辑:
-
CSS中定义dark类的暗黑模式样式;
-
JS监听按钮点击事件,通过classList.toggle("dark")给容器添加/移除dark类;
-
利用CSS的transition属性,让背景和文字颜色变化更平滑。
四、总结:新手学习建议
-
JS事件处理:优先掌握addEventListener(灵活),理解事件对象的target和preventDefault,多练表单验证、按钮交互等场景;
-
CSS属性:先记display(布局核心)、position(定位)、color/background(样式),再学flex(弹性布局)和transition(动画);
-
实战结合:学一个知识点就写一个小案例(如计数器、导航栏、暗黑模式),用JS控制CSS类切换是前端交互的核心思路。