JS基础事件处理与CSS常用属性全解析(附实战示例)

在前端开发中,JS负责交互逻辑,CSS负责样式呈现,二者配合是实现网页功能的基础。本文聚焦新手必学的JS事件处理方法和CSS常用属性,用「概念+语法+案例」的形式拆解核心知识点,所有代码可直接复制运行,帮你快速打通前端基础关。

一、JS基础事件处理:让网页"动"起来

JS事件处理的核心是「监听用户行为(如点击、输入),并执行对应逻辑」。常见的事件类型包括鼠标事件、键盘事件、表单事件等,处理方式主要有行内绑定、DOM属性绑定、事件监听三种,下面逐一拆解。

(一)3种核心事件绑定方式

  1. 行内绑定(简单但不推荐,耦合性高)

直接在HTML标签内通过on+事件名绑定JS代码,适合快速测试简单逻辑。

语法:<标签 on事件名="JS代码">

示例:点击按钮弹出提示

<!-- 行内绑定点击事件 -->

<button onclick="alert('点击成功!')">点击我</button>

<!-- 也可调用外部函数 -->

<script>

function showMsg() {

console.log("按钮被点击了");

}

</script>

<button onclick="showMsg()">点击调用函数</button>

缺点:HTML与JS代码混写,后期维护困难,不适合复杂项目。

  1. 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>

特点:一个元素同一事件只能绑定一个函数,后绑定的会覆盖前一个。

  1. 事件监听(推荐,灵活可扩展)

通过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>标签中运行。

(一)布局类属性:控制元素位置与大小

  1. 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>

  1. 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>

  1. width/height:元素宽高

• 单位:px(固定像素)、%(相对于父元素)、vw/vh(相对于窗口宽高,1vw=窗口宽1%);

• 特殊值:auto(默认,自动适应内容)、max-width(最大宽度,防止元素过大)。

示例:响应式图片(最大宽度不超过父容器,高度自动)

img {

width: 100%; /* 占满父容器宽度 */

max-width: 600px; /* 最大宽度600px,避免过大 */

height: auto; /* 高度自动,保持图片比例 */

border-radius: 8px; /* 圆角,优化样式 */

}

(二)样式类属性:控制元素外观

  1. 颜色与背景

• 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;

}

  1. 文字与字体

• 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;

}

  1. 边框与圆角

• 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);

}

(三)交互类属性:增强用户体验

  1. cursor:鼠标指针样式

控制鼠标 hover 到元素上时的指针形状,常用值:

• pointer:手型(表示可点击,如按钮、链接);

• text:文本型(表示可选中文字,如段落、输入框);

• wait:加载中(表示正在处理,如表单提交时);

• default:默认箭头(普通元素)。

示例:不同元素的鼠标样式

button { cursor: pointer; } /* 按钮:手型 */

input { cursor: text; } /* 输入框:文本型 */

.loading { cursor: wait; } /* 加载中:转圈 */

  1. 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>

核心逻辑:

  1. CSS中定义dark类的暗黑模式样式;

  2. JS监听按钮点击事件,通过classList.toggle("dark")给容器添加/移除dark类;

  3. 利用CSS的transition属性,让背景和文字颜色变化更平滑。

四、总结:新手学习建议

  1. JS事件处理:优先掌握addEventListener(灵活),理解事件对象的target和preventDefault,多练表单验证、按钮交互等场景;

  2. CSS属性:先记display(布局核心)、position(定位)、color/background(样式),再学flex(弹性布局)和transition(动画);

  3. 实战结合:学一个知识点就写一个小案例(如计数器、导航栏、暗黑模式),用JS控制CSS类切换是前端交互的核心思路。

相关推荐
W.Y.B.G3 小时前
JavaScript 计算闰年方法
开发语言·前端·javascript
小六路3 小时前
可以横跨时间轴,分类显示的事件
前端·javascript·vue.js
比老马还六3 小时前
Blockly文件积木开发
前端
Nayana3 小时前
Element-Plus源码分析--form组件
前端
Bellafu6663 小时前
selenium对每种前端控件的操作,python举例
前端·python·selenium
littleboyck4 小时前
VSCode 全自动调试Vue/React项目
前端·visual studio code
洛小豆5 小时前
她问我::is-logged 是啥?我说:前面加冒号,就是 Vue 在发暗号
前端·vue.js·面试
我有一棵树5 小时前
前端开发中 SCSS 变量与 CSS 变量的区别与实践选择,—— 两种变量别混为一谈
前端·css·scss
white-persist5 小时前
JWT 漏洞全解析:从原理到实战
前端·网络·python·安全·web安全·网络安全·系统安全