news 2026/6/21 13:14:12

weibo发布案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
weibo发布案例

架构如下:

weibo.css

* {

margin: 0;

padding: 0;

}

ul {

list-style: none;

}

.w {

width: 900px;

margin: 0 auto;

}

.controls textarea {

width: 878px;

height: 100px;

resize: none;

border-radius: 10px;

outline: none;

padding-left: 20px;

padding-top: 10px;

font-size: 18px;

}

.controls {

overflow: hidden;

}

.controls div {

float: right;

}

.controls div span {

color: #666;

}

.controls div .useCount {

color: red;

}

.controls div button {

width: 100px;

outline: none;

border: none;

background: rgb(252, 251, 251);

height: 30px;

cursor: pointer;

color: #fff;

font: bold 14px '宋体';

transition: all 0.5s;

}

.controls div button:hover {

background: rgb(0, 225, 255);

}

.controls div button:disabled {

background: rgba(0, 225, 255, 0.5);

}

.contentList {

margin-top: 50px;

}

.contentList li {

padding: 20px 0;

border-bottom: 1px dashed #ccc;

position: relative;

}

.contentList li .info {

position: relative;

}

.contentList li .info span {

position: absolute;

top: 15px;

left: 100px;

font: bold 16px '宋体';

}

.contentList li .info p {

position: absolute;

top: 40px;

left: 100px;

color: #aaa;

font-size: 12px;

}

.contentList img {

width: 80px;

border-radius: 50%;

}

.contentList li .content {

padding-left: 100px;

color: #666;

word-break: break-all;

}

.contentList li .the_del {

position: absolute;

right: 0;

top: 0;

font-size: 28px;

cursor: pointer;

}

@media (max-width: 920px) {

.w {

width: 95%;

padding: 0 15px;

}

.controls textarea {

width: calc(100% - 40px);

}

}

/* 微博项悬停效果 */

.contentList li:hover {

background-color: #f9f9f9;

transform: translateY(-2px);

transition: all 0.3s ease;

}

/* 发布按钮悬停效果增强 */

.controls div button:hover {

background: rgb(0, 195, 255);

transform: scale(1.05);

}

/* 删除按钮样式增强 */

.contentList li .the_del:hover {

color: #ff3333;

transform: scale(1.2);

}

/* 微博内容换行 */

.contentList li .content {

line-height: 1.6;

font-size: 16px;

margin-top: 10px;

}

/* 用户信息样式优化 */

.contentList li .info span {

color: #333;

font-weight: bold;

}

.contentList li .info p {

color: #666;

}

body {

background-color: #f5f8fa;

font-family: 'Microsoft YaHei', Arial, sans-serif;

line-height: 1.5;

}

.w {

background: white;

border-radius: 10px;

padding: 25px;

box-shadow: 0 2px 10px rgba(0,0,0,0.05);

}


.contentList li {

border: 1px solid #e6ecf0;

border-radius: 10px;

padding: 18px;

margin-bottom: 15px;

background: #fafafa;

}


.contentList img {

border-radius: 50%;

border: 2px solid #1da1f2;

}

.contentList li .info span {

color: #333;

font-size: 16px;

font-weight: bold;

}


.controls div button {

border-radius: 18px;

font-weight: bold;

}


.controls textarea {

border: 2px solid #ccd6dd;

border-radius: 8px;

padding: 12px;

}

.controls textarea:focus {

border-color: #1da1f2;

outline: none;

}

weibo.js

// 日期格式化函数 - 保留原有

function getTime() {

var date = new Date();

var year = date.getFullYear();

var month = date.getMonth() + 1;

month = month < 10 ? '0' + month : month;

var day = date.getDate();

day = day < 10 ? '0' + day : day;

var hours = date.getHours();

hours = hours < 10 ? '0' + hours : hours;

var minutes = date.getMinutes();

minutes = minutes < 10 ? '0' + minutes : minutes;

var seconds = date.getSeconds();

seconds = seconds < 10 ? '0' + seconds : seconds;

var str = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;

return str;

}

// 1. 获取元素

var area = document.querySelector('#area');

var send = document.querySelector('#send');

var useCount = document.querySelector('.useCount');

var ul = document.querySelector('ul');

// 用户数据数组 - 确保这个存在

var dataArr = [

{ uname: '司马懿', imgSrc: './images/9.5/01.jpg' },

{ uname: '女娲', imgSrc: './images/9.5/02.jpg' },

{ uname: '百里守约', imgSrc: './images/9.5/03.jpg' },

{ uname: '亚瑟', imgSrc: './images/9.5/04.jpg' },

{ uname: '虞姬', imgSrc: './images/9.5/05.jpg' },

{ uname: '张良', imgSrc: './images/9.5/06.jpg' },

{ uname: '安其拉', imgSrc: './images/9.5/07.jpg' },

{ uname: '李白', imgSrc: './images/9.5/08.jpg' },

{ uname: '阿珂', imgSrc: './images/9.5/09.jpg' },

{ uname: '墨子', imgSrc: './images/9.5/10.jpg' },

{ uname: '鲁班', imgSrc: './images/9.5/11.jpg' },

{ uname: '嬴政', imgSrc: './images/9.5/12.jpg' },

{ uname: '孙膑', imgSrc: './images/9.5/13.jpg' },

{ uname: '周瑜', imgSrc: './images/9.5/14.jpg' },

{ uname: '老夫子', imgSrc: './images/9.5/15.jpg' },

{ uname: '狄仁杰', imgSrc: './images/9.5/16.jpg' },

{ uname: '扁鹊', imgSrc: './images/9.5/17.jpg' },

{ uname: '马可波罗', imgSrc: './images/9.5/18.jpg' },

{ uname: '露娜', imgSrc: './images/9.5/19.jpg' },

{ uname: '孙悟空', imgSrc: './images/9.5/20.jpg' },

{ uname: '黄忠', imgSrc: './images/9.5/21.jpg' },

{ uname: '百里玄策', imgSrc: './images/9.5/22.jpg' }

];

// 2. 功能1:文本域输入的过程中统计内容的个数给span

area.oninput = function () {

var count = this.value.length;

useCount.innerText = count;

// 添加字数限制提示

if (count > 200) {

useCount.style.color = 'red';

send.disabled = true;

} else {

useCount.style.color = '#666';

send.disabled = false;

}

};

// 3. 功能2:点击发布按钮创建li追加到ul中

send.onclick = function () {

var v = area.value.trim();

// 3.3 检测内容的长度是否等于0,若等于0,提示不能为空

if (v.length == 0) {

alert('内容不能为空!');

return;

}

// 检查字数是否超过限制

if (v.length > 200) {

alert('内容不能超过200字!');

return;

}

// 随机选择一个用户

var randomIndex = Math.floor(Math.random() * dataArr.length);

var randomUser = dataArr[randomIndex];

// 3.4 创建li插入到ul中最前面

var newLi = document.createElement('li');

ul.insertBefore(newLi, ul.children[0]);

// 3.5 创建一个类名为info的div,追加到li中

var info = document.createElement('div');

info.className = 'info';

newLi.appendChild(info);

// 3.5.1 创建一个img元素,追加到类名为info的div中

var img = document.createElement('img');

info.appendChild(img);

// 3.5.2 设置img的src - 使用随机用户头像

img.src = randomUser.imgSrc;

img.alt = randomUser.uname;

// 3.5.3 创建一个span元素,追加到类名为info的div中

var span = document.createElement('span');

info.appendChild(span);

// 3.5.4 设置span的内容 - 使用随机用户名

span.innerText = randomUser.uname;

// 3.5.5 创建一个p元素,追加到类名为info的div中

var p = document.createElement('p');

info.appendChild(p);

// 3.5.6 把当前时间设置给p元素

p.innerText = '发布于:' + getTime();

// 3.6 创建一个类名为content的div,追加到li中

var content = document.createElement('div');

content.className = 'content';

newLi.appendChild(content);

// 3.7 设置类名为content的div的innerText为文本域的内容

content.innerText = v;

// 3.8 添加删除按钮

var delBtn = document.createElement('span');

delBtn.className = 'the_del';

delBtn.innerHTML = '×';

delBtn.title = '删除此微博';

newLi.appendChild(delBtn);

// 3.9 发布成功后,清空文本域,数量重置为0

area.value = '';

useCount.innerText = '0';

useCount.style.color = '#666';

// 添加删除功能

delBtn.addEventListener('click', function() {

if (confirm('确定要删除这条微博吗?')) {

newLi.style.opacity = '0';

newLi.style.transform = 'translateX(100px)';

setTimeout(function() {

ul.removeChild(newLi);

}, 300);

}

});

};

// 4. 添加快捷键支持:Ctrl+Enter 发布

area.addEventListener('keydown', function(e) {

if (e.ctrlKey && e.key === 'Enter') {

if (!send.disabled) {

send.click();

}

}

});

// 5. 初始化:为页面加载时显示的微博添加删除功能

// 如果你有初始微博,可以在这里添加删除功能

// 6. 添加一些初始示例微博(可选)

window.onload = function() {

// 如果有需要,可以在这里添加一些示例微博

console.log('微博系统已加载完成!');

};

index.html

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>Document</title>

<link rel="stylesheet" href="css/weibo.css">

</head>

<body>

<div class="w">

<div class="controls">

<img src="images/tip.png" alt=""><br>

<textarea placeholder="说点什么吧..." id="area" cols="30" rows="10" maxlength="200"></textarea>

<div>

<span class="useCount">0</span>

<span>/</span>

<span>200</span>

<button id="send">发布</button>

</div>

</div>

<div class="contentList">

<ul>

</ul>

</div>

</div>

<script>

let dataArr = [

{ uname: '司马懿', imgSrc: './images/9.5/01.jpg' },

{ uname: '女娲', imgSrc: './images/9.5/02.jpg' },

{ uname: '百里守约', imgSrc: './images/9.5/03.jpg' },

{ uname: '亚瑟', imgSrc: './images/9.5/04.jpg' },

{ uname: '虞姬', imgSrc: './images/9.5/05.jpg' },

{ uname: '张良', imgSrc: './images/9.5/06.jpg' },

{ uname: '安其拉', imgSrc: './images/9.5/07.jpg' },

{ uname: '李白', imgSrc: './images/9.5/08.jpg' },

{ uname: '阿珂', imgSrc: './images/9.5/09.jpg' },

{ uname: '墨子', imgSrc: './images/9.5/10.jpg' },

{ uname: '鲁班', imgSrc: './images/9.5/11.jpg' },

{ uname: '嬴政', imgSrc: './images/9.5/12.jpg' },

{ uname: '孙膑', imgSrc: './images/9.5/13.jpg' },

{ uname: '周瑜', imgSrc: './images/9.5/14.jpg' },

{ uname: '老夫子', imgSrc: './images/9.5/15.jpg' },

{ uname: '狄仁杰', imgSrc: './images/9.5/16.jpg' },

{ uname: '扁鹊', imgSrc: './images/9.5/17.jpg' },

{ uname: '马可波罗', imgSrc: './images/9.5/18.jpg' },

{ uname: '露娜', imgSrc: './images/9.5/19.jpg' },

{ uname: '孙悟空', imgSrc: './images/9.5/20.jpg' },

{ uname: '黄忠', imgSrc: './images/9.5/21.jpg' },

{ uname: '百里玄策', imgSrc: './images/9.5/22.jpg' },

]

// 1、元素对象的获取

let textarea =document.querySelector("textarea")

let useCount = document.querySelector(".useCount")

let send = document.querySelector("#send")

let ul = document.querySelector(".contentList ul")


textarea.addEventListener("input",function(){

// alert(666)

useCount.innerHTML = textarea.value.length

})


// 点击按钮,发送li

send.addEventListener("click",function(){

if (textarea.value.trim()===""){

textarea.value=""

useCount.innerHTML=0

return alert("内容不能为空")

}


function getRandom(min,max){

return Math.floor(Math.random() * (max - min + 1)) + min

}


let random = getRandom(0,dataArr.length-1)

// 创建新的li

let newLI = document.createElement("li")

// li里面添加内容

newLI.innerHTML=`

<div class="info">

<img class="userpic" src=${dataArr[random].imgSrc}>

<span class="username"> ${dataArr[random].uname}</span>

<p class="send-time">${new Date().toLocaleString()}</p>

</p>

</div>

<div>${textarea.value.trim()}</div>

<span class="the_del">X</span>

`



// 追加

// ul.appendChild(newLI)

ul.insertBefore(newLI,ul.children[0])

textarea.value=""

useCount.innerHTML=0


// 删除留言

let del = document.querySelector(".the_del")

del.addEventListener("click",function(){

ul.removeChild(newLI)

})


// let dels = document.querySelectorAll(".the_del")

// console.log(dels)

// for(let i of dels){

// console.log(i)

// i.addEventListener("click",function(){

// ul.removeChild(i.parentNode)

// })

// }


})





// 快捷键的设置

textarea.addEventListener("keydown",function(e){

e.preventDefault()

if (e.code==="Enter"){

send.click()

}

})




// JS代码的执行机制

</script>

</body>

</html>



实现页面:















版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 9:09:37

数据合并和处理缺失值的具体案例

数据合并和处理缺失值的具体案例 数据合并案例场景数据合并案例场景 在实际业务中&#xff0c;我们经常需要将来自不同来源的数据进行合并&#xff0c;以便进行全面分析。例如&#xff0c;一家电商平台可能有一个包含客户基本信息的表和一个记录客户购买历史的表。这两个表通过…

作者头像 李华
网站建设 2026/6/21 12:53:17

hcia练习5

如题划分如图完成

作者头像 李华
网站建设 2026/6/15 19:30:23

用AI撰写高质量网络小说:脑洞生成实操指南

网络小说的核心竞争力&#xff0c;往往藏在“脑洞”里——一个新奇、合理又有延展性的脑洞&#xff0c;能快速抓住读者注意力&#xff0c;让作品在海量内容中脱颖而出。但脑洞的诞生并非偶然&#xff0c;很多创作者都会陷入“灵感枯竭”的困境&#xff0c;反复纠结于设定老套、…

作者头像 李华
网站建设 2026/6/16 8:25:46

AI辅助网络小说创作:高质量脑洞生成实操(附Python代码)

网络小说的出圈关键&#xff0c;往往在于“脑洞”的独特性——一个新奇、逻辑自洽且有延展性的脑洞&#xff0c;能快速打破内容同质化困境&#xff0c;抓住读者注意力。但灵感枯竭是创作者的常态&#xff0c;反复陷入设定老套、剧情俗套、反转生硬的瓶颈&#xff0c;耗时费力却…

作者头像 李华
网站建设 2026/6/17 11:21:09

Angular 前端端口号修改的几种方式

4200 被占是 Angular 开发里最常见的问题之一。 按 从“临时 → 永久” 给你排一下&#xff0c;挑最适合你的。 方法一&#xff08;最快&#xff09;&#xff1a;启动时指定端口【最常用】 在项目根目录直接运行&#xff1a; ng serve --port 4300或者顺手把 host 也一起指定&a…

作者头像 李华
网站建设 2026/6/17 0:48:15

百度AI:让电脑和手机也能像人一样操作屏幕的智能助手诞生了

想象一下&#xff0c;如果你的电脑或手机能像真人一样看懂屏幕上的内容&#xff0c;知道哪个按钮该点击&#xff0c;哪个输入框该填写&#xff0c;甚至还能帮你完成复杂的多步操作任务&#xff0c;那会是什么样的体验&#xff1f;这听起来像是科幻电影里的情节&#xff0c;但百…

作者头像 李华