当前位置: 首页 > news >正文

HTML练习

仿写微博发布案例

代码:

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>简易动态发布系统</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } ul { list-style: none; } /* 容器居中 */ .container { width: 800px; margin: 50px auto; padding: 20px; border-radius: 12px; box-shadow: 0 0 15px rgba(0,0,0,0.08); } /* 输入区域样式 */ .input-area textarea { width: 100%; height: 120px; resize: none; border: 1px solid #eee; border-radius: 8px; padding: 15px; font-size: 16px; margin-bottom: 15px; transition: border 0.3s; } .input-area textarea:focus { outline: none; border-color: #4299e1; } /* 发布区域样式 */ .publish-bar { display: flex; justify-content: space-between; align-items: center; } .word-count span { color: #666; font-size: 14px; margin-right: 10px; } .word-count .useCount { color: #e53e3e; font-weight: bold; } .publish-btn { width: 110px; height: 36px; border: none; border-radius: 6px; background: #4299e1; color: #fff; font-size: 16px; cursor: pointer; transition: background 0.3s; } .publish-btn:hover { background: #3182ce; } .publish-btn:disabled { background: #a7c0ff; cursor: not-allowed; } /* 动态列表样式 */ .dynamic-list { margin-top: 30px; } .dynamic-list li { padding: 20px; border-bottom: 1px dashed #eee; position: relative; transition: background 0.3s; } .dynamic-list li:hover { background: #fafafa; } .user-info { display: flex; align-items: center; margin-bottom: 10px; } .user-avatar { width: 70px; height: 70px; border-radius: 50%; margin-right: 15px; } .user-meta span { font-size: 17px; font-weight: 600; color: #333; } .user-meta p { font-size: 12px; color: #999; margin-top: 4px; } .dynamic-content { color: #555; font-size: 15px; line-height: 1.6; word-break: break-all; margin-left: 85px; } /* 删除按钮样式 */ .delete-btn { position: absolute; right: 20px; top: 20px; color: #999; font-size: 20px; cursor: pointer; transition: color 0.3s; } .delete-btn:hover { color: #e53e3e; } </style> </head> <body> <div class="container"> <!-- 输入区域 --> <div class="input-area"> <textarea id="content" placeholder="分享你的想法..."></textarea> <div class="publish-bar"> <div class="word-count"> 已输入:<span class="useCount">0</span> 字 </div> <button class="publish-btn" id="publish">发布动态</button> </div> </div> <!-- 动态列表 --> <ul class="dynamic-list" id="dynamicList"></ul> </div> <script> // 1. 日期格式化函数(优化格式,保持美观) function formatTime() { const date = new Date(); const pad = (num) => num < 10 ? `0${num}` : num; const year = date.getFullYear(); const month = pad(date.getMonth() + 1); const day = pad(date.getDate()); const hours = pad(date.getHours()); const minutes = pad(date.getMinutes()); const seconds = pad(date.getSeconds()); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } // 2. 获取页面元素 const textarea = document.getElementById('content'); const publishBtn = document.getElementById('publish'); const wordCountSpan = document.querySelector('.useCount'); const dynamicList = document.getElementById('dynamicList'); // 3. 功能1:实时统计输入字数 textarea.oninput = function() { const length = this.value.trim().length; wordCountSpan.innerText = length; // 输入为空时禁用按钮 publishBtn.disabled = length === 0; }; // 4. 功能2:发布动态 publishBtn.onclick = function() { const content = textarea.value.trim(); // 二次校验(避免绕过input事件直接点击) if (!content) { alert('动态内容不能为空哦!'); return; } // 创建动态列表项li const li = document.createElement('li'); // 创建用户信息区域 const userInfo = document.createElement('div'); userInfo.className = 'user-info'; li.appendChild(userInfo); // 头像 const avatar = document.createElement('img'); avatar.className = 'user-avatar'; // 使用在线占位图(避免本地路径问题) avatar.src = 'https://via.placeholder.com/70/4299e1/ffffff?text=U'; userInfo.appendChild(avatar); // 用户名和发布时间 const userMeta = document.createElement('div'); userMeta.className = 'user-meta'; userInfo.appendChild(userMeta); const username = document.createElement('span'); username.innerText = '星辰大海'; // 自定义用户名 userMeta.appendChild(username); const publishTime = document.createElement('p'); publishTime.innerText = `发布于 ${formatTime()}`; userMeta.appendChild(publishTime); // 动态内容 const dynamicContent = document.createElement('div'); dynamicContent.className = 'dynamic-content'; dynamicContent.innerText = content; li.appendChild(dynamicContent); // 删除按钮(补充原系统未实现的功能) const deleteBtn = document.createElement('div'); deleteBtn.className = 'delete-btn'; deleteBtn.innerText = '×'; deleteBtn.onclick = function() { if (confirm('确定要删除这条动态吗?')) { dynamicList.removeChild(li); } }; li.appendChild(deleteBtn); // 将新动态插入列表顶部 dynamicList.insertBefore(li, dynamicList.firstChild); // 清空输入框并重置字数 textarea.value = ''; wordCountSpan.innerText = '0'; publishBtn.disabled = true; }; // 初始化:默认禁用发布按钮 publishBtn.disabled = true; </script> </body> </html>
http://www.cnnetsun.cn/news/860664.html

相关文章:

  • msxmlr.dll文件丢失找不到问题 免费下载方法分享
  • python微信小程序的教室自习室占座预约系统
  • 茶叶病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)
  • 9个降aigc工具推荐!本科生高效降AI率指南
  • 【CDA干货】业务增长必看(上):3个核心用户类模型,搞定分层、转化与留存
  • 富文本编辑器KindEditor如何处理WORD图文混排粘贴?
  • 【超全】基于微信小程序的设备故障报修管理系统【包括源码+文档+调试】
  • java-springboot-vue 基于智能AI + SpringBoot+Vue的物流管理系统 毕业设计项目实战辅导指导
  • MariaDB/MySQL 数据库管理入门
  • 手把手教你封装一个调用三方接口的 HTTP 工具类(Spring Boot + Java 实战)
  • 手把手教你封装一个树形结构处理类(Java 通用 Tree 工具,支持无限层级)
  • 【计算机网络】ep1:物理层概述
  • 百度开源上传组件在局域网如何处理大文件断点续传?
  • PostgreSQL MCP
  • 高危!Apache Parquet Java库曝远程代码执行(RCE)漏洞,需立即修复
  • 大模型工具使用指南:MCP与Skills对比分析,收藏级技术解析
  • 从0到1掌握RAG:解决大模型落地痛点的终极方案,建议收藏!
  • Nodejs+vuenet基于位置管理的企业 员工考勤打卡系统设计app小程序
  • 我让AI读了产品PRD,自动生成“验收标准”测试用例
  • 2026年效率翻倍:开发者必装的AI助手APP
  • AI测试用例生成的“异常流”缺失:一场未被教导的盲区
  • ‌AI驱动的测试用例模板统一实践:从标准框架到团队协同的完整路径
  • 基于AI课堂+Spring Boot +Vue的面向中职学校的第二课堂教学管理系统 毕业设计项目实战辅导指导
  • 基于人工智能AI + Spring Boot + AI建议分析建筑工程项目管理系统 毕业设计项目实战辅导指导
  • 为什么工业智能化需要工业AI大脑?应该如何选择?
  • 别再“假装数字化”了!3分钟搞懂:什么叫“数字化成效”,以及怎么用最少的钱干最靓的事!
  • Nodejs+vue新闻订阅推荐系统头条app的设计与实现 小程序
  • 看懂风扇的“里外”:原理、构造、性能与计算的系统性解读
  • 10个技巧:用AI自动生成测试报告
  • 【值得珍藏】LLM推理优化技术详解:从数据级到系统级的全面解析