HTML+CSS+JavaScript:实现B站评论发布效果

一、需求

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/57802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第9章 CSS-DOM

三位一体的网页 游览器由结构层&#xff0c;表现层&#xff0c;行为层组成 结构层 网页的结构层&#xff08;structural layer&#xff09;由HTML或XHTML之类的标记语言负责创建。 表现层 表示层&#xff08;presentation layer&#xff09;由CSS负责完成。CSS描述页面内容…

软件测试环境讲解

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0c…

高性能API设计

背景 设计出一个高性能的API&#xff0c;需要综合网络、业务、数据库的优化。一下是我在实际的开发过程中总结的优化思想和一些效率提升的技巧。 批量思想 很多的数据库操作都含有batch或者bulk的api&#xff0c;如我最近常使用的mybatis、mybatis plus以及elastic Search的…

【机器学习】西瓜书习题3.3Python编程实现对数几率回归

参考代码 结合自己的理解&#xff0c;添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt from sklearn import linear_model导入数据&#xff0c;进行数据处理和特征工程 # 1.数据处理&#x…

指针经典笔试题强训(附图详解)

目录 笔试题1&#xff1a; 解析&#xff1a; 运行结果&#xff1a; 笔试题2 解析&#xff1a; 运行结果&#xff1a; 笔试题3 解析&#xff1a; 运行结果&#xff1a; 笔试题4 解析&#xff1a; 运行结果&#xff1a; 笔试题5 解析&#xff1a; 运行结果&#xff1a;…

智慧~经典开源项目数字孪生智慧商场——开源工程及源码

深圳南山某商场的工程和源码免费赠送&#xff0c;助您打造智慧商场。立即获取&#xff0c;提升商场管理效能&#xff01; 项目介绍 凤凰商场作为南山地区的繁华商业中心&#xff0c;提供多样化的购物和娱乐体验。通过此项目&#xff0c;凤凰商场将迈向更智能的商业模式。 本项目…

【第一阶段】kotlin语言的String模板

1.在Java中拼接字符串使用的是“” 2.在kotlin中使用"${}" 3.kotlin语言中if是表达式&#xff0c;更灵活 fun main() {val city"西安"val time24//java中写法println("我在"city"玩了"time"小时")//kotlin中写法&#xff0…

汽车EBSE测试流程分析(四):反思证据及当前问题解决

EBSE专题连载共分为“五个”篇章。此文为该连载系列的“第四”篇章&#xff0c;在之前的“篇章&#xff08;三&#xff09;”中已经结合具体研究实践阐述了“步骤二&#xff0c;通过系统调研确定改进方案”等内容。那么&#xff0c;在本篇章&#xff08;四&#xff09;中&#…

springboot项目如何自动重启(使用Devtools检测修改并自动重启springboot)

1. 问题&#xff1a; 我们在项目开发阶段&#xff0c;可能经常会修改代码&#xff0c;修改完后就要重启Spring Boot。经常手动停止再启动&#xff0c;比较麻烦。 所以我们引入一个Spring Boot提供的开发工具&#xff1b; 只要源码或配置文件发生修改&#xff0c;Spring Boot应用…

力扣 62. 不同路径

题目来源&#xff1a;https://leetcode.cn/problems/unique-paths/ C题解1&#xff1a;动态规划。声明二维数组。 确定dp数组&#xff08;dp table&#xff09;以及下标的含义。dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) …

2023年08月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年08月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

【MySQL】DDL和DML

4&#xff0c;DDL:操作数据库 我们先来学习DDL来操作数据库。而操作数据库主要就是对数据库的增删查操作。 4.1 查询 查询所有的数据库 SHOW DATABASES; 运行上面语句效果如下&#xff1a; 上述查询到的是的这些数据库是mysql安装好自带的数据库&#xff0c;我们以后不要操…

精通GPU编程,高效处理Pandas

大家好&#xff0c;当正在使用python处理大型数据集&#xff0c;那么很可能会感受到&#xff0c;当基于CPU的pandas DataFrame难以执行操作时&#xff0c;等待数小时才能完成查询的挫败感。正是在这种情况下&#xff0c;pandas用户应该考虑使用RAPIDS cuDF利用GPU的强大功能进行…

无涯教程-Lua - Arrays(数组)

数组是对象的有序排列&#xff0c;可以是包含行集合的一维数组&#xff0c;也可以是包含多行和多列的多维数组。 在Lua中&#xff0c;数组是使用带有整数的索引表实现的。数组的大小不是固定的&#xff0c;并且可以根据无涯教程的要求(取决于内存限制)来增长。 一维数组 一维…

Linux系统安装部署MongoDB完整教程(图文详解)

前言&#xff1a;本期给大家分享一下目前最新Linux系统安装部署MongoDB完整教程&#xff0c;我的服务器采用的是Centos7&#xff0c;在部署之前我重装了我的服务器&#xff0c;目的是为了干净整洁的给大家演示我是如何一步步的操作的&#xff0c;整体部署还是挺简洁&#xff0c…

react ant icon的简单使用

refer: 快速上手 - Ant Design 1.引入ant npm install antd --save 2.在页面引用&#xff1a; import { StarOutlined } from ant-design/icons; 如果想要引入多个icon&#xff0c;可以这样书写&#xff1a; import { UserOutlined, MailOutlined, PieChartOutlined } fr…

C/C++开发,opencv与qt结合播放视频

目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明&#xff0c;这是一个OpenCV 3学习文档的案例&#xff0c;但是说明有些过于省略&#xff0c;只有一些简短的代码…

golang执行异步任务的第三方库jobrunner库实践

简介 我们在 Web 开发中时常会遇到这样的需求&#xff0c;执行一个操作之后&#xff0c;需要给用户一定形式的通知。例如&#xff0c;用户下单之后通过邮件发送电子发票&#xff0c;网上购票支付后通过短信发送车次信息。但是这类需求并不需要非常及时&#xff0c;如果放在请求…

java+springboot+mysql校园宿舍报修管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的校园宿舍报修管理系统&#xff0c;系统包含管理员、维修员、学生角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;楼栋管理、宿舍管理、维修人员管理、学生管理&#xff1b;报修管理&#xff08;派单给维修员&am…

npm发布包

1.npm 登录 在控制台输入命令 npm login 按提示输入用户名&#xff0c;密码&#xff0c;邮箱后登录 如果出现如下提示 需要将淘宝镜像源切换为npm源&#xff0c;删除或注释以下内容就行 2.发布 进入准备发布的代码的根目录下&#xff0c;输入命令 npm publish 3.删除已发…