【简单的留言墙】HTML+CSS+JavaScript

news2025/1/12 8:39:03

                                                           目标:做一个简单的留言墙

                                        

1.首先我们用HTML的一些标签,初步构造区域 样式。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>留言墙</title>
    <style>
        /* ...... */ 
    <style>
</head>
<body>

    <h1>留言墙</h1>
    <p>输入内容后,点击提交即可</p>

    <div>
        <span>谁:</span>
        <input type="text">
    </div>
    <div>
        <span>对谁:</span>
        <input type="text">
    </div>
    <div>
        <span>说:</span>
        <input type="text">
    </div>
    <div>
        <button>提交</button>
    </div>
    <div>
        <button>撤销</button>
    </div>


</body>
</html>

                                                                              

2.上面操作已经初步完成布局,接下来在style标签中书写CSS代码,利用各种选择器设置。使文字居中,并且改变文字颜色。

<style>
        /* 各种选择器 类选择器 ID选择器 伪类选择器 后代选择器 子选择器 并集选择器 */

        h1 {
            /* 使h1标签中的文字样式居中 */
            text-align: center;
        }

        p {
            /* 使p标签中的文字样式居中 */
            text-align: center;
            /* 改变文字颜色 */
            color: darkgray;
        }

</style>

3.文字已经居中,但是下面的输入框,按钮等还没居中,由于他们都被设置在div标签中,接下来可以对所有在div标签中的属性使用弹性布局设置这些元素的水平排列方式

<style>
        h1 {
            /* 使h1标签中的文字样式居中 */
            text-align: center;
        }

        p {
            /* 使p标签中的文字样式居中 */
            text-align: center;
            color: darkgray;
        }

        div {
            /* 开启弹性布局 */
            display: flex;
            /* 设置元素水平方向排列问题 居中排列 */
            justify-content: center;
            /* 设置每个div标签中元素外边框距离 即元素与元素之间的距离 */
            /* 15px auto 意思为 该元素的上下外边框为15像素 左右自适应排布 */
            margin: 15px auto;
        }


    </style>

 

4.位置居中问题已经解决,但是会发现输入框及文字排列还并不整齐。这是因为我们并未对span标签里的文字及input标签设置各自宽度及高度,一旦设置就会各自居左排布。

<style>

        h1 {
            /* 使h1标签中的文字样式居中 */
            text-align: center;
        }

        p {
            /* 使p标签中的文字样式居中 */
            text-align: center;
            color: darkgray;
        }

        div {
            /* 开启弹性布局 */
            display: flex;
            /* 设置元素水平方向排列问题 居中排列 */
            justify-content: center;
            /* 设置每个div标签中元素外边框距离 即元素与元素之间的距离 */
            /* 15px auto 意思为 该元素的上下外边框为15像素 左右自适应排布 */
            margin: 15px auto;
        }

        span {
            /* 设置宽度 */
            width: 100px;
            /* 设置高度 */
            height: 25px;
        }

        input {
            /* 宽度 */
            width: 200px;
            height: 25px;
        }
        
</style>

      

5. 设置button按钮的宽度,文字颜色,按钮颜色

<style>
        h1 {
            /* 使h1标签中的文字样式居中 */
            text-align: center;
        }

        p {
            /* 使p标签中的文字样式居中 */
            text-align: center;
            color: darkgray;
        }

        div {
            /* 开启弹性布局 */
            display: flex;
            /* 设置元素水平方向排列问题 居中排列 */
            justify-content: center;
            /* 设置每个div标签中元素外边框距离 即元素与元素之间的距离 */
            /* 15px auto 意思为 该元素的上下外边框为15像素 左右自适应排布 */
            margin: 15px auto;
        }

        span {
            /* 设置宽度 */
            width: 100px;
            /* 设置高度 */
            height: 25px;
        }

        input {
            /* 宽度 */
            width: 200px;
            height: 25px;
        }

        button {
            /* 文字颜色 */
            color: white;

            /* 背景颜色 */
            background-color: orange;

            /* 按钮宽度 */
            width: 300px;

            /* 边框颜色 去掉黑边框 */
            border: none;

            /* 设置按钮高度 */
            height: 30px;
        }

    </style>

       

 6.基本布局已经完成,但还存在几个问题

6.1 点击按钮无反应,使用伪类选择器进行设置

<style>
        h1 {
            /* 使h1标签中的文字样式居中 */
            text-align: center;
        }

        p {
            /* 使p标签中的文字样式居中 */
            text-align: center;
            color: darkgray;
        }

        div {
            /* 开启弹性布局 */
            display: flex;
            /* 设置元素水平方向排列问题 居中排列 */
            justify-content: center;
            /* 设置每个div标签中元素外边框距离 即元素与元素之间的距离 */
            /* 15px auto 意思为 该元素的上下外边框为15像素 左右自适应排布 */
            margin: 15px auto;
        }

        span {
            /* 设置宽度 */
            width: 100px;
            /* 设置高度 */
            height: 25px;
        }

        input {
            /* 宽度 */
            width: 200px;
            height: 25px;
        }

        button {
            /* 文字颜色 */
            color: white;

            /* 背景颜色 */
            background-color: orange;

            /* 按钮宽度 */
            width: 300px;

            /* 边框颜色 去掉黑边框 */
            border: none;

            /* 设置按钮高度 */
            height: 30px;
        }

        /* 伪类选择器 设置按钮按下时的变化 */
        button:active {
            background-color: darkorange;
        }

    </style>

6.2.输入框有黑边框问题 还有光标显示位置太靠左。

以下代码有所省略,突出了重点,还是利用CSS选择器设置属性。

input {
            /* 宽度 */
            width: 200px;
            /* 设置高度 */
            height: 25px;
            /* 消除输入框黑框 */
            outline: none;
            /* 光标位置 */
            padding-left: 5px ;
        }

6.3.通过网页中的检查查看发现我们所设置的输入框元素的宽度应该是30px,而这里却显示29.91px,显然有问题。原因是与浏览器的自动设置有关,为防止这些细节出错,最好再加上一段代码。

/* *通配符 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

 最终宽度成功设置为25。

6.4.设置高度,使整体高居中度。

        h1 {
            /* 使h1标签中的文字样式居中 */
            text-align: center;
            /* 设置外边框 上为100高度 下为20高度 左右自适应 */
            margin: 100px 20px auto;
        }

        p {
            /* 使p标签中的文字样式居中 */
            text-align: center;
            color: darkgray;
            /* 设置外边框 */
            /* 设置外边框 上为20高度 下为20高度 左右自适应 */
            margin: 20px 20px auto;
        }

6.5.设置背景图片,及整体高度 宽度 100% 即跟随浏览器大小的变化而变化。

html body {
            width: 100%;
            background-image: url("背景.png");
            /* 图片全覆盖且不重复 */
            background-repeat: no-repeat;
            background-size: cover;
            height: 100%;
        }

7. 接下来用到 JavaScript 进行行为交互。

 <script>
        //querySelector('选择器字符串')  api
        //获取选择器元素
        let body = document.querySelector('body');
        //获取input选择器元素
        let inputs = document.querySelectorAll('input');
        //获取提交选择器元素
        let submit = document.querySelector('#submit');

        //点击提交操作
        submit.onclick = function () {

            //获取输入框里的信息
            let a = inputs[0].value;
            let b = inputs[1].value;
            let c = inputs[2].value;

            //三个输入框右空时,
            if(a=='' || b=='' || c=='') {
                //提示内容不能为空
                alert("内容不能为空");
                return;
            }

            /* 构造新的div 即目的是将留言设置在新的构造的div标签中,并加入到目前页面中呈现*/
            let newDiv = document.createElement('div');

            //为新构造的div标签起个类名
            newDiv.className = 'rows';

            //获取时间
            let myDate = new Date();
            let myTime=myDate.toLocaleString( );

            //设置新构造的div标签的内容
            newDiv.innerHTML = a + '对' + b + '说' + c +'  '+ myTime;

            //将新的div标签加入到当前页面HTML中
            body.appendChild(newDiv);

            //提交成功后输入框清空效果
            for(let input of inputs) {
                input.value = '';
            }

            //撤销按钮 为了区分两个按钮元素 可以设置类名或ID名 再写类选择器 或 ID选择器 再调用
            //获取撤销选择器元素  #revoke ID选择器
            let revoke = document.querySelector('#revoke');

            //点击撤销后的动作
            revoke.onclick = function () {
                //获取所有新添加的DIV,因为上面设置了类名,所以这里获取类名
                let rev = document.querySelectorAll('.rows');
                if(rev==null || rev.length==0) {
                    return;
                }
                //删除最新添加的div
                body.removeChild(rev[rev.length-1]);
            }

        }

    </script>

8.完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>留言墙</title>
    <style>
        /* 各种选择器 类选择器 ID选择器 伪类选择器 后代选择器 子选择器 并集选择器 */
        html body {
            width: 100%;
            background-image: url("背景.png");
            background-repeat: no-repeat;
            background-size: cover;
            height: 100%;
        }

        /* *通配符 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        h1 {
            /* 使h1标签中的文字样式居中 */
            text-align: center;
            /* 设置外边框 上为100高度 下为20高度 左右自适应 */
            margin: 100px 20px auto;
        }

        p {
            /* 使p标签中的文字样式居中 */
            text-align: center;
            color: darkgray;
            /* 设置外边框 */
            /* 设置外边框 上为20高度 下为20高度 左右自适应 */
            margin: 20px 20px auto;
        }

        div {
            /* 开启弹性布局 */
            display: flex;
            /* 设置元素水平方向排列问题 居中排列 */
            justify-content: center;
            /* 设置每个div标签中元素外边框距离 即元素与元素之间的距离 */
            /* 15px auto 意思为 该元素的上下外边框为15像素 左右自适应排布 */
            margin: 15px auto;
        }

        span {
            /* 设置宽度 */
            width: 100px;
            /* 设置高度 */
            height: 25px;
        }

        input {
            /* 宽度 */
            width: 200px;
            /* 设置高度 */
            height: 25px;
            /* 消除输入框黑框 */
            outline: none;
            /* 光标位置 */
            padding-left: 5px ;
        }

        button {
            /* 文字颜色 */
            color: white;

            /* 背景颜色 */
            background-color: orange;

            /* 按钮宽度 */
            width: 300px;

            /* 边框颜色 去掉黑边框 */
            border: none;

            /* 设置按钮高度 */
            height: 30px;
        }

        /* 伪类选择器 设置按钮按下时的变化 */
        button:active {
            background-color: darkorange;
        }

    </style>
</head>
<body>

    <h1>留言墙</h1>
    <p>输入内容后,点击提交即可</p>

    <div>
        <span>谁:</span>
        <input type="text">
    </div>
    <div>
        <span>对谁:</span>
        <input type="text">
    </div>
    <div>
        <span>说:</span>
        <input type="text">
    </div>
    <div>
        <button id="submit">提交</button>
    </div>
    <div>
        <button id="revoke">撤销</button>
    </div>

    <script>
        //querySelector('选择器字符串')  api
        //获取选择器元素
        let body = document.querySelector('body');
        //获取input选择器元素
        let inputs = document.querySelectorAll('input');
        //获取提交选择器元素
        let submit = document.querySelector('#submit');

        //点击提交操作
        submit.onclick = function () {

            //获取输入框里的信息
            let a = inputs[0].value;
            let b = inputs[1].value;
            let c = inputs[2].value;

            //三个输入框右空时,
            if(a=='' || b=='' || c=='') {
                //提示内容不能为空
                alert("内容不能为空");
                return;
            }

            /* 构造新的div 即目的是将留言设置在新的构造的div标签中,并加入到目前页面中呈现*/
            let newDiv = document.createElement('div');

            //为新构造的div标签起个类名
            newDiv.className = 'rows';

            //获取时间
            let myDate = new Date();
            let myTime=myDate.toLocaleString( );

            //设置新构造的div标签的内容
            newDiv.innerHTML = a + '对' + b + '说' + c +'  '+ myTime;

            //将新的div标签加入到当前页面HTML中
            body.appendChild(newDiv);

            //提交成功后输入框清空效果
            for(let input of inputs) {
                input.value = '';
            }

            //撤销按钮 为了区分两个按钮元素 可以设置类名或ID名 再写类选择器 或 ID选择器 再调用
            //获取撤销选择器元素  #revoke ID选择器
            let revoke = document.querySelector('#revoke');

            //点击撤销后的动作
            revoke.onclick = function () {
                //获取所有新添加的DIV,因为上面设置了类名,所以这里获取类名
                let rev = document.querySelectorAll('.rows');
                if(rev==null || rev.length==0) {
                    return;
                }
                //删除最新添加的div
                body.removeChild(rev[rev.length-1]);
            }

        }

    </script>



</body>
</html>

                                              

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国庆中秋特辑(六)大学生常见30道宝藏编程面试题

以下是 30 道大学生 Java 面试常见编程面试题和答案&#xff0c;包含完整代码&#xff1a; 什么是 Java 中的 main 方法&#xff1f; 答&#xff1a;main 方法是 Java 程序的入口点。它是一个特殊的方法&#xff0c;不需要被声明。当 Java 运行时系统执行一个 Java 程序时&…

C++ 程序员入门之路——旅程的起点与挑战

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Java中过滤器和拦截器的区别、作用、使用场景

在Java中&#xff0c;过滤器&#xff08;Filters&#xff09;和拦截器&#xff08;Interceptors&#xff09;都是用于在应用程序中实现请求和响应处理逻辑的关键组件&#xff0c;但它们在功能、作用和使用场景上有一些区别。以下是它们的详细解释&#xff1a; 过滤器&#xff…

通过ElementUi在Vue搭建的项目中实现CRUD

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Vue》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专栏…

Java的一些常见类【万字介绍】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;输入输出Scanner类输出输出…

【AI视野·今日NLP 自然语言处理论文速览 第四十六期】Tue, 3 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 3 Oct 2023 (showing first 100 of 110 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Its MBR All the Way Down: Modern Generation Techniques Through the …

excel提取单元格中的数字

excel取单元格中的数字excel取出单元格中的数字快速提取单元格中有文本的数字如何提取文本左侧的数字、文本右侧的数字、文本中的数字以及文本中混合的数字 RIGHT(C2,11)从右边开始在C2单元格中取出11位字符 LEFT(C2,2)&#xff0c;引用获取单元格总长度的函数LEN&#xff0c;…

简化数据库操作:探索 Gorm 的约定优于配置原则

文章目录 使用 ID 作为主键数据库表名TableName临时指定表名列名时间戳自动填充CreatedAtUpdatedAt时间戳类型Gorm 采用约定优于配置的原则,提供了一些默认的命名规则和行为,简化开发者的操作。 使用 ID 作为主键 默认情况下,GORM 会使用 ID 作为表的主键: type User st…

java Spring Boot 手动启动热部署

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂&#xff0c;重启是一件非常麻烦的事 或者你在和前端同事联调&#xff0c;有一点小问题 你改完就要重启 前端还得等你&#xff0c;非常不友好 那…

【AI视野·今日CV 计算机视觉论文速览 第259期】Tue, 3 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Tue, 3 Oct 2023 (showing first 100 of 167 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers GPT-Driver: Learning to Drive with GPT Authors Jiageng Mao, Yuxi Qian, Hang Zha…

VBA技术资料MF65:将十六进制值转换为RGB颜色代码

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

网络基础入门(网络基础概念详解)

本篇文章主要是对网络初学的概念进行解释&#xff0c;可以让你对网络有一个大概整体的认知。 文章目录 一、简单认识网络 1、1 什么是网络 1、2 网络分类 二、网络模型 2、1OSI七层模型 2、1、1 简单认识协议 2、1、2 OSI七层模型解释 2、2 TCP/IP五层(或四层)模型 三、网络传…

学籍管理系统【IO流+GUI】(Java课设)

系统类型 【IO流GUI】系统 &#xff08;通过IO流把数据存储到文本里面&#xff0c;不存数据库中&#xff0c;GUI就是窗口&#xff0c;图形化界面&#xff09; 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Idea或eclipse 运行效果 本…

你写过的最蠢的代码是?——后端篇

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

java图书信息管理

一、项目概述 本图书信息管理系统旨在提供一个直观的用户界面&#xff0c;用于管理图书馆或书店的图书信息。系统包括图书添加、查询、借阅和归还等功能。 二、系统架构 系统采用JavaSwing作为前端UI框架&#xff0c;后端使用Java Servlet处理业务逻辑&#xff0c;数据存储在…

你写过的最蠢的代码是?——全栈开发篇

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【题解 动态规划】 Colored Rectangles

题目描述&#xff1a; 分析&#xff1a; 乍一看我还以为是贪心&#xff01; 猫 想想感觉没问题 但是局部最优并不能保证全局最优 比如这组数据 19 19 19 19 20 20 20 20如果按照贪心的做法&#xff0c;答案是20*20*2 但是其实答案是19*20*4 因此这道题用贪心是不对的 于是我…

Autowired和Resource的关系

相同点对于下面的代码来说&#xff0c;如果是Spring容器的话&#xff0c;两个注解的功能基本是等价的&#xff0c;他们都可以将bean注入到对应的field中 不同点但是请注意&#xff0c;这里说的是基本相同&#xff0c;说明还是有一些不同点的&#xff1a; byName和byType匹配顺…

二十八、高级IO与多路转接之select

文章目录 一、五种IO模型&#xff08;一&#xff09;阻塞IO:&#xff08;二&#xff09;非阻塞IO:&#xff08;三&#xff09;信号驱动IO:&#xff08;四&#xff09;IO多路转接:&#xff08;五&#xff09;异步IO: 二、高级IO重要概念&#xff08;一&#xff09;同步通信 vs 异…

<C++>类和对象-下

目录 一、构造函数的初始化 1. 构造函数体赋值 2. 初始化列表 2.1 概念 2.2 隐式类型转换式构造 2.3 explicit关键字 二、static静态成员 1. 概念 2. 特性 三、友元 1. 友元函数 2.友元类 四、内部类 1. 概念 五、匿名对象 1. const引用匿名对象 2. 匿名对象的隐式类型转换 总…