多Div区块随Checkbox勾选淡出效果的简化实现需求
简化食谱步骤完成勾选淡出功能的实现方案
实现思路
不用为每个步骤编写单独的JS函数,通过事件委托统一处理所有复选框的状态变化,用data-*属性关联复选框和对应的步骤div。非技术用户新增步骤时,只需要复制现有结构、修改ID即可,完全不用碰JS代码。
完整代码实现
HTML结构
<!-- 步骤1 --> <div class="recipe-step"> <input type="checkbox" data-target="step-one" id="check-step-one"> <label for="check-step-one">Mark as Complete</label> <div id="step-one" class="step-content"> <h3>Step One</h3> <p>将面粉、鸡蛋、牛奶混合成糊状,静置10分钟。</p> </div> </div> <!-- 步骤2 --> <div class="recipe-step"> <input type="checkbox" data-target="step-two" id="check-step-two"> <label for="check-step-two">Mark as Complete</label> <div id="step-two" class="step-content"> <h3>Step Two</h3> <p>平底锅预热,刷一层薄油,倒入一勺面糊摊成圆形。</p> </div> </div> <!-- 新增步骤只需复制以上结构,修改3处: 1. 复选框的id(比如check-step-three) 2. label的for属性对应新复选框id 3. 步骤div的id(比如step-three),同时把复选框的data-target改成这个新id -->
CSS样式
.step-content { margin: 10px 0; padding: 15px; border: 1px solid #eee; border-radius: 4px; /* 添加平滑过渡动画 */ transition: opacity 0.5s ease, visibility 0.5s ease; } .fade-out { opacity: 0.3; /* 如果需要完全隐藏,可添加以下代码: visibility: hidden; height: 0; padding: 0; margin: 0; overflow: hidden; */ }
JavaScript代码
// 事件委托:监听页面上所有复选框的状态变化 document.addEventListener('change', function(e) { // 只处理带data-target属性的复选框 if (e.target.type === 'checkbox' && e.target.dataset.target) { const targetDivId = e.target.dataset.target; const stepDiv = document.getElementById(targetDivId); if (stepDiv) { // 根据勾选状态切换淡出类 stepDiv.classList.toggle('fade-out', e.target.checked); } } });
新增步骤的操作流程
- 复制现有的
.recipe-step容器代码 - 修改三个字段:
- 复选框的
id(比如从check-step-two改成check-step-three) - label的
for属性值和新复选框id保持一致 - 步骤内容div的
id(比如step-three),同时把复选框的data-target值改成这个新id
- 复选框的
- 把修改后的代码粘贴到页面中,无需改动JS或CSS,直接生效
方案优势
- 彻底抛弃了每个步骤写单独函数的冗余模式,代码量大幅减少
- 事件委托自动监听所有新增的复选框,无需手动绑定事件
- 非技术用户只需简单复制修改ID,就能无限扩展步骤数量
内容的提问来源于stack exchange,提问作者Inventive Web Design
相关产品推荐
相关产品推荐

