原生API编写简单富文本编辑器001

news2024/11/15 9:50:39

原生API编写简单富文本编辑器001

从这一节开始,我们将亲自动手,使用我们之前介绍过的浏览器原生API来实现一个简单的可以处理文本的富文本编辑器。

1. 设计

这一个简单版的编辑器,由于我们是基于原生的API,基于浏览器原生API的能力,我们将实现以下功能:

  • 文字输入

  • 文字格式调整

    • 加粗
    • 斜体
    • 下划线
    • 删除线
    • 前景色
    • 背景色
    • 改变字号
    • 改变字体
    • 上角标
    • 下角标
  • 段落格式调整

    • 清除格式
    • 首行缩进
    • 段落居左对齐
    • 段落居右对齐
    • 段落居中对齐
    • 段落两端对齐
    • 插入有序列表
    • 插入无序列表
  • 其它

    • 插入超链接
    • 取消超链接
    • 插入网络图片
    • 拷贝
    • 剪切
    • 撤销
    • 重做

2. 图标准备

通常,当用户使用富文本编辑器时,都希望点击一个按钮来实现某种功能,而传统的按钮太过丑陋,所以我们为其准备一个按钮图标。

这里,我们使用iconfont.cn 上提供的免费图标。

我们可以进入iconfont 官网,登陆后,新建一个项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktRo8kIW-1670512094428)(https://gitee.com/hjb2722404/tuchuang/raw/master/img/202203101510248.png)]

然后根据功能设计,将免费图标先添加到购物车,再导入到项目中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKddQ9G2-1670512094431)(https://gitee.com/hjb2722404/tuchuang/raw/master/img/202203101518863.png)]

3. 编写界面

3.1 初始结构


 ├── index.html
 └── static
     ├── css
     │   ├── iconfont
     │   │   ├── demo.css
     │   │   ├── demo_index.html
     │   │   ├── iconfont.css
     │   │   ├── iconfont.js
     │   │   ├── iconfont.json
     │   │   ├── iconfont.svg
     │   │   ├── iconfont.ttf
     │   │   ├── iconfont.woff
     │   │   └── iconfont.woff2
     │   └── index.css
     └── js
     	 |——index.js

3.2 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>Document</title>
    <link rel="stylesheet" href="./static/css/index.css">
    <link rel="stylesheet" href="./static/css/iconfont/iconfont.css">
    <script src="./static/css/iconfont/iconfont.js"></script>
</head>
<body>
    <div class="editor-box">
        <div class="editor">
            <div id="editorBar" class="editor-toolbar">
                <ul>
                    <li command="undo"><i class="iconfont icon-chexiao" title="撤销"></i></li>
                    <li command="redo"><i class="iconfont icon-zhongzuo" title="重做"></i></li>
                    <li command="copy"><i class="iconfont icon-fuzhi" title="复制"></i></li>
                    <li command="cut"><i class="iconfont icon-jianqie" title="剪切"></i></li>
                    <li command="fontName"><i class="iconfont icon-ziti" title="字体"></i></li>
                    <li command="fontSize"><i class="iconfont icon-zihao" title="字号"></i></li>
                    <li command="Bold"><i class="iconfont icon-zitijiacu" title="加粗"></i></li>
                    <li command="italic"><i class="iconfont icon-zitixieti" title="斜体"></i></li>
                    <li command="underline"><i class="iconfont icon-zitixiahuaxian" title="下划线"></i></li>
                    <li command="strikeThrough"><i class="iconfont icon-zitishanchuxian" title="删除线"></i></li>
                    <li command="superscript"><i class="iconfont icon-zitishangbiao" title="上标"></i></li>
                    <li command="subscript"><i class="iconfont icon-zitixiabiao" title="下标"></i></li>
                    <li command="fontColor"><i class="iconfont icon-qianjingse" title="字体颜色"></i></li>
                    <li command="backColor"><i class="iconfont icon-zitibeijingse" title="字体背景色"></i></li>
                    <li command="removeFormat"><i class="iconfont icon-qingchugeshi" title="清除格式"></i></li>
                    <li command="insertOrderedList"><i class="iconfont icon-youxuliebiao" title="有序列表"></i></li>
                    <li command="insertUnorderedList"><i class="iconfont icon-wuxuliebiao" title="无序列表"></i></li>
                    <li command="justifyLeft"><i class="iconfont icon-juzuoduiqi" title="局左对齐"></i></li>
                    <li command="justifyRight"><i class="iconfont icon-juyouduiqi" title="居右对齐"></i></li>
                    <li command="justifyCenter"><i class="iconfont icon-juzhongduiqi" title="居中对齐"></i></li>
                    <li command="justifyFull"><i class="iconfont icon-liangduanduiqi" title="两端对齐"></i></li>
                    <li command="createLink"><i class="iconfont icon-charulianjie" title="插入链接"></i></li>
                    <li command="unlink"><i class="iconfont icon-quxiaolianjie" title="取消链接"></i></li>
                    <li command="indent"><i class="iconfont icon-shouhangsuojin" title="首行缩进"></i></li>
                    <li command="insertImage"><i class="iconfont icon-tupian" title="插入图片"></i></li>
                </ul>
            </div>
            <div id="editor-content" class="editor-content" contenteditable></div>
        </div>
    </div>
</body>
<script src="./static/js/index.js"></script>
</html>


注意

我们这里为每一个按钮所在 li 元素添加了command 属性,这个属性就是当点击该按钮时需要传递给

document.execCommand(command); 命令的命令名称参数。

3.3 css

.editor-box {
    width: 960px;
    margin: auto;
}

.editor {
    width: 100%;
    margin-top: 50px;
    height: 600px;
    border: 1px solid #ccc;
}

.editor-toolbar {
    width: 100%;
    border-bottom: 1px dotted #555;
}

.editor-toolbar ul {
    list-style: none;
}

.editor-toolbar ul li {
    width: 20px;
    height: 20px;
    line-height: 20px;
    display: inline-block;
    cursor: pointer;
    margin-left: 10px;
}
.editor-toolbar ul li .iconfont {
    font-size: 16px;
}
.editor-content {
    margin-top: 20px;
    height: 500px;
    overflow: auto;
    padding: 0 25px;
}


3.4 界面效果

在这里插入图片描述

好了,我们写好了界面,下一节,我们将实现编辑器功能。

本系列文章代码可从gitee获取

(本节内容对应代码可在1.0.1 分支找到)

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

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

相关文章

线性表-双向链表

双向链表 双向链表也叫双向表&#xff0c;是链表的一种&#xff0c;它由多个结点组成&#xff0c;每个结点都由一个数据域和两个指针域组成&#xff0c;数据域用来存储数据&#xff0c;其中一个指针域用来指向其后继结点&#xff0c;另一个指针域用来指向前驱结点。链表的头结…

手动实现SpringBoot日志链路追踪

概述 有时候一个业务调用链场景&#xff0c;很长&#xff0c;调了各种各样的方法&#xff0c;看日志的时候&#xff0c;各个接口的日志穿插&#xff0c;确实让人头大。 模糊匹配搜索日志能解决吗&#xff1f;能解决一点点。但是不能完全呈现出整个链路相关的日志。 那要做到方…

致迷茫的程序员一封信——我的程序生涯

0、开头 大家好&#xff0c;我是罗鹏程&#xff0c;一个很老套的开头&#xff0c;哈哈哈。 这封信姗姗来迟&#xff0c;与其说是一封信&#xff0c;不如说是来听听我的故事。从2020开始&#xff0c;收到过很多网友的问题&#xff0c;职业的选择&#xff0c;是做大数据还…

Intellij Idea生成含有META-INF的jar包

新建一个module&#xff0c;如果不会新建的话&#xff0c;参考&#xff1a;Intellij Idea新建module。命名为jar_test。 新建一个java类DateUtil&#xff0c;可以输出当前时间对应的是星期几。代码如下&#xff1a; import java.util.Calendar; import java.util.Date;publi…

编译原理 1 - 概述、形式语言

第1章 引论一些概念1.3 编译程序的总体结构1.4 编译程序的组织第二章 形式语言2.1 文法描述中的基本概念上下文无关文法第1章 引论 一些概念 机器语言&#xff1a;以0、1代码表示的机器指令所构成的语言 每一个具体的计算机系统都具有自己的指令系统 汇编语言&#xff1a;用助…

shiro

概述 shiro是什么 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 为…

批量数据导入Neo4j的方式

批量数据导入Neo4j的方式 文章目录批量数据导入Neo4j的方式1、写在前面2、前置芝士3、CSV数据导入Neo4j3.1 LOAD CSV Cypher命令3.2 neo4j-admin命令3.3 Kettle导入工具4、数据导入失败5、参考资料1、写在前面 Linux版本&#xff1a;Ubuntu Kylin 16.04Neo4j版本&#xff1a;N…

分布式微服务架构下网络通信的底层实现原理

在分布式架构中&#xff0c;网络通信是底层基础&#xff0c;没有网络&#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作&#xff0c;共同完成一件事情。 同样&#xff0c;在大规模的系统架构中&#xff0c;应用吞吐量上不去、网络存在通信延迟、…

图的遍历(基础)

一、图的遍历的相关定义 遍历的定义&#xff1a;从已给的连通图中的某一顶点出发&#xff0c;沿着一些边访遍图中的所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫做图的遍历&#xff0c;它是图的基本运算。遍历的实质&#xff1a;找每个邻接点的过程。图的特…

跌倒自动检测雷达的应用

跌倒是老人最常发生的意外之一&#xff0c;据统计&#xff0c;我国每年有150多万老人跌倒身亡。如何及时发现和预防老人跌倒以及避免可能发生的伤害事件&#xff0c;已成为目前社会关注的热点。美国加州大学伯克利分校研究人员研发出一种可穿戴设备——跌倒自动检测雷达&#x…

大规模MIMO通信系统的发射端采用混合波束成形附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

阅读笔记 DAGA 低资源标记任务数据扩充方法

阅读笔记 DAGA 低资源标记任务数据扩充方法 文章目录阅读笔记 DAGA 低资源标记任务数据扩充方法前言概述IntroductionBackground1、NER2、Part-of-Speech (POS) Tagging3、Target Based Sentiment AnalysisProposed Method1、Labeled Sentence Linearization2、Language Modeli…

c#入门-命名参数

位置参数 在你填入实参时&#xff0c;你填入的类型和顺序都需要和形参相同。 因为默认情况下&#xff0c;他是按照从左到右的顺序依次填入实参的。 命名参数 你在声明参数时给变量声明的名字是有用的。 在填入实参时&#xff0c;可以加上名字&#xff0c;以指定你填入的是哪…

触觉智能分享-低成本高性能的厨电解决方案

每个热爱生活的人&#xff0c;一日三餐四季&#xff0c;柴米油盐这点小事&#xff0c;都值得去享受&#xff0c;可如何学会做一顿美味可口的饭菜&#xff0c;对厨房小白来说可不是易事&#xff0c;智能菜谱的出现&#xff0c;将做菜的烹饪过程进行了分步拆解&#xff0c;同时将…

基于STM32波形信号发生器proteus仿真设计(仿真+程序+报告+讲解)

基于STM32波形信号发生器proteus仿真设计(仿真程序报告讲解&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0075 讲解仿真视频&#xff1a; 基于STM32的波形信号发生器proteus仿真设计主要功能&#xff1a…

nessus无法导出报告(nessus转中文报告)

nessus漏扫报告&#xff0c;可是nessus导出的报告全是英文&#xff0c;客户说看不懂(说的好像中文就能看懂似的)。找了很多nessus转中文报告的工具都不是很靠谱&#xff0c;今天突然灵机一动发现了一个解决nessus无法导出报告方法。总的说来就是生产一个html文件转中文。 ness…

入门系列 - Git安装与配置

Git安装与配置 要使用Git&#xff0c;你必须在你的电脑上安装它。要不要使用并升级到最新的Git&#xff0c;那取决您的需要了。 下载Git 要下载Git安装程序&#xff0c;请访问Git的官方网站并进入下载页面。本文写于2022-11-29&#xff0c;此时您可以去官网链接去下载&#…

AI教你学测试

ChatGPT这个词相信大家最近看到都不会陌生&#xff0c;应该刷爆了各位的朋友圈&#xff0c;各种分享注册教程、什么AI写代码的文章比比皆是&#xff0c;今天&#xff0c;让我们一起来看一下OpenAI能不能教我们学测试呢&#xff0c;对测试人员的日常工作是否有帮助呢&#xff1f…

原生API编写简单富文本编辑器004

原生API编写富文本编辑器004 遗留的问题&#xff1a; 设置的字体是使用 font属性&#xff0c;而非CSS设置的字号只接受1-7, 并且是以 size 属性而非 CSS控制&#xff0c;超出大小无法设置。color使用HTML的input时&#xff0c;始终有一个input框在那里&#xff0c;并且如果手…

Oracle项目业务表单设计:Oracle PrimaveraUnifier BP

目录 基本介绍 Basic Introduction 业务流程组件 Business Process Components 数据定义 Data Definitions 数据要素 Data Elements 状态 Status 表单 Forms 工作流程 &#xff08;可选&#xff09;Workflow 日志 Log 上部表单 Upper Form 详细表单 Detail Form 行项…