html+js+css实现拖拽式便签留言

前些日子在网上冲浪时,看到一个便签式留言墙,让人耳目一新。心想这个看着不错,额想要。于是便开始搜寻是否有相应开源插件,想将其引入自己的博客中。但是搜寻了一圈,都没有符合预期的,要么功能不符合。有的功能符合,样式差强人意。我想两者结合一下就好了~于是乎,我开始自己动手,先整理一个独立的html留言版页面来试试效果。

1.便签效果图

功夫不负有心人,最终实现效果如图:

 怎么样,是不是一眼就喜欢上了,纯js版出来了,后面要引入到博客中也简单了。最近lz一直在建设自己的博客,也了解了一些开源的博客框架,诸如Hexo、WordPress、VuePress、Hugo、Solo、Halo。

        lz用的博客用的typecho框架,选择的主题是jasmine,这个主题是比较朴素的,功能很少,很干净。这正是lz所看重的,同时也是遗憾的点,太过于简洁以致于百废待兴。要“装饰”的地方很多,不过这种一点点从无到有的感觉也挺让人充满成就感的。因此最近一直在“装饰”博客。后面有时间lz会整理一个关于博客装修的系列博文说明。

2.单html源码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        #messagewall {
            margin: 0 auto;
            width: 960px;
            background: url(https://ktcry.cn/blog/messbg.png);
            background-size: cover;
            height: 627px;
            position: relative;
        }

        #messagewall .tip1, #messagewall .tip2, #messagewall .tip3, #messagewall .tip4, #messagewall .tip5, #messagewall .tip6, #messagewall .tip7, #messagewall .tip8 {
            position: absolute;
            width: 227px;
            left: 200px;
            top: 100px;
            background: rgb(187, 78, 117);
            box-shadow: 0 2px 10px 1px rgba(0,0,0,0.2);
            opacity: 0.88;
            border-radius: 400px 20px 30px 30px / 40px 400px 500px 300px;
        }

        #messagewall .tip1 .tip_h, #messagewall .tip2 .tip_h, #messagewall .tip3 .tip_h, #messagewall .tip4 .tip_h, #messagewall .tip5 .tip_h, #messagewall .tip6 .tip_h, #messagewall .tip7 .tip_h, #messagewall .tip8 .tip_h {
            width: 207px;
            padding: 10px 10px 5px;
            height: 23px;
            text-align: left;
            cursor: move;
            color: #fff;
            border-bottom: 1px dashed rgba(255,255,255,0.85);
            font-size: 15px;
        }

        #messagewall .tip1 .tip_c, #messagewall .tip2 .tip_c, #messagewall .tip3 .tip_c, #messagewall .tip4 .tip_c, #messagewall .tip5 .tip_c, #messagewall .tip6 .tip_c, #messagewall .tip7 .tip_c, #messagewall .tip8 .tip_c {
            width: 200px;
            padding-top: 20px;
            padding-left: 15px;
            padding-right: 15px;
            min-height: 40px;
            color: #fff;
            font-size: 14px;
            text-align: left;
            line-height: 20px;
            max-height: 160px;
            word-wrap: break-word;
            word-break: break-all;
            overflow: hidden;
        }

        #messagewall .tip1 .tip_f, #messagewall .tip2 .tip_f, #messagewall .tip3 .tip_f, #messagewall .tip4 .tip_f, #messagewall .tip5 .tip_f, #messagewall .tip6 .tip_f, #messagewall .tip7 .tip_f, #messagewall .tip8 .tip_f {
            width: 227px;
            height: 53px;
            padding-top: 20px;
        }
        .clr {
            clear: both;
            overflow: auto;
            display: block;
            height: 0px;
        }
        #messagewall .icon {
            float: left;
            width: 35px;
            padding-left: 15px;
            height: 35px;
            text-align: center;
        }
        #messagewall .name {
            float: right;
            padding-right: 15px;
            text-align: right;
            font-size: 14px;
            line-height: 35px;
            color: #C0F;
        }
        #messagewall .num {
            float: left;
            padding-left: 7px;
            width: 195px;
        }
    </style>
</head>
<body>
    <p style="text-align: center;">
        <strong><span style="font-size: 20px;">为你停留,因你回首</span></strong>
    </p>
    <p style="text-align: center;">
        你站在桥上看风景,看风景的人却在楼上看你。 明月装饰了你的房子,你装饰了我的梦。
    </p>
    <!--纸条墙-->
    <div id="messagewall">
        
    </div>
    <!-- 悬浮播放器:https://musicplayer.xfyun.club/ -->
    <div id="xf-MusicPlayer" data-cdnName="https://player.xfyun.club/js"  data-memory="1"></div>
    <script src="https://player.xfyun.club/js/xf-MusicPlayer/js/xf-MusicPlayer.min.js"></script>
    <script src="https://player.xfyun.club/js/yinghua.js"></script>
<script>
    //模拟数据库,获取信息
    var messages = [
            {"id":1,"name":"mahu","content":"今天你拿苹果支付了么","time":"2024-06-17"},
            {"id":2,"name":"haha","content":"今天天气不错,风和日丽的","time":"2024-06-18"},
            {"id":3,"name":"jjjj","content":"常要说的事儿是乐生于苦","time":"2016-03-18"},
            {"id":4,"name":"9.8的妹纸","content":"把朋友家厕所拉堵了 不敢出去 掏了半小时了都","time":"2016-03-18"},
            {"id":5,"name":"雷锋ii.","content":"元宵节快乐","time":"2024-06-22"},
            {"id":6,"name":"哎呦哥哥.","content":"据说今晚央视的元宵晚会导演和春晚导演是同一个人,真是躲得过初一,躲不过十五。","time":"2024-06-22"},
            {"id":7,"name":"没猴哥,不春晚","content":"班主任:“小明,你都十二岁了,还是三年级,不觉得羞愧吗”?。小明:“一点也不觉得,老师你都四十多岁了,不也是年年在三年级混日子吗?羞愧的应该是你”。老师:……","time":"2024-06-22"},
            {"id":8,"name":"哎呦杰杰.","content":"真搞不懂你们地球人,月亮有什么好看的,全是坑,还是对面那哥们好看,","time":"2024-06-22"},
            {"id":9,"name":"哎呦哎呦","content":"今天哪里的烟花最好看!!?答:朋友圈。。。","time":"2024-06-22"}
        ];

    //需求1:模拟数据库获取信息,然后在页面上生成数组的长度个tip,然后分别问起内容进行修改。
    //需求2:点击内容,提高层级;点击关闭按钮,删除tip标签;双击顶部,删除标签.....

    //需求1:模拟数据库获取信息,然后在页面上生成数组的长度个tip,然后分别问起内容进行修改。
    //步骤:
    //获取相关元素
        var content = document.getElementById("messagewall");
        var containerWidth = content.offsetWidth;  //获取容器位置,限制便签生成位置在容器内
        var containerHeight = content.offsetHeight;
        //循环生成div标签,然后为innerHTML属性添加内容
        for(var i=0;i<messages.length;i++){
            //生成新标签
            var newDiv = document.createElement("div");
            //绑定类名和ID
            newDiv.className = "tip1 draggable";
            newDiv.id = "tip"+messages[i].id;
            //改变位置
            var topValue = parseInt(Math.random()*(containerHeight-250));
            var leftValue = parseInt(Math.random()*(containerWidth-250));
            newDiv.style.top = topValue+"px";
            newDiv.style.left = leftValue+"px";
            //赋值内容
            newDiv.innerHTML = '<div class="tip_h" title="双击关闭纸条">'+
                                        '<div class="num">'+messages[i].time+'</div>'+
                                        '<div class="clr"></div>'+
                                '</div>'+
                                '<div class="tip_c">'+
                                    messages[i].content+
                                 '</div>'+
                                '<div class="tip_f">'+
                                    '<div class="icon">'+
                                    '<img src="https://cravatar.cn/avatar/00c96b1072831e92d1ab6ffd361a0b94?d=mm&s=35" alt="" title="">'+
                                '</div>'+
                                '<div class="name">'+messages[i].name+'</div>'+
                                    '<div class="clr"></div>'+
                                '</div>';
            //把新创建的元素放入content里面
            content.appendChild(newDiv);
            //随机背景色
            var elements = document.querySelectorAll('.tip1');
            const colors = ['#F8D800', '#0396FF', '#EA5455', '#7367F0', '#32CCBC', '#F6416C', '#28C76F', '#9F44D3', '#F55555', '#736EFE', '#E96D71', '#DE4313', '#D939CD', '#4C83FF', '#F072B6', '#C346C2', '#5961F9', '#FD6585', '#465EFB', '#FFC600', '#FA742B', '#5151E5', '#BB4E75', '#FF52E5', '#49C628', '#00EAFF', '#F067B4', '#F067B4', '#ff9a9e', '#00f2fe', '#4facfe', '#f093fb', '#6fa3ef', '#bc99c4', '#46c47c', '#f9bb3c', '#e8583d', '#f68e5f'];
            const random = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
            // 为每个元素生成随机 RGB 背景色
            elements.forEach(function(el) {
                // 生成随机 RGB 值
                const background = colors[random(0, colors.length - 1)];
                // 应用样式
                el.style.backgroundColor = background;
            })
            //绑定事件,提高层级
            //newDiv.onclick = fn;

            //双击关闭按钮类名叫做tip_h
            var dbDiv = newDiv.getElementsByClassName("tip_h")[0];
            dbDiv.ondblclick = function () {
                //不能用newDiv,因为在页面加载的时候newDiv,已经变成最后一个了,当你点击的时候,用远关闭的是最后的那个div。
                //content.removeChild(newDiv);
                content.removeChild(this.parentNode);
            }

        }

        var index = 1;
        function fn(){
            this.style.zIndex = index;
            index++;
        }
    // 如果你有多个.draggable元素
    // 首先获取所有的拖拽元素
    var draggableElems = document.querySelectorAll('.draggable');
    // 设置一个数组用来存放初始化后的所有拖拽元素
    var draggies = []
    // 初始化
    for ( var i=0, len = draggableElems.length; i < len; i++ ) {
    var draggableElem = draggableElems[i];
    var draggie = new Draggabilly( draggableElem, {
        containment:'#messagewall'
    });
    // 设置拖拽开始时的事件处理函数
    draggie.on('dragStart', function() {
        this.element.style.zIndex = index++;
    });
    draggies.push( draggie );
    }
</script>

</html>

3.小结

        还是老规矩,直接单文件,拿来即用。了解我的人都知道,我是一个“懒人”。能凑一块发出来的,并不细分。方便你我他。另外,该便签留言效果已引入博客中,也欢迎各种有识之士来访留言,多多交流,下面附上博客地址:

流情无水的博客

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

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

相关文章

前端 call、bind、apply的实际使用

目录 一、call 1、继承的子类可以使用父类的方法 2、可以接收任意参数 二、call、apply、bind比较 1、案例一 2、案例二 三、总结 这个三个方法都是改变函数的this指向的方法。 一、call 1、继承的子类可以使用父类的方法 function Animal(){//this 指向小catthis.eat…

【C++笔记】C++三大特性之继承

【C笔记】C三大特性之继承 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C三大特性之继承前言一.继承的概念及定义1.1 继承的概念1.2继承的定义1.3继承基类成员访问方式的变化1.4继承类模板 二.基类和派生类间的转…

点击文本将内容填入tinymce-vue 富文本编辑器的光标处

富文本编辑器组件 <template><div ref"tinymceBox" class"tinymce-box"><Editor id"myEditor" v-model"contentValue" :init"init" :disabled"disabled" blur"inputBlur" click"o…

智能家居的未来:AI让生活更智能还是更复杂?

内容概要 智能家居的概念源于将各种家居设备连接到互联网&#xff0c;并通过智能技术进行控制和管理。随着人工智能的迅速发展&#xff0c;这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备&#xff0c;智能…

Meta AI 新技术,赋予机器人 “触觉” 的革命

Meta AI 新技术&#xff0c;赋予机器人 “触觉” 的革命 简介 传统机器人的局限 Meta AI 的新技术突破 技术应用前景 未来展望 简介 在科技飞速发展的今天&#xff0c;人工智能领域不断取得令人惊叹的突破。11月4日&#xff0c;Meta公司宣布其基础人工智能研究团队(FAIR)在…

微信小程序配置

1.进入微信小程序公众平台&#xff0c;进入后注册域名 2.项目接口代理 UniApp H5 跨域代理配置并使用&#xff08;配置manifest.json、vue.config.js&#xff09;_uniapp 代理-CSDN博客 我用了方法一 3.测试接口

IEEE JSSC更新|Tiny Tapeout:让每个人都能设计定制芯片

简介 由于成本高昂且需要专业技术&#xff0c;设计和制造定制集成电路的传统上仅限于大型公司和机构。然而&#xff0c;名为Tiny Tapeout的创新项目正在改变这一现状&#xff0c;让业余爱好者、学生和小型团队也能设计定制芯片。本文将探讨Tiny Tapeout的工作原理&#xff0c;以…

ubuntu 22.04 server 安装 anaconda3

ubuntu 22.04 server 安装 anaconda3 https://www.anaconda.com/download/success Anaconda Installers wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh 其他的是 默认 Executing transaction: done installation finished. Do you wish to…

【SpringMVC】基础入门(1)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;什么是Spring Web MVC 1&#xff1a;Servlet 2&#xff1a;总结 二&#xff1a;MVC …

【linux】网络基础 ---- 应用层

1. 再谈 "协议" 协议是一种 "约定"&#xff0c;在读写数据时, 都是按 "字符串" 的方式来发送接收的. 但是这里我们会遇到一些问题&#xff1a; 如何确保从网上读取的数据是否是完整的&#xff0c;区分缓冲区中的由不同客户端发来的数据 2. 网…

Zookeeper运维秘籍:四字命令基础、详解及业务应用全解析

文章目录 一、四字命令基础二、四字命令详解三、四字命令的开启与配置四、结合业务解读四字命令confconsenvi命令Stat命令MNTR命令ruok命令dump命令wchswchp ZooKeeper&#xff0c;作为一款分布式协调服务&#xff0c;提供了丰富的四字命令&#xff08;也称为四字短语&#xff…

MinGW-w64_10.0.0 + GCC12_x86_64-12.2.0-release-posix-seh-msvcrt-rt_v10-rev2.zip

主题&#xff1a;mingw-w64安装 以及 matlab适配mingw-w64&#xff0c;g&#xff0c;gcc 无套路直接下载mingw-w64 for matlab 通过百度网盘分享的文件&#xff1a; MinGW-w64_10.0.0 GCC12_x86_64-12.2.0-release-posix-seh-msvcrt-rt_v10-rev2.zip 链接&#xff1a;https…

SpringCloudalibaba 集成 Knife4j 的时候出现多余的 前缀

这里是在网关 GateWay 中集成的 Knife4j&#xff0c;并且使用的是 Knife4j 服务发现模式 问题 用户服务 接口地址&#xff1a;/api/user/login GateWay 服务 现像 打开 Knife4j 文档中接口地址前缀多了一个 /api/user 解决 参考链接 2.1 Spring Cloud Gateway集成Knife4j …

信息安全工程师(79)网络安全测评概况

一、定义与目的 网络安全测评是指参照一定的标准规范要求&#xff0c;通过一系列的技术、管理方法&#xff0c;获取评估对象的网络安全状况信息&#xff0c;并对其给出相应的网络安全情况综合判定。其对象主要为信息系统的组成要素或信息系统自身。网络安全测评的目的是为了提高…

【Leecode】Leecode刷题之路第46天之全排列

题目出处 46-全排列-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 46-全排列-官方解法 预备知识 回溯法&#xff1a;一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解…

机器学习—选择激活函数

可以为神经网络中的不同神经元选择激活函数&#xff0c;我们将从如何为输出层选择它的一些指导开始&#xff0c;事实证明&#xff0c;取决于目标标签或地面真相标签y是什么&#xff0c;对于输出层的激活函数&#xff0c;将有一个相当自然的选择&#xff0c;然后看看激活函数的选…

97_api_intro_imagerecognition_pdf2word

通用 PDF OCR 到 Word API 数据接口 文件处理&#xff0c;OCR&#xff0c;PDF 高可用图像识别引擎&#xff0c;基于机器学习&#xff0c;超精准识别率。 1. 产品功能 通用识别接口&#xff1b;支持中英文等多语言字符混合识别&#xff1b;formdata 格式 PDF 文件流传参&#xf…

不适合的学习方法

文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述&#xff0c;包括额外的内容和相关公式&…

刷题笔记——栈和队列互相冒充

刷题笔记——栈和队列互相冒充 5.3 用队列实现栈两队列实现栈一个队列实现栈 5.4 用栈实现队列两栈实现队列push栈和pop栈一个栈实现队列 5.3 用队列实现栈 原OJ题&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 两队列实现栈 入栈的实现 选非空的…

Mysql基础 01 数据与sql

文章目录 一、基本概念二、mysql的常用命令三、sql规范四、数据类型五、SQL语句 一、基本概念 数据库(database,DB)&#xff1a;存储数据的仓库。 数据库管理系统软件(Database Management System,DBMS)&#xff1a;是一种操作和管理数据库的大型软件。常见的DBMS有oracle、s…