---
archived: false
created_at: 1782183901
id: 2c81b507-6ade-45ec-be0b-19fbd953a873
md_path: /app/data/users/366195c1-70b0-427f-8c10-7316f3756ce6/2c81b507-6ade-45ec-be0b-19fbd953a873.md
meta: {}
path: 2c81b507-6ade-45ec-be0b-19fbd953a873.md
pinned: false
title: 解释"把"字句和"被"字句的区别
updated_at: 1782184340
user_id: 366195c1-70b0-427f-8c10-7316f3756ce6
---

```json
{"title":"解释\"把\"字句和\"被\"字句的区别","models":["deepseek-v4-pro"],"history":{"messages":{"d8e3d103-0009-444a-aca4-f52f763a551e":{"id":"d8e3d103-0009-444a-aca4-f52f763a551e","parentId":null,"childrenIds":["9e4a0b1e-4bac-40c4-ac9a-4319b14245ff"],"role":"user","content":"解释\"把\"字句和\"被\"字句的区别","timestamp":1782184256,"models":["deepseek-v4-pro"]},"9e4a0b1e-4bac-40c4-ac9a-4319b14245ff":{"parentId":"d8e3d103-0009-444a-aca4-f52f763a551e","id":"9e4a0b1e-4bac-40c4-ac9a-4319b14245ff","childrenIds":[],"role":"assistant","content":"<details type=\"reasoning\" done=\"true\" duration=\"4\">\n<summary>Thought for 4 seconds</summary>\n> 我们需要解释“把”字句和“被”字句的区别。用户可能希望得到中文语法方面的解释。需要清晰、有条理地说明两者的定义、结构、语义、使用条件和区别，可能还需要举例对比。\n> \n> 想到可以从以下几个方面展开：\n> 1. 定义与基本结构：把字句是“主语+把+宾语+动词+其他”，表示处置；被字句是“主语+被+宾语+动词+其他”，表示被动。\n> 2. 语义焦点不同：把字句强调施事对受事的处置及结果，主语是施事；被字句强调受事遭受的影响，主语是受事。\n> 3. 使用条件：把字句的动词需有处置义，宾语一般是定指的；被字句动词往往有完结或遭受义，施事有时可省略。\n> 4. 语用和表达效果：把字句突显主观处置；被字句突显不如意或被动。\n> 5. 举例对比：如“我把杯子打破了” vs “杯子被我打破了”。解释语义侧重。\n> 6. 扩展：把字句与被字句的转换条件，以及两者不一定都能互换。\n> \n> 确保回答通俗易懂，系统全面，重点突出区别。最后总结。用中文回答。\n</details>\n“把”字句和“被”字句是现代汉语中两种重要的特殊句式，它们的核心区别在于**叙述的角度**和**强调的重点**不同。\n\n简单来说：\n- **把字句**：站在**施事者**（动作发出者）的角度，强调**对受事者做了什么，使其发生变化**。\n- **被字句**：站在**受事者**（动作承受者）的角度，强调**受事者遭受到什么动作或影响**。\n\n---\n\n### 一、基本结构不同\n\n| 句式 | 结构公式 | 例句 |\n|------|----------|------|\n| **把字句** | 主语(施事) + **把** + 宾语(受事) + 动词 + 其他成分 | 我 **把** 杯子 打破了。 |\n| **被字句** | 主语(受事) + **被** + 宾语(施事) + 动词 + 其他成分 | 杯子 **被** 我 打破了。 |\n\n---\n\n### 二、语义焦点（强调点）不同\n\n**1. 把字句 —— 突出“处置”与“结果”**\n用于表示施事者主动、有意识地影响受事者，并使其产生某种结果或状态。叙述的起点是“人/施事”，关注“人做了什么事”。\n- **我**把窗户关上了。 → 聚焦于“我”的动作和最终“窗户关上了”的结果。\n- **妈妈**把房间收拾干净了。 → 聚焦于“妈妈”的处置，“房间变干净”是结果。\n\n**2. 被字句 —— 突出“被动”与“遭受”**\n用于表示受事者承受了某个动作，且常带有“不如意、遭受”的语义色彩（尤其在不出现施事时）。叙述的起点是“物/受事”，关注“物怎么样了”。\n- 窗户**被我**关上了。 → 聚焦于“窗户”发生了什么变化。\n- 钱包**被（人）**偷了。 → 省略施事者，聚焦于“钱包”的遭遇，明显带有不如意色彩。\n\n---\n\n### 三、使用条件与限制不同\n\n**1. 对动词的要求**\n两种句式都要求动词具有**处置性**或**动作性**，不能是存现动词、心理状态动词等。\n\n- ✅ 可用的动词：打、关、吃、洗、写、扔、修……\n- ❌ 一般不用：**是、有、在、知道、喜欢、像、看见（部分语境）**……\n  - 不能说：我把他是老师知道了。 / 这被我看见了。（可能说不通或罕见）\n\n**2. 对宾语（名词性成分）的要求**\n- **把字句的宾语（受事）**通常是**定指**的，即说话双方都知道具体对象。\n  - 我把**那本书**买了。 （已知的那本）\n  - ❓ 我把一本书买了。 （不定指，通常不成立）\n- **被字句的主语（受事）**同样倾向定指。\n  - **我的自行车**被偷了。（已知的自行车）\n\n**3. 施事者的隐现**\n- **把字句**：施事者（主语）一般**必须出现**。\n  - 我把灯关了。 → 不能说：把灯关了。（口语可省略主语，但非完整把字句）\n- **被字句**：施事者（“被”后的宾语）**可以省略**，尤其是当施事不明确或不需要说明时。\n  - 灯被关上了。 / 他被开除了。\n\n---\n\n### 四、语用与表达色彩\n\n**1. 主动干预 vs. 被动遭受**\n“把字句”天然是主动的，常有“有意识处置”的意味；“被字句”天然是被动的，常用于描述不如意、意外或客观情况。\n\n- 我**把**牛奶喝了。（主动行为）\n- 牛奶**被**我喝了。（陈述事实，或强调牛奶没了）\n- 他**被**公司开除了。（不如意）\n- 衣服**被**雨淋湿了。（意外/不如意）\n\n**2. 主观意愿与客观叙述**\n- **把字句**常用来表达命令、请求、意愿等主观态度。\n  - 请**把**书打开！ / 我要把这篇文章写完。\n- **被字句**更多用于客观描述事实或不幸的遭遇。\n  - 大门被风吹开了。（客观描述）\n  - 老房子被拆掉了。（不知被谁拆）\n\n---\n\n### 五、转换关系\n\n多数“把字句”和“被字句”可以互相转换，但转换后语义重心完全改变，且必须满足动词处置性等条件。\n\n| 主动句 | 把字句 | 被字句 |\n|--------|--------|--------|\n| 我打破了杯子。 | 我**把**杯子打破了。 | 杯子**被**我打破了。 |\n| 风刮倒了树。 | 风**把**树刮倒了。 | 树**被**风刮倒了。 |\n\n需要注意的是，并非所有“把字句”都能自然转换为“被字句”，例如一些表示抽象处置的句子：\n- 我**把**这本书读了三遍。 → ？这本书**被**我读了三遍。（虽然语法上可能成立，但非常别扭，因为“读”的处置结果不明显）\n\n同样，有些被动句也不宜转为把字句，尤其是当施事不出现时：\n- 他被选为班长。 → 大家把他选为班长。（施事“大家”需补充出来）\n\n---\n\n### 总结一句话区别：\n\n- **“把”字句**：**主语（人/施事）** 做了什么，让**受事**怎么样了。（主动处置视角）\n- **“被”字句**：**主语（物/受事）** 遭受到什么，结果如何。（被动承受视角）\n\n理解这两个句式，关键就是看说话人**想让谁成为叙述的起点**——是“做动作的人”还是“承受动作的人或物”。","model":"deepseek-v4-pro","modelName":"DeepseekV3.2","modelIdx":0,"timestamp":1782184256,"followUps":["能再举一些把字句和被字句转换后意思差别很大的例子吗？","哪些常见动词绝对不能用在把字句或被字句里？","为什么有些把字句很难改成被字句，比如“我把这本书读了三遍”？","把字句和被字句在口语和书面语中使用频率有差别吗？","教外国人学把字句和被字句时，用什么简单规则他们最容易理解？"]},"f17e0e02-8aa3-4493-98dc-5cbbb131bb8a":{"content":"<details type=\"reasoning\" done=\"true\" duration=\"85\">\n<summary>Thought for 85 seconds</summary>\n> 我们需要继续完善这个“把字句精讲”的交互式教学页面。用户要求是“把字句精讲视频”，我们创建了一个模拟视频播放器的页面，包含幻灯片和互动测验。从之前的代码段看，我们只写了前面的HTML和CSS、JS的一部分，但JS中幻灯片数据只定义了4个，并且最后的HTML结构被截断了。我们需要提供一个完整的、可运行的HTML页面，包含所有幻灯片内容、测验题、完整的交互逻辑（前进、后退、进度条、测验判断等）。\n> \n> 我们需要补全整个HTML文件，包括：\n> - 幻灯片数据至少包含8个幻灯片（从已有的slide indicator显示1/8），包括封面、定义、结构、对比、条件、常见偏误、互动测验、总结等。\n> - 互动测验幻灯片需要包含选项，用户点击后判断对错并给出反馈。\n> - 进度条和导航按钮正常工作。\n> - 适当的美化样式，模拟视频播放器外观。\n> - 响应式设计。\n> \n> 从用户最后的回复“把字句的用法举例 把字句用法举例”看，他可能想让我继续生成一个包含丰富用法举例的把字句教学页面，可能是一个独立的HTML页面。由于我已经有之前的半成品，我将继续完成它，并提供完整的代码。\n> \n> 我将设计8个幻灯片：\n> 0. 标题页：把字句精讲\n> 1. 什么是把字句（定义）\n> 2. 基本结构公式\n> 3. 句式对比（与普通语序）\n> 4. 使用条件（确指、处置义等）\n> 5. 常见动词与补语搭配\n> 6. 互动测验（两道题）\n> 7. 总结与秘诀\n> \n> 另外，在测验幻灯片中，可以通过JS动态生成选项或直接在HTML中写，但为了方便，我将在幻灯片数据中直接包含HTML，并绑定事件。\n> \n> 我们需要在JS中管理状态：currentSlide（从0开始），总幻灯片数。点击上下页按钮时切换幻灯片，更新active类，更新进度条和指示器。测验幻灯片中，选项被点击后显示正确/错误样式，并可能锁定选择（不能重复点击），提供反馈文字。同时，当用户选择后，可能需要显示“回答正确”或“回答错误”，并且可能影响“下一页”按钮（或者没有限制，允许继续）。\n> \n> 我将使用事件委托来处理测验选项的点击。每个测验选项可以带有data-correct=\"true\"或\"false\"属性，在点击时检查并应用对应的CSS类。同时，我们需要在切换幻灯片时重置任何测验状态（比如移除之前的correct-choice/wrong-choice类，清除反馈信息）。\n> \n> 为了简单，我将在每个测验幻灯片中内嵌反馈区域（比如一个div.feedback-msg），默认隐藏。\n> \n> 我们还需要考虑：在测验幻灯片中，用户可能已经选择过，再次点击其他选项时是否允许更改？可以设计为允许更改，但通常教学测验允许用户尝试直到正确，或者选择后锁定。我将设计为：点击任何选项后，显示对错，但用户可以切换选择（新的选择会覆盖旧的样式和反馈）。或者更简单：点击后立即判断并锁定所有选项。我选择锁定，这样更像一个正式的测验。可以设置一个标志，一旦该幻灯片被回答过，就禁止再次点击选项。\n> \n> 另外，在用户进入测验幻灯片时，之前的选择状态应该清空。\n> \n> 为了实现这些，幻灯片渲染可以使用innerHTML，然后在当前幻灯片激活时，我们为其中的.quiz-option添加事件监听器。可以在每次换幻灯片时调用一个函数来绑定事件。\n> \n> 为了保持代码整洁，我将在JS中维护一个currentSlide变量，并编写renderSlide函数来更新屏幕内容。在renderSlide中，根据当前幻灯片数据生成HTML并注入，然后调用bindQuizEvents()来处理测验选项。\n> \n> 此外，还需要处理进度条拖拽？我们暂时只做点击进度条跳转。可以为progressBarContainer添加点击事件，根据点击位置计算百分比，从而跳转到对应的幻灯片。\n> \n> 还有键盘事件：左右箭头键可以切换幻灯片。\n> \n> 现在，开始编写完整的HTML代码。我会将之前的样式和结构整合，并补全剩余部分。\n> \n> 由于之前的代码中屏幕区域是空的div#screen，我将把幻灯片注入其中。\n> \n> 我们需要定义slides数组，每个对象包含type和html属性（对于内容幻灯片），或者title等。对于测验幻灯片，我们可以直接在html中包含选项按钮结构。\n> \n> 测验题目示例：\n> 第6张幻灯片：互动测验\n> 题目1：下列哪个句子是正确的把字句？\n> 选项：\n> A. 我把书看。\n> B. 我把书看了。\n> C. 我把书看完。\n> D. 我把书看了两遍。\n> 正确答案：B和D？实际上B和D都可能正确，但更标准的是D（动词后有补语或数量）。但为了简单，可以选B（“了”也是满足条件的其他成分）或D。我们可以设定一个正确答案，并解释。简化起见，设定D为最佳答案，或者设计一个单选题有唯一正确答案。通常教学里“我把书看了”是可以的，但“我把书看了两遍”更完整。为了避免争议，我们设计一个明显的错误句：A缺少其他成分，C也缺少。选B或D都可以，但我们可以让所有正确选项都标为正确，或者设置一个按钮为正确。我们可以使用单选逻辑，但允许多个正确选项吗？简单起见，设计为单选题，只有一个最正确的选项：D（因为带有补语“两遍”最符合把字句强调处置结果）。但B也可以，为了不误导，我将在反馈中说明。或者我们只设置一个明显正确的选项，比如“请把作业交上来。”这个更简单。\n> \n> 第二个测验题：选择把字句的正确结构。\n> 等等。\n> \n> 由于这是精讲视频，测验不宜太复杂。我将在第6张幻灯片中放入两个小测验，每个都是单选题。\n> \n> 为了支持单选题，每个选项使用button.quiz-option，并带有data-correct=\"true\"（只有一个）。点击后，遍历该幻灯片中所有选项，若data-correct为true则添加correct-choice，否则添加wrong-choice，并禁用所有选项（pointer-events: none或添加类disabled）。同时显示feedback消息。\n> \n> 在切换幻灯片时，我们需要移除所有选项的correct/wrong类，并启用它们。\n> \n> 实现时，我们为测验幻灯片指定一个特殊的类或data属性，以便识别。或者我们直接在bindQuizEvents中处理：选中所有.quiz-option，为它们添加click监听器，使用once: true或通过标志防止重复点击。但要注意，多个测验可能在同一幻灯片中，我们需要为每个按钮独立处理，但点击任一个后，该组（同一题目）的按钮应全部锁定。我们可以为每个题目容器设置一个类如.quiz-group，点击其中一个按钮后，锁定该组内的所有按钮。为简单，每个幻灯片只有一个测验题目或两个题目，每个题目独立。\n> \n> 我在幻灯片数据中这样设计测验HTML：\n> ```html\n> <div class=\"quiz-group\" id=\"quiz1\">\n>   <p>选择题1：选出正确的把字句</p>\n>   <button class=\"quiz-option\" data-correct=\"false\">A. 我把饭吃。</button>\n>   <button class=\"quiz-option\" data-correct=\"true\">B. 我把饭吃了。</button>\n>   ...\n>   <p class=\"feedback-msg\" style=\"display:none;\"></p>\n> </div>\n> ```\n> 点击按钮时，如果是第一个点击，则执行判断，并隐藏其他选项的点击能力。我们可以用一个变量记录该幻灯片是否已被回答，但在切换幻灯片时需要重置。因此可以在每个幻灯片的容器上存储状态，或者使用一个全局对象。\n> \n> 更简单：在每次renderSlide后，我们为所有.quiz-option绑定事件，事件处理函数中，通过检查该按钮的父容器.quiz-group是否已有被选中的按钮（例如有无.correct-choice或.wrong-choice）来决定是否响应。如果已有，则忽略点击。这样就不需要额外的状态管理，只需要在点击后给按钮加类，下次点击其他按钮时检查其兄弟元素是否已有这些类。但这样可能导致用户先点错再点对时，错误按钮保持红色，正确按钮变绿，但反馈信息可能变化。这种做法是允许的，可以修改答案。也可以设计为点击后立即禁用所有按钮。这里我选择点击后禁用所有按钮（添加disabled类），并显示反馈。\n> \n> 因此，我们需要在点击事件中：遍历该quiz-group中的所有.quiz-option，为它们添加一个类（例如answered），并设置pointer-events: none（或直接在CSS中.answered禁用）。我可以在JS中添加类'disabled-option'并设置样式。或者直接设置disabled属性（但button是div可能不支持，应该用button元素）。为了语义化，我们将.quiz-option改为button元素。这样就能使用disabled属性。所以修改结构：button.quiz-option。\n> \n> 好，现在开始编写完整代码。\n> \n> 首先，确定幻灯片总数：8个。第0个是标题，1定义，2结构，3对比，4使用条件，5常见偏误或更多例子，6互动测验，7总结。\n> \n> 接下来，编写每个幻灯片的HTML内容。\n> \n> Slide 0:\n> ```html\n> <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%;\">\n>   <h1 style=\"font-size: 3.5rem; color: #f0c060; text-shadow: 0 0 20px rgba(240,192,96,0.5);\">把字句</h1>\n>   <p style=\"font-size: 1.8rem; color: white; margin: 10px 0;\">Bǎ Zì Jù</p>\n>   <p style=\"color: #b0b8cc; margin-top: 20px;\">汉语特殊句式精讲</p>\n>   <p style=\"color: #e94560; margin-top: 30px; font-weight: 600;\">用“把”字，让表达更地道</p>\n> </div>\n> ```\n> \n> Slide 1:\n> ```html\n> <h2>一、什么是把字句？</h2>\n> <p>把字句是用介词“<span class=\"ba-word\">把</span>”将宾语提前到动词之前，强调对宾语进行<strong>处置</strong>并产生<strong>结果</strong>的句子。</p>\n> <div class=\"example-box\">\n>   <span class=\"highlight\">他</span> <span class=\"ba-word\">把</span> <span class=\"highlight\">门</span> 关上了。<br>\n>   ≈ 他关上门了。（但更强调对“门”的处置）\n> </div>\n> <p style=\"margin-top: 10px; font-size:0.9rem;\">👉 宾语通常是说话双方已知的、确指的事物。</p>\n> ```\n> \n> Slide 2:\n> ```html\n> <h2>二、基本结构公式</h2>\n> <div class=\"structure\">\n>   <span class=\"struct-part sub\">主语</span>\n>   <span class=\"plus\">+</span>\n>   <span class=\"struct-part ba\">把</span>\n>   <span class=\"plus\">+</span>\n>   <span class=\"struct-part obj\">宾语</span>\n>   <span class=\"plus\">+</span>\n>   <span class=\"struct-part verb\">动词</span>\n>   <span class=\"plus\">+</span>\n>   <span class=\"struct-part comp\">其他成分</span>\n> </div>\n> <p style=\"margin-top: 15px;\">⚠️ 动词后必须有<strong>补语、了、着、重叠式</strong>等，不能是光杆动词。</p>\n> <div class=\"example-box\">\n>   ✅ 我把窗户 <span class=\"highlight\">擦干净了</span>。<br>\n>   ❌ 我把窗户擦。 <span style=\"color:#f87171;\">（缺少结果补语）</span>\n> </div>\n> ```\n> \n> Slide 3:\n> ```html\n> <h2>三、句式对比</h2>\n> <div class=\"compare\">\n>   <div class=\"card wrong\">\n>     <div class=\"label\">❌ 非把字句（不自然/不合语法）</div>\n>     <div class=\"sent\">我放书在桌子上。</div>\n>   </div>\n>   <div class=\"card correct\">\n>     <div class=\"label\">✅ 把字句（自然通顺）</div>\n>     <div class=\"sent\">我把书放在桌子上。</div>\n>   </div>\n> </div>\n> <p style=\"margin-top: 15px;\">把字句更适合表达<strong>位移、变化、消除</strong>等意义。</p>\n> <div class=\"example-box\">\n>   妈妈 <span class=\"ba-word\">把</span> 衣服 <span class=\"highlight\">洗干净了</span>。<br>\n>   请 <span class=\"ba-word\">把</span> 垃圾 <span class=\"highlight\">扔出去</span>。\n> </div>\n> ```\n> \n> Slide 4:\n> ```html\n> <h2>四、使用把字句的条件</h2>\n> <ul style=\"text-align:left; max-width:600px; margin: 0 auto; line-height: 2.2; font-size: 1.05rem;\">\n>   <li>🔹 宾语必须是<strong>确指</strong>的（说话双方都清楚）。</li>\n>   <li>🔹 动词要有<strong>处置性</strong>（如：放、拿、送、打、开）。</li>\n>   <li>🔹 动词后必须有<strong>补语、了、重叠</strong>等成分。</li>\n>   <li>🔹 否定词（不/没）或能愿动词要放在“把”字之前。</li>\n> </ul>\n> <div class=\"example-box\" style=\"margin-top: 15px;\">\n>   ❌ 我没把作业做完。<span style=\"color:#f87171;\">（否定词位置错）</span><br>\n>   ✅ 我<strong>没</strong>把作业做完。<br>\n>   ✅ 你应该<strong>把</strong>这件事做好。\n> </div>\n> ```\n> \n> Slide 5:\n> ```html\n> <h2>五、常见动词与补语搭配</h2>\n> <div style=\"display: flex; gap: 20px; justify-content: center; flex-wrap: wrap; margin: 20px 0;\">\n>   <div style=\"background:#1e2432; border-radius:12px; padding:15px;\">\n>     <span style=\"color:#f0c060;\">动词+结果补语</span><br>\n>     把门关<span class=\"highlight\">上</span> / 把水喝<span class=\"highlight\">完</span>\n>   </div>\n>   <div style=\"background:#1e2432; border-radius:12px; padding:15px;\">\n>     <span style=\"color:#f0c060;\">动词+趋向补语</span><br>\n>     把椅子搬<span class=\"highlight\">进来</span> / 把信寄<span class=\"highlight\">出去</span>\n>   </div>\n>   <div style=\"background:#1e2432; border-radius:12px; padding:15px;\">\n>     <span style=\"color:#f0c060;\">动词+了/着</span><br>\n>     把衣服洗<span class=\"highlight\">了</span> / 把门开<span class=\"highlight\">着</span>\n>   </div>\n> </div>\n> <p style=\"margin-top:10px;\">重叠形式也可以：把房间<strong>收拾收拾</strong>。</p>\n> ```\n> \n> Slide 6: 互动测验\n> ```html\n> <h2>六、小测验 📝</h2>\n> <div class=\"quiz-group\" id=\"quizGroup1\" style=\"margin-bottom: 30px;\">\n>   <p style=\"font-weight:600; margin-bottom: 10px;\">题目1：下面哪一句是正确的把字句？</p>\n>   <button class=\"quiz-option\" data-correct=\"false\">A. 我把作业做。</button>\n>   <button class=\"quiz-option\" data-correct=\"false\">B. 我把作业做完。</button>\n>   <button class=\"quiz-option\" data-correct=\"true\">C. 我把作业做完了。</button>\n>   <button class=\"quiz-option\" data-correct=\"false\">D. 我把作业不做。</button>\n>   <p class=\"feedback-msg\" style=\"display:none; margin-top:15px; padding:10px; background:#232b3c; border-radius:8px;\"></p>\n> </div>\n> <div class=\"quiz-group\" id=\"quizGroup2\">\n>   <p style=\"font-weight:600; margin-bottom: 10px;\">题目2：“把”字句中，否定词应该放在哪里？</p>\n>   <button class=\"quiz-option\" data-correct=\"false\">A. 动词前</button>\n>   <button class=\"quiz-option\" data-correct=\"true\">B. “把”字前</button>\n>   <button class=\"quiz-option\" data-correct=\"false\">C. 宾语前</button>\n>   <button class=\"quiz-option\" data-correct=\"false\">D. 句子末尾</button>\n>   <p class=\"feedback-msg\" style=\"display:none; margin-top:15px; padding:10px; background:#232b3c; border-radius:8px;\"></p>\n> </div>\n> ```\n> \n> Slide 7: 总结\n> ```html\n> <h2>七、总结 · 把字句秘诀</h2>\n> <div style=\"max-width:550px; margin: 0 auto; text-align: left; font-size: 1.05rem; line-height: 2;\">\n>   <p>✨ <strong>“把”字提宾表处置，</strong></p>\n>   <p>✨ <strong>动词后面跟补语。</strong></p>\n>   <p>✨ <strong>宾语确指双方知，</strong></p>\n>   <p>✨ <strong>否定能愿“把”前住。</strong></p>\n> </div>\n> <p style=\"margin-top: 25px; color: #f0c060; font-weight: 600;\">💡 多练习用“把”字句描述日常动作，语感自来！</p>\n> <p style=\"margin-top: 10px; color:#b0b8cc;\">完 · 感谢观看</p>\n> ```\n> \n> 现在编写JS部分。\n> \n> 我们需要：\n> - currentSlide = 0\n> - totalSlides = 8\n> - 渲染函数 renderSlide()\n> - 绑定测验事件 bindQuiz()\n> - 更新UI updateUI()\n> - 点击进度条跳转\n> - 键盘左右键\n> \n> 实现细节：\n> \n> renderSlide(): 获取slidesData[currentSlide]，清空屏幕，创建slide div，添加类active，innerHTML为html内容，追加到屏幕。如果slide是测验类型，调用bindQuiz()。\n> 注意：幻灯片切换时，需要移除之前的所有slide，保证只有一个active。\n> \n> bindQuiz(): 查询当前屏幕中所有.quiz-group，为每个group中的.quiz-option添加点击事件。注意避免重复绑定（可以使用事件委托，或者每次renderSlide时重新绑定。因为innerHTML替换后，旧的事件绑定会消失，所以每次渲染后重新绑定是安全的）。我们为屏幕元素添加事件委托（在screen上监听click事件，匹配.quiz-option）。这样更简单，无需每次重新绑定。我们可以在页面加载时就在screen上添加委托事件，然后内部根据当前激活的幻灯片和选项组来处理。\n> \n> 具体：在screen上监听click，如果target是.quiz-option，则找到其所在的.quiz-group，检查该group是否已有被禁用的按钮（通过查询group中是否有.quiz-option[disabled]或.hasAttribute('data-answered')）。我们可以在group上设置一个data-answered=\"true\"属性，第一次点击时设置，之后点击忽略。点击时，判断按钮的data-correct，添加相应类，禁用所有同组按钮（设置disabled或pointer-events），显示反馈信息。\n> \n> 我们也可以直接在按钮上添加disabled属性（如果是button元素），然后在CSS中为button:disabled设置样式。这样最简单。\n> \n> 因此，.quiz-option最好是<button>元素。在HTML中已经使用<button>。\n> \n> 事件委托处理：\n> ```js\n> screen.addEventListener('click', (e) => {\n>   const option = e.target.closest('.quiz-option');\n>   if (!option) return;\n>   const group = option.closest('.quiz-group');\n>   if (!group || group.dataset.answered === 'true') return; // 已作答\n>   group.dataset.answered = 'true';\n>   \n>   const isCorrect = option.dataset.correct === 'true';\n>   // 遍历组内所有按钮\n>   const allOptions = group.querySelectorAll('.quiz-option');\n>   allOptions.forEach(btn => {\n>     btn.disabled = true;\n>     if (btn.dataset.correct === 'true') {\n>       btn.classList.add('correct-choice');\n>     } else if (btn === option && !isCorrect) {\n>       btn.classList.add('wrong-choice');\n>     }\n>   });\n>   // 显示反馈\n>   const feedback = group.querySelector('.feedback-msg');\n>   if (feedback) {\n>     feedback.style.display = 'block';\n>     feedback.textContent = isCorrect ? '✅ 回答正确！非常好！' : '❌ 回答错误，再仔细想想吧。正确答案已标出。';\n>     feedback.style.color = isCorrect ? '#4ade80' : '#f87171';\n>   }\n> });\n> ```\n> \n> 但要注意：如果同一个幻灯片中有多个quiz-group，每个group独立作答。所以group.dataset.answered控制各自。\n> \n> 当用户切换到其他幻灯片再回来时，如果希望重置测验状态，我们需要在renderSlide时清除所有的data-answered，移除所有按钮的disabled、correct-choice、wrong-choice类，并隐藏feedback。然而，因为每次renderSlide都会重新生成HTML，原来的状态自然消失。所以不会保留状态。这就满足需求：每次进入幻灯片，测验都是全新的。\n> \n> 然而，如果用户在同一组内点击了错误答案，我们禁用了所有按钮，显示正确答案。这正是我们需要的。\n> \n> 关于进度条和点击跳转：给progressBarContainer添加click事件，计算点击位置相对于宽度的比例，乘以totalSlides得到目标slide索引，然后调用goToSlide。\n> \n> 键盘事件：在document上监听keydown，左箭头prev，右箭头next。\n> \n> goToSlide函数：currentSlide = index; renderSlide(); updateUI();\n> \n> 还需要处理prev/next按钮的disabled状态：当currentSlide为0时prev禁用，为totalSlides-1时next禁用。另外，在updateUI中更新进度条宽度百分比 (currentSlide+1)/totalSlides * 100，指示器文字。\n> \n> 所有功能集成。\n> \n> 现在，将全部代码整理为一个完整的HTML文件。注意引用Google字体？使用系统默认字体即可。\n> \n> 此外，需要处理响应式，已经有一些媒体查询。\n> \n> 让我们完善CSS：添加button样式，添加disabled样式，添加反馈样式。\n> \n> 对于测验选项按钮，基础样式已在.quiz-option中定义，需要补充disabled状态：\n> ```css\n> .quiz-option:disabled {\n>   opacity: 0.7;\n>   cursor: not-allowed;\n>   pointer-events: none;\n> }\n> .quiz-option.correct-choice {\n>   background: #065f46;\n>   border-color: #34d399;\n>   color: white;\n> }\n> .quiz-option.wrong-choice {\n>   background: #7f1d1d;\n>   border-color: #f87171;\n>   color: white;\n> }\n> ```\n> \n> 还要注意，当按钮被disabled后，我们仍然可以添加correct-choice类来显示正确选项。但是disabled可能覆盖样式，需确保.correct-choice的优先级高。可以使用!important或提高特异性。我们可以在CSS中写 `.quiz-option.correct-choice:disabled` 等。\n> \n> 还有，反馈消息的样式。\n> \n> 现在编写完整代码。注意screen的min-height: 420px可能导致小屏幕上内容溢出，可以使用overflow-y:auto。但为保持视频画面感，可以限制高度并使用滚动。我们在.screen上设置overflow-y: auto; 以便内容过多时可以滚动，但最好通过调整字体大小适应。由于是幻灯片，内容不应太多。我们保持.screen的padding和flex居中。\n> \n> 为了保证测验内容显示良好，可以适当调整。\n> \n> 现在开始编写最终代码。\n> \n> 注意：在slide数据中，HTML字符串可能包含换行和缩进，使用模板字符串``很方便。我将slidesData定义为一个数组，每个元素有type和html。\n> \n> 因为测验幻灯片需要包含两组quiz，我们在html中已经写好了结构。\n> \n> 还需要注意：在某些幻灯片中，“把”字的动画效果需要CSS动画。我们已经定义了.ba-word样式带动画。\n> \n> 所有内容就绪。\n> \n> 另外，为了更贴近视频播放器，可以在屏幕下方添加一个播放按钮？不需要，因为这是幻灯片。我们已经有了导航按钮和进度条，足够。\n> \n> 最后，确保手机端显示友好，字体大小调整。\n> \n> 测试逻辑：用户可能点击进度条上的某个位置，我们计算比例。但进度条可能处于任意位置，我们需要处理。在progressBarContainer上添加监听：\n> ```js\n> progressBarContainer.addEventListener('click', (e) => {\n>   const rect = progressBarContainer.getBoundingClientRect();\n>   const x = e.clientX - rect.left;\n>   const ratio = x / rect.width;\n>   const index = Math.floor(ratio * totalSlides);\n>   goToSlide(Math.min(index, totalSlides - 1));\n> });\n> ```\n> 这样就能跳转。\n> \n> 但要注意，当用户点击进度条时，如果点击位置正好在填充部分，我们希望跳转到对应幻灯片。上面的计算直接使用容器宽度，所以填充部分的宽度也会反映进度，但我们是根据点击位置计算比例，与填充条无关。这是合理的。\n> \n> 现在整合所有代码。我将之前的样式和结构加以整理，确保一致性。\n> \n> 开始输出最终HTML代码。\n</details>\n这是为您生成的一份可直接运行的“把字句精讲”互动教学网页，它模拟了视频播放器的外观，通过幻灯片形式系统讲解把字句的语法规则，并包含随堂测验。\n```html\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\n    <title>把字句精讲 · 汉语语法教学视频</title>\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            background: #0b0e17;\n            font-family: 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', 'Helvetica Neue', sans-serif;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            min-height: 100vh;\n            padding: 20px;\n            background-image:\n                radial-gradient(circle at 30% 20%, rgba(233, 68, 96, 0.08) 0%, transparent 50%),\n                radial-gradient(circle at 80% 70%, rgba(240, 180, 80, 0.06) 0%, transparent 60%);\n        }\n\n        /* 主播放器容器 */\n        .video-player {\n            max-width: 950px;\n            width: 100%;\n            background: #121826;\n            border-radius: 28px;\n            overflow: hidden;\n            box-shadow: 0 30px 60px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.08);\n            display: flex;\n            flex-direction: column;\n            transition: all 0.2s ease;\n        }\n\n        /* 头部 */\n        .header {\n            background: #1a1f2e;\n            padding: 18px 26px;\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            border-bottom: 1px solid #2b3040;\n            flex-wrap: wrap;\n            gap: 15px;\n        }\n        .title-section {\n            display: flex;\n            align-items: center;\n            gap: 14px;\n        }\n        .icon {\n            width: 44px;\n            height: 44px;\n            background: linear-gradient(145deg, #e94560, #c23152);\n            border-radius: 12px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 24px;\n            font-weight: 800;\n            color: white;\n            box-shadow: 0 8px 18px rgba(233, 68, 96, 0.3);\n        }\n        .title-text h2 {\n            color: #ffffff;\n            font-size: 1.4rem;\n            font-weight: 700;\n            letter-spacing: 0.5px;\n            line-height: 1.2;\n        }\n        .title-text span {\n            font-size: 0.8rem;\n            color: #a3adc2;\n            font-weight: 400;\n        }\n        .badge {\n            background: #252d3f;\n            color: #f0c060;\n            padding: 8px 18px;\n            border-radius: 30px;\n            font-size: 0.85rem;\n            font-weight: 600;\n            letter-spacing: 0.3px;\n            white-space: nowrap;\n        }\n\n        /* 视频画面 */\n        .screen {\n            position: relative;\n            width: 100%;\n            aspect-ratio: 16 / 9;\n            background: #0a0d14;\n            overflow-y: auto;\n            min-height: 420px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            transition: background 0.3s;\n        }\n        .slide {\n            position: absolute;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            transition: opacity 0.45s ease, transform 0.45s ease;\n            opacity: 0;\n            transform: scale(0.98);\n            pointer-events: none;\n            padding: 25px;\n            overflow-y: auto;\n        }\n        .slide.active {\n            opacity: 1;\n            transform: scale(1);\n            pointer-events: auto;\n            z-index: 2;\n        }\n        .slide-content {\n            max-width: 780px;\n            width: 100%;\n            text-align: center;\n            color: #e8e8f0;\n            padding: 10px;\n        }\n\n        /* 把字动画高亮 */\n        .ba-word {\n            display: inline-block;\n            font-weight: 900;\n            color: #ff8a8a;\n            background: rgba(233, 68, 96, 0.15);\n            border: 2px solid #e94560;\n            border-radius: 10px;\n            padding: 2px 14px;\n            margin: 0 4px;\n            font-size: 1.2em;\n            letter-spacing: 2px;\n            animation: softPulse 2.2s infinite;\n        }\n        @keyframes softPulse {\n            0% {\n                box-shadow: 0 0 0px rgba(233, 68, 96, 0.4);\n            }\n            50% {\n                box-shadow: 0 0 18px rgba(233, 68, 96, 0.8);\n            }\n            100% {\n                box-shadow: 0 0 0px rgba(233, 68, 96, 0.4);\n            }\n        }\n\n        /* 结构公式 */\n        .structure {\n            background: #1e2432;\n            border-radius: 20px;\n            padding: 18px 22px;\n            display: inline-flex;\n            flex-wrap: wrap;\n            align-items: center;\n            justify-content: center;\n            gap: 5px;\n            margin: 16px 0;\n            border: 1px solid #2e3648;\n            font-weight: 600;\n            font-size: 1rem;\n        }\n        .struct-part {\n            background: #2e3a55;\n            color: white;\n            padding: 6px 14px;\n            border-radius: 8px;\n            margin: 2px;\n        }\n        .struct-part.sub {\n            background: #2563eb;\n        }\n        .struct-part.ba {\n            background: #e94560;\n            font-weight: 900;\n            animation: softPulse 2.2s infinite;\n        }\n        .struct-part.obj {\n            background: #7c3aed;\n        }\n        .struct-part.verb {\n            background: #059669;\n        }\n        .struct-part.comp {\n            background: #d97706;\n            color: #111;\n        }\n        .plus {\n            color: #9ca3af;\n            margin: 0 2px;\n            font-weight: 700;\n        }\n\n        .example-box {\n            background: #1b2132;\n            border-radius: 14px;\n            padding: 16px 20px;\n            margin: 12px 0;\n            text-align: left;\n            border-left: 5px solid #e94560;\n            font-size: 1.1rem;\n            line-height: 1.75;\n            color: #e0e0f0;\n        }\n        .highlight {\n            color: #f0c060;\n            font-weight: 700;\n            border-bottom: 2px dotted #f0c060;\n        }\n\n        /* 对比卡片 */\n        .compare {\n            display: flex;\n            gap: 16px;\n            justify-content: center;\n            flex-wrap: wrap;\n            margin: 18px 0;\n        }\n        .card {\n            flex: 1;\n            min-width: 160px;\n            background: #1b2335;\n            border-radius: 14px;\n            padding: 16px;\n            border: 1px solid #2e3850;\n            text-align: center;\n            transition: 0.2s;\n        }\n        .card.wrong {\n            border-color: rgba(248, 113, 113, 0.5);\n            background: rgba(248, 113, 113, 0.05);\n        }\n        .card.correct {\n            border-color: rgba(74, 222, 128, 0.5);\n            background: rgba(74, 222, 128, 0.05);\n        }\n        .card .label {\n            font-size: 0.7rem;\n            letter-spacing: 2px;\n            color: #9ca3af;\n            margin-bottom: 8px;\n            text-transform: uppercase;\n        }\n        .card .sent {\n            font-weight: 600;\n            color: #fff;\n            font-size: 1rem;\n        }\n        .card .icon-mark {\n            font-size: 1.3rem;\n            margin-right: 4px;\n        }\n        .card.wrong .icon-mark {\n            color: #f87171;\n        }\n        .card.correct .icon-mark {\n            color: #4ade80;\n        }\n\n        /* 测验选项 */\n        .quiz-group {\n            margin: 20px 0;\n            text-align: center;\n        }\n        .quiz-option {\n            background: #232b3c;\n            border: 2px solid #374151;\n            border-radius: 12px;\n            padding: 12px 20px;\n            margin: 8px 6px;\n            cursor: pointer;\n            transition: all 0.2s;\n            font-weight: 500;\n            color: #e0e0e0;\n            font-size: 1rem;\n            display: inline-block;\n            min-width: 160px;\n            text-align: center;\n            font-family: inherit;\n            outline: none;\n        }\n        .quiz-option:hover:not(:disabled) {\n            border-color: #e94560;\n            background: #2a3245;\n            color: white;\n            transform: translateY(-2px);\n        }\n        .quiz-option:disabled {\n            opacity: 0.7;\n            cursor: not-allowed;\n            pointer-events: none;\n            transform: none;\n        }\n        .quiz-option.correct-choice {\n            background: #065f46 !important;\n            border-color: #34d399 !important;\n            color: white !important;\n            box-shadow: 0 0 12px rgba(52, 211, 153, 0.4);\n        }\n        .quiz-option.wrong-choice {\n            background: #7f1d1d !important;\n            border-color: #f87171 !important;\n            color: white !important;\n            box-shadow: 0 0 12px rgba(248, 113, 113, 0.4);\n        }\n        .feedback-msg {\n            margin-top: 14px;\n            padding: 12px 16px;\n            background: #1e2432;\n            border-radius: 10px;\n            color: #d1d5db;\n            font-weight: 500;\n            display: inline-block;\n        }\n\n        /* 控制器 */\n        .controls {\n            background: #1a1f2e;\n            padding: 16px 24px;\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            gap: 18px;\n            border-top: 1px solid #2b3040;\n            flex-wrap: wrap;\n        }\n        .nav-buttons {\n            display: flex;\n            gap: 10px;\n        }\n        .btn {\n            background: #262e40;\n            border: none;\n            color: #e0e0f0;\n            padding: 10px 22px;\n            border-radius: 30px;\n            font-weight: 600;\n            font-size: 0.9rem;\n            cursor: pointer;\n            transition: background 0.2s, transform 0.1s;\n            display: flex;\n            align-items: center;\n            gap: 6px;\n            letter-spacing: 0.3px;\n            white-space: nowrap;\n        }\n        .btn:hover:not(:disabled) {\n            background: #364153;\n            color: white;\n        }\n        .btn:active:not(:disabled) {\n            transform: scale(0.96);\n        }\n        .btn:disabled {\n            opacity: 0.5;\n            pointer-events: none;\n            background: #1f2636;\n        }\n        .progress-area {\n            flex: 1;\n            height: 7px;\n            background: #2e3648;\n            border-radius: 4px;\n            cursor: pointer;\n            position: relative;\n            min-width: 80px;\n        }\n        .progress-fill {\n            height: 100%;\n            background: #e94560;\n            border-radius: 4px;\n            width: 0%;\n            transition: width 0.3s ease;\n            pointer-events: none;\n        }\n        .slide-indicator {\n            color: #b0b8cc;\n            font-size: 0.9rem;\n            font-weight: 500;\n            white-space: nowrap;\n        }\n\n        /* 响应式 */\n        @media (max-width: 700px) {\n            .slide-content {\n                padding: 5px;\n            }\n            .structure {\n                font-size: 0.85rem;\n                padding: 12px;\n            }\n            .quiz-option {\n                display: block;\n                width: 85%;\n                margin: 8px auto;\n                min-width: auto;\n            }\n            .compare {\n                flex-direction: column;\n            }\n            .btn {\n                padding: 8px 16px;\n                font-size: 0.8rem;\n            }\n            .header {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n        }\n        @media (max-width: 480px) {\n            .ba-word {\n                font-size: 1em;\n                padding: 2px 8px;\n            }\n            .example-box {\n                font-size: 0.95rem;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"video-player\">\n        <!-- 头部 -->\n        <div class=\"header\">\n            <div class=\"title-section\">\n                <div class=\"icon\">把</div>\n                <div class=\"title-text\">\n                    <h2>把字句精讲</h2>\n                    <span>汉语语法 · 进阶掌握</span>\n                </div>\n            </div>\n            <div class=\"badge\">📚 教学视频</div>\n        </div>\n\n        <!-- 屏幕（幻灯片区域） -->\n        <div class=\"screen\" id=\"screen\"></div>\n\n        <!-- 控制栏 -->\n        <div class=\"controls\">\n            <div class=\"nav-buttons\">\n                <button class=\"btn\" id=\"prevBtn\">◀ 上一页</button>\n                <button class=\"btn\" id=\"nextBtn\">下一页 ▶</button>\n            </div>\n            <div class=\"progress-area\" id=\"progressBarContainer\">\n                <div class=\"progress-fill\" id=\"progressFill\"></div>\n            </div>\n            <div class=\"slide-indicator\" id=\"slideIndicator\">1 / 8</div>\n        </div>\n    </div>\n\n    <script>\n        (function() {\n            // ---------- 幻灯片数据 ----------\n            const slidesData = [{ // 0 封面\n                type: 'title',\n                html: `\n                    <div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%;\">\n                        <h1 style=\"font-size: clamp(2.2rem, 6vw, 3.8rem); color: #f0c060; text-shadow: 0 0 25px rgba(240,192,96,0.5); margin-bottom: 5px;\">把字句</h1>\n                        <p style=\"font-size: clamp(1.2rem, 3vw, 1.8rem); color: white; margin: 8px 0;\">Bǎ Zì Jù</p>\n                        <p style=\"color: #b0b8cc; margin-top: 15px; font-size: 1rem;\">汉语特殊句式精讲 · 互动课程</p>\n                        <p style=\"color: #e94560; margin-top: 28px; font-weight: 600; font-size: 1.05rem;\">用“把”字，让表达更地道</p>\n                    </div>\n                `\n            }, { // 1 定义\n                type: 'content',\n                html: `\n                    <h2 style=\"font-size:1.9rem; margin-bottom:10px;\">一、什么是<span class=\"ba-word\">把</span>字句？</h2>\n                    <p style=\"font-size:1.05rem; max-width:620px; margin:0 auto; line-height:1.8;\">\n                        把字句是用介词 <strong style=\"color:#f0c060;\">“把”</strong> 将宾语提前到动词之前，<br>强调对宾语进行<strong style=\"color:#f87171;\">处置</strong>并产生<strong style=\"color:#f87171;\">结果</strong>或<strong style=\"color:#f87171;\">影响</strong>的句子。\n                    </p>\n                    <div class=\"example-box\" style=\"margin-top:20px;\">\n                        <span class=\"highlight\">他</span> <span class=\"ba-word\">把</span> <span class=\"highlight\">门</span> 关上了。<br>\n                        <small style=\"color:#9ca3af;\">（强调“门”被处置后的状态——关上了）</small>\n                    </div>\n                    <p style=\"margin-top:14px; color:#b0b8cc; font-size:0.9rem;\">👉 宾语通常是说话双方已知的、<strong>确指</strong>的事物。</p>\n                `\n            }, { // 2 结构公式\n                type: 'content',\n                html: `\n                    <h2 style=\"font-size:1.8rem; margin-bottom:14px;\">二、基本结构公式</h2>\n                    <div class=\"structure\">\n                        <span class=\"struct-part sub\">主语</span>\n                        <span class=\"plus\">+</span>\n                        <span class=\"struct-part ba\">把</span>\n                        <span class=\"plus\">+</span>\n                        <span class=\"struct-part obj\">宾语</span>\n                        <span class=\"plus\">+</span>\n                        <span class=\"struct-part verb\">动词</span>\n                        <span class=\"plus\">+</span>\n                        <span class=\"struct-part comp\">其他成分</span>\n                    </div>\n                    <p style=\"margin-top:14px; font-weight:500;\">⚠️ 动词后必须有<strong>补语、了、着、重叠式</strong>等，不能是光杆动词。</p>\n                    <div class=\"example-box\">\n                        ✅ 我把窗户 <span class=\"highlight\">擦干净了</span>。<br>\n                        ❌ 我把窗户擦。 <span style=\"color:#f87171;\">（缺少结果补语）</span>\n                    </div>\n                `\n            }, { // 3 句式对比\n                type: 'content',\n                html: `\n                    <h2 style=\"font-size:1.8rem; margin-bottom:16px;\">三、句式对比</h2>\n                    <div class=\"compare\">\n                        <div class=\"card wrong\">\n                            <div class=\"label\"><span class=\"icon-mark\">❌</span> 非把字句（不自然）</div>\n                            <div class=\"sent\">我放书在桌子上。</div>\n                        </div>\n                        <div class=\"card correct\">\n                            <div class=\"label\"><span class=\"icon-mark\">✅</span> 把字句（自然通顺）</div>\n                            <div class=\"sent\">我把书放在桌子上。</div>\n                        </div>\n                    </div>\n                    <p style=\"margin-top:12px; color:#cbd5e1;\">把字句更适合表达<strong>位移、变化、消除</strong>等意义。</p>\n                    <div class=\"example-box\">\n                        妈妈 <span class=\"ba-word\">把</span> 衣服 <span class=\"highlight\">洗干净了</span>。<br>\n                        请 <span class=\"ba-word\">把</span> 垃圾 <span class=\"highlight\">扔出去</span>。\n                    </div>\n                `\n            }, { // 4 使用条件\n                type: 'content',\n                html: `\n                    <h2 style=\"font-size:1.8rem; margin-bottom:12px;\">四、使用把字句的条件</h2>\n                    <ul style=\"text-align:left; max-width:600px; margin: 0 auto; line-height: 2.3; font-size: 1rem; padding-left: 20px;\">\n                        <li>🔹 宾语必须是<strong>确指</strong>的（双方都清楚所指）。</li>\n                        <li>🔹 动词要有<strong>处置性</strong>（如：放、拿、送、打、开）。</li>\n                        <li>🔹 动词后必须有<strong>补语、了、重叠</strong>等成分。</li>\n                        <li>🔹 否定词（不/没）或能愿动词要放在“把”字<strong>之前</strong>。</li>\n                    </ul>\n                    <div class=\"example-box\" style=\"margin-top:15px;\">\n                        ❌ 我没把作业做完。<span style=\"color:#f87171;\">（否定词位置错）</span><br>\n                        ✅ 我<strong>没</strong>把作业做完。<br>\n                        ✅ 你应该<strong>把</strong>这件事做好。\n                    </div>\n                `\n            }, { // 5 常见搭配\n                type: 'content',\n                html: `\n                    <h2 style=\"font-size:1.8rem; margin-bottom:12px;\">五、常见动词与补语搭配</h2>\n                    <div style=\"display: flex; gap: 18px; justify-content: center; flex-wrap: wrap; margin: 20px 0;\">\n                        <div style=\"background:#1e2432; border-radius:14px; padding:16px 18px; min-width:140px;\">\n                            <span style=\"color:#f0c060; font-weight:700;\">动词+结果补语</span><br>\n                            <span style=\"color:white;\">把门关<span class=\"highlight\">上</span><br>把水喝<span class=\"highlight\">完</span></span>\n                        </div>\n                        <div style=\"background:#1e2432; border-radius:14px; padding:16px 18px; min-width:140px;\">\n                            <span style=\"color:#f0c060; font-weight:700;\">动词+趋向补语</span><br>\n                            <span style=\"color:white;\">把椅子搬<span class=\"highlight\">进来</span><br>把信寄<span class=\"highlight\">出去</span></span>\n                        </div>\n                        <div style=\"background:#1e2432; border-radius:14px; padding:16px 18px; min-width:140px;\">\n                            <span style=\"color:#f0c060; font-weight:700;\">动词+了/着</span><br>\n                            <span style=\"color:white;\">把衣服洗<span class=\"highlight\">了</span><br>把门开<span class=\"highlight\">着</span></span>\n                        </div>\n                    </div>\n                    <p style=\"color:#b0b8cc;\">重叠形式也可以：把房间<strong style=\"color:#fff;\">收拾收拾</strong>。</p>\n                `\n            }, { // 6 互动测验\n                type: 'quiz',\n                html: `\n                    <h2 style=\"font-size:1.8rem; margin-bottom:5px;\">六、小测验 📝</h2>\n                    <p style=\"color:#9ca3af; margin-bottom:16px;\">点击你认为正确的选项</p>\n                    \n                    <div class=\"quiz-group\" style=\"margin-bottom: 28px;\">\n                        <p style=\"font-weight:600; margin-bottom: 12px; font-size:1.05rem;\">题目1：下面哪一句是<strong>正确</strong>的把字句？</p>\n                        <button class=\"quiz-option\" data-correct=\"false\">A. 我把作业做。</button>\n                        <button class=\"quiz-option\" data-correct=\"false\">B. 我把作业做完。</button>\n                        <button class=\"quiz-option\" data-correct=\"true\">C. 我把作业做完了。</button>\n                        <button class=\"quiz-option\" data-correct=\"false\">D. 我把作业不做。</button>\n                        <p class=\"feedback-msg\" style=\"display:none;\"></p>\n                    </div>\n                    \n                    <div class=\"quiz-group\">\n                        <p style=\"font-weight:600; margin-bottom: 12px; font-size:1.05rem;\">题目2：在把字句中，否定词“不/没”应该放在哪里？</p>\n                        <button class=\"quiz-option\" data-correct=\"false\">A. 动词前</button>\n                        <button class=\"quiz-option\" data-correct=\"true\">B. “把”字前</button>\n                        <button class=\"quiz-option\" data-correct=\"false\">C. 宾语前</button>\n                        <button class=\"quiz-option\" data-correct=\"false\">D. 句子末尾</button>\n                        <p class=\"feedback-msg\" style=\"display:none;\"></p>\n                    </div>\n                `\n            }, { // 7 总结\n                type: 'content',\n                html: `\n                    <h2 style=\"font-size:1.9rem; margin-bottom:10px;\">七、总结 · 把字句秘诀</h2>\n                    <div style=\"max-width:550px; margin: 0 auto; text-align: left; font-size: 1.1rem; line-height: 2.4; background:#1b2132; border-radius:18px; padding:22px 28px;\">\n                        <p>✨ <strong>“把”字提宾表处置，</strong></p>\n                        <p>✨ <strong>动词后面跟补语。</strong></p>\n                        <p>✨ <strong>宾语确指双方知，</strong></p>\n                        <p>✨ <strong>否定能愿“把”前住。</strong></p>\n                    </div>\n                    <p style=\"margin-top: 24px; color: #f0c060; font-weight: 600; font-size:1.1rem;\">💡 多练习用“把”字句描述日常动作，语感自来！</p>\n                    <p style=\"margin-top: 12px; color:#b0b8cc; font-size:0.95rem;\">—— 感谢观看 ——</p>\n                `\n            }];\n\n            const totalSlides = slidesData.length;\n            let currentSlide = 0;\n\n            // DOM 元素\n            const screen = document.getElementById('screen');\n            const prevBtn = document.getElementById('prevBtn');\n            const nextBtn = document.getElementById('nextBtn');\n            const progressBarContainer = document.getElementById('progressBarContainer');\n            const progressFill = document.getElementById('progressFill');\n            const slideIndicator = document.getElementById('slideIndicator');\n\n            // ---------- 渲染幻灯片 ----------\n            function renderSlide() {\n                // 清空屏幕\n                screen.innerHTML = '';\n                const data = slidesData[currentSlide];\n                const slideDiv = document.createElement('div');\n                slideDiv.className = 'slide active';\n                slideDiv.innerHTML = `<div class=\"slide-content\">${data.html}</div>`;\n                screen.appendChild(slideDiv);\n\n                // 如果当前幻灯片包含测验，无需额外操作（事件委托已处理）\n                // 但需要重置所有测验组状态（因为重新渲染了HTML）\n                // 事件委托在下面绑定\n            }\n\n            // ---------- 更新 UI 控件 ----------\n            function updateUI() {\n                // 按钮状态\n                prevBtn.disabled = (currentSlide === 0);\n                nextBtn.disabled = (currentSlide === totalSlides - 1);\n                // 进度条\n                const percent = ((currentSlide + 1) / totalSlides) * 100;\n                progressFill.style.width = percent + '%';\n                // 指示器\n                slideIndicator.textContent = `${currentSlide + 1} / ${totalSlides}`;\n            }\n\n            // ---------- 跳转幻灯片 ----------\n            function goToSlide(index) {\n                if (index < 0 || index >= totalSlides || index === currentSlide) return;\n                currentSlide = index;\n                renderSlide();\n                updateUI();\n            }\n\n            // ---------- 事件：测验选项（事件委托） ----------\n            screen.addEventListener('click', (e) => {\n                const option = e.target.closest('.quiz-option');\n                if (!option) return;\n                const group = option.closest('.quiz-group');\n                if (!group) return;\n                // 如果该组已经作答，忽略再次点击\n                if (group.dataset.answered === 'true') return;\n\n                // 标记为已作答\n                group.dataset.answered = 'true';\n                const isCorrect = option.dataset.correct === 'true';\n                const allOptions = group.querySelectorAll('.quiz-option');\n\n                // 禁用所有选项并高亮正确答案\n                allOptions.forEach(btn => {\n                    btn.disabled = true;\n                    if (btn.dataset.correct === 'true') {\n                        btn.classList.add('correct-choice');\n                    } else if (btn === option && !isCorrect) {\n                        btn.classList.add('wrong-choice');\n                    }\n                });\n\n                // 显示反馈信息\n                const feedback = group.querySelector('.feedback-msg');\n                if (feedback) {\n                    feedback.style.display = 'block';\n                    if (isCorrect) {\n                        feedback.textContent = '✅ 回答正确！非常好！';\n                        feedback.style.color = '#4ade80';\n                    } else {\n                        feedback.textContent = '❌ 回答错误。正确答案已用绿色标出。';\n                        feedback.style.color = '#f87171';\n                    }\n                }\n            });\n\n            // ---------- 导航按钮 ----------\n            prevBtn.addEventListener('click', () => {\n                if (currentSlide > 0) goToSlide(currentSlide - 1);\n            });\n            nextBtn.addEventListener('click', () => {\n                if (currentSlide < totalSlides - 1) goToSlide(currentSlide + 1);\n            });\n\n            // ---------- 进度条点击跳转 ----------\n            progressBarContainer.addEventListener('click', (e) => {\n                const rect = progressBarContainer.getBoundingClientRect();\n                const x = e.clientX - rect.left;\n                const ratio = x / rect.width;\n                const targetIndex = Math.floor(ratio * totalSlides);\n                goToSlide(Math.min(targetIndex, totalSlides - 1));\n            });\n\n            // ---------- 键盘左右键 ----------\n            document.addEventListener('keydown', (e) => {\n                if (e.key === 'ArrowLeft') {\n                    e.preventDefault();\n                    if (currentSlide > 0) goToSlide(currentSlide - 1);\n                } else if (e.key === 'ArrowRight') {\n                    e.preventDefault();\n                    if (currentSlide < totalSlides - 1) goToSlide(currentSlide + 1);\n                }\n            });\n\n            // ---------- 初始化 ----------\n            renderSlide();\n            updateUI();\n        })();\n    </script>\n</body>\n</html>\n```"}},"currentId":"f17e0e02-8aa3-4493-98dc-5cbbb131bb8a"},"files":[],"timestamp":1782184256847}
```