一、需求
1、用户输入内容,输入框右下角实时显示输入字数
2、为避免用户输入时在内容左右两端误按多余的空格,在发送评论时,检测用户输入的内容左右两端是否带有空格,若有空格,发布时自动取消左右两端的空格
3、若用户发布的内容为空,则自动取消该条评论的发送,并弹出提示框:请勿发送空白评论!
4、当页面中已经填装多条评论时,发送的新评论自动追加到最末尾
5、 发布的评论最下方显示发布时间
二、代码素材
以下是缺失JS部分的代码,感兴趣的小伙伴可以先自己试着写一写
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>评论回车发布</title> <style> .wrapper { min-width: 400px; max-width: 800px; display: flex; justify-content: flex-end; } .avatar { width: 48px; height: 48px; border-radius: 50%; overflow: hidden; /* 不允许超出大盒子 */ background: url(./images/avatar.jpg) no-repeat center / cover; /* 大部分情况下,图片样式都是这样设置的 */ margin-right: 20px; } /* outline:outline(轮廓)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 注释:轮廓线不会占据空间,也不一定是矩形。 */ /* transition:设置过度属性 与.wrapper textarea:focus { border-color: #e4e4e4; background: #fff; height: 50px; }配合使用,表示光标在文本域中时,所有样式(属性值all)在2s内向 border-color:#e4e4e4; background: #fff; height: 50px; 平滑过渡 */ .wrapper textarea { outline: none; /* 这行代码可省略 */ border-color: transparent; /* 边框颜色为透明 */ resize: none; /* 用户无法自行调元素的尺寸,常用于文本域 */ background: #f5f5f5; border-radius: 4px; flex: 1; padding: 10px; /* 这行代码与下面.wrapper textarea:focus的那几行代码配合,可以让相关样式在获取焦点事件的时候平滑过渡 */ transition: all 0.5s; height: 30px; } /*用法类似于 选择器:hover */ .wrapper textarea:focus { border-color: #e4e4e4; background: #fff; height: 50px; } .wrapper button { background: #00aeec; color: #fff; border: none; border-radius: 4px; margin-left: 10px; width: 70px; cursor: pointer; } .wrapper .total { margin-right: 80px; color: #999; margin-top: 5px; opacity: 0; /* opacity设置透明度,0是完全透明,1是完全不透明 opacity从0变成1时,元素会平滑显现 */ transition: all 0.5s; } .list { min-width: 400px; max-width: 800px; } .list .item { width: 100%; display: flex; } .list .item .info { flex: 1; border-bottom: 1px dashed #e4e4e4; padding-bottom: 10px; } .list .item p { margin: 0; } .list .item .name { color: #FB7299; font-size: 14px; font-weight: bold; line-height: 2em; } .list .item .text { color: #333; padding: 10px 0; } .list .item .time { color: #999; font-size: 12px; } </style> </head> <body> <div class="wrapper"> <i class="avatar"></i> <!-- 需用可在一行排列且可设置宽高的行内块元素 --> <textarea id="tx" placeholder="发一条友善的评论" rows="2" maxlength="200"></textarea> <button>发布</button> </div> <div class="wrapper"> <span class="total">0/200字</span> </div> <div class="list"> <!-- <div class="item"> <i class="avatar"></i> <div class="info"> <p class="name">早八睡不醒午觉睡不够的程序员</p> <p class="text">大家都辛苦啦,感谢各位大大的努力,能圆满完成真是太好了[笑哭][支持]</p> <p class="time">2022-10-10 20:29:21</p> </div> </div> --> </div> <script> </script> </body> </html>
复制
三、完整代码
因为今天这个案例的算法思路实在不方便直接用语言描述,所以我就直接放代码了
不过我在代码上添加了详细的注释,大家结合代码和注释一定能够理解的
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>评论回车发布</title> <style> .wrapper { min-width: 400px; max-width: 800px; display: flex; justify-content: flex-end; } .avatar { width: 48px; height: 48px; border-radius: 50%; overflow: hidden; /* 不允许超出大盒子 */ background: url(./images/avatar.jpg) no-repeat center / cover; /* 大部分情况下,图片样式都是这样设置的 */ margin-right: 20px; } /* outline:outline(轮廓)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 注释:轮廓线不会占据空间,也不一定是矩形。 */ /* transition:设置过度属性 与.wrapper textarea:focus { border-color: #e4e4e4; background: #fff; height: 50px; }配合使用,表示光标在文本域中时,所有样式(属性值all)在2s内向 border-color:#e4e4e4; background: #fff; height: 50px; 平滑过渡 */ .wrapper textarea { outline: none; /* 这行代码可省略 */ border-color: transparent; /* 边框颜色为透明 */ resize: none; /* 用户无法自行调元素的尺寸,常用于文本域 */ background: #f5f5f5; border-radius: 4px; flex: 1; padding: 10px; /* 这行代码与下面.wrapper textarea:focus的那几行代码配合,可以让相关样式在获取焦点事件的时候平滑过渡 */ transition: all 0.5s; height: 30px; } /*用法类似于 选择器:hover */ .wrapper textarea:focus { border-color: #e4e4e4; background: #fff; height: 50px; } .wrapper button { background: #00aeec; color: #fff; border: none; border-radius: 4px; margin-left: 10px; width: 70px; cursor: pointer; } .wrapper .total { margin-right: 80px; color: #999; margin-top: 5px; opacity: 0; /* opacity设置透明度,0是完全透明,1是完全不透明 opacity从0变成1时,元素会平滑显现 */ transition: all 0.5s; } .list { min-width: 400px; max-width: 800px; } .list .item { width: 100%; display: flex; } .list .item .info { flex: 1; border-bottom: 1px dashed #e4e4e4; padding-bottom: 10px; } .list .item p { margin: 0; } .list .item .name { color: #FB7299; font-size: 14px; font-weight: bold; line-height: 2em; } .list .item .text { color: #333; padding: 10px 0; } .list .item .time { color: #999; font-size: 12px; } </style> </head> <body> <div class="wrapper"> <i class="avatar"></i> <!-- 需用可在一行排列且可设置宽高的行内块元素 --> <textarea id="tx" placeholder="发一条友善的评论" rows="2" maxlength="200"></textarea> <button>发布</button> </div> <div class="wrapper"> <span class="total">0/200字</span> </div> <div class="list"> <!-- <div class="item"> <i class="avatar"></i> <div class="info"> <p class="name">早八睡不醒午觉睡不够的程序员</p> <p class="text">大家都辛苦啦,感谢各位大大的努力,能圆满完成真是太好了[笑哭][支持]</p> <p class="time">2022-10-10 20:29:21</p> </div> </div> --> </div> <script> //获取元素 const tx = document.querySelector('#tx') const button = document.querySelector('.wrapper button') const text = document.querySelector('.text') const time = document.querySelector('.time') const list = document.querySelector('.list') const total = document.querySelector('.total') //函数功能:发布评论 function fabu() { //检测用户输入的内容左右两端是否带有空格,若有空格,发布时自动取消左右两端的空格 //若用户发布的内容为空,则自动取消该条评论的发送,并弹出提示框:请勿发送空白评论! if (tx.value.trim() === '') { tx.value = '' total.innerHTML = '0/200字' alert('请勿发送空白评论!') return } //创建新的元素节点 const div = document.createElement('div') //修改元素节点的内容 div.className = 'item' div.innerHTML = ` <i class="avatar"></i> <div class="info"> <p class="name">早八睡不醒午觉睡不够的程序员</p> <p class="text">${tx.value}</p> <p class="time">${new Date().toLocaleString()}</p> </div> ` //清空用户输入的内容 tx.value = '' total.innerHTML = `${tx.value.length}/200字` //将用户输入的内容追加到评论区里 list.append(div) } //鼠标点击发布,调用发布函数 button.addEventListener('click', () => { fabu() }) // 键盘按下Enter,调用发布函数 tx.addEventListener('keyup', e => { if (e.key === 'Enter') fabu() }) //输入框获得焦点,右下角自动显示字数 tx.addEventListener('focus', function () { total.style.opacity = 1 }) //输入框失去焦点,右下角字数显示自动消失 tx.addEventListener('blur', function () { total.style.opacity = 0 }) //用户输入时,实时显示输入字数 tx.addEventListener('input', () => { total.innerHTML = `${tx.value.length}/200字` }) </script> </body> </html>
复制