为了提高 前端开发 效率, 笔者先后写了上百个前端工具, 有些是给公司内部使用的, 有些单纯是因为自己太“”, 不想写代码, 所以才“被迫”做的. 接下来介绍的一款工具——css三角形生成器也是因为之前想要解放设计师的生产力, 自己又懒得切图或者写css代码, 所以想来想去还是自己做一个能自动生成css三角形代码的工具吧.

接下来笔者就来带大家介绍一下这个工具的用途和实现方案, 方便大家后续可以扩展出更多的“懒人工具”.

在线css三角形生成器预览

由预览动画我们可以看到通过在线工具我们可以轻松配置各种想要的三角形, 并且能实时查看css代码. 开发完这个工具之后笔者再也不用担心还需要手写三角形代码了. (上班摸鱼也成了可能, 确实很多时候就是不想写代码还想要有钱拿) 在文末笔者会附上css工具的在线地址, 接下来我们来看看具体实现流程.

实现css三角形生成器

因为这个工具的需求来自于前端, 所以肯定是要对cssjs编程有一定的基础, 比如css3的 transform, transition, 布局, 盒模型, border边界特性等.

和笔者之前写的任何一个开源工具一样, 在开发项目前一定要明确需求和目标, 这里笔者简单整理一下需求:

  • 生成任何大小的三角形(size)
  • 生成不同位置的三角形(direction)
  • 生成不同角度的三角形(rotate)
  • 生成不同背景色的三角形(color, 其实这个实不实现无所谓, 主要是笔者连这个代码都懒的写)

了解需求之后我们可以大致画一个简单的原型图来代表我们的css生成器界面, 如下:

有了原型图, 我们可以得到如下的任务细分图:

这里笔者要提的一点是其实以上流程对于任何项目都适用, 包括你遇到的难解的问题, 都可以一步步把思路先理清楚, 把大目标拆解为一块块的小目标, 然后逐个击破, 这样大难题也就解决了.

接下来我们先分析一下用css实现三角形的原理.

1.css画三角形的原理

其实笔者在之前的文章中也分享过3种以上的使用css实现三角形的方案, 这里笔者介绍一个通用的方法, 也就是用border来实现三角形, 我们先来看下面的图示: 以上是展示了当box元素的width小于自身border宽度时的样子以及当box宽度为零而border-width不为零时的样子. 通过图形一分析是不是很容易联想到如果我只要一个边有颜色,其他都为透明面是不是就能变成三角形了呢?

的确也是这么实现的, 知道这个原理之后我们来继续往下实现所见即所得的“三角形”.

2.编辑器实现

编辑器实现也是前端老生长谈的话题了, 笔者在H5-Dooring项目中写过一个非常复杂的编辑器, 但是这里我们只要需要一个静态且简单的编辑器就够了. 如下图的界面:

我们可以用任何我们擅长的框架和组件库来实现, 比如·vue3+ element plus, react + antd4.0, 笔者这里采用react方案实现, 颜色选择器采用社区比较有名的react-color.

编辑器界面的代码笔者就不一一介绍了, 相信大家都能实现, 我们这里来说一下样式数据共享逻辑:

我们要想保证预览区域和css代码预览区域能随表单值变化而实时变化, 这里一定要将表单数据共享出来, 我们可以用react组件的state或者vuevuex(虽然不用vuex也可以将data提升)来共享状态.

3. 预览区域实现

预览区域实现其实有了以上的分析其实很好实现了, 只需要利用共享的form数据来绑定到三角形元素的样式上即可. 画布的北背景这里笔者也是用css实现的, 如下图:

感兴趣可以cv一下, 这代码如下:

.previewArea {display: inline-block;width: 360px;height: 360px;background: #eee;background-image: linear-gradient(45deg,rgba(0,0,0,.2) 25%, transparent 0, transparent 75%, rgba(0,0,0,.2) 0),linear-gradient(45deg,rgba(0,0,0,.2) 25%, transparent 0, transparent 75%, rgba(0,0,0,.2) 0);background-size: 30px 30px;background-position: 0 0,15px 15px;
}
复制代码

还有一个比较关键的一点是如何实现切换三角形的方向的问题, 我们都知道切换方向后cssborder的几个方向属性都会变, 比如三角形的方向向上时, 我们的css如下:

{border-width: 0 60px 60px 100px;border-color: transparent transparent #06c transparent;
}
复制代码

三角形的方向向下时, 我们的css如下:

{border-width: 100px 60px 0 60px;border-color: #06c transparent transparent transparent;
}
复制代码

同样左右也是类似的, 所以我们要维护4中样式, 如果后期想加一下左上, 右上, 左下, 右下, 这样代码会非常难以维护(不是if else就是switch, 说实话switch只适合8个条件一下的判断), 所以笔者这里用对象法来解决它, 并将其封装成一个函数:

const getBorderWidthAndColor = (direction:string, w:number, h:number, color:string) => {const borderWidthAndColor:any = {'1': {borderWidth: `0 ${w/2}px ${h}px ${w/2}px`,borderColor:`transparent transparent ${color} transparent`},'2': {borderWidth: `${h}px ${w/2}px 0 ${w/2}px`,borderColor:`${color} transparent transparent transparent`},'3': {borderWidth: `${h/2}px ${w}px ${h/2}px 0`,borderColor:`transparent ${color} transparent transparent`},'4': {borderWidth: `${h/2}px 0 ${h/2}px ${w}px`,borderColor:`transparent transparent transparent ${color}`}}return borderWidthAndColor[direction]}
复制代码

其实属性预览比如宽度, 高度, 背景色这些都好处理, 笔者这里就不一一介绍了. 预览如下:

4. 代码实时展示实现

至于代码实时展示在文本框中, 这个也是很容易实现, 我们只要要把拿到的数据实时展示到文本框里即可. 由于笔者采用的css module 和react方式实现的, 所以需要对css进行额外处理, 比如将对象格式转化为css规范的格式, 所以需要加如下步骤:

JSON.stringify(triangleCss, null, 4).replaceAll(/"/g, '').replaceAll(/,/g, ';')
复制代码

这样, 一个css三角形生成器就做好了, 大家还可以在此基础上继续扩展, 比如支持多边形, 六角形, ⭐五角形等, 也是完全没问题的.

在线体验地址: http://49.234.61.19/tool/cssTriangle
作者:徐小夕

在线css三角形生成器 「干货」相关推荐

  1. 怎样对流媒体进行压力测试_对node工程进行压力测试与性能分析「干货」

    作者:小黎 转发链接:https://mp.weixin.qq.com/s/WBe7ZLoqFD9UqNusnv_IDA 前言 在系统上线前,为了看下系统能承受多大的并发和并发下的负载情况,常常会先进 ...

  2. 「干货」橙留香博客导读:专栏系统分类和博客归纳总结

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 0x01 前言 为了更好地帮助博友同学学习作者同学的博客,方 ...

  3. 用typescript完成倒计时_「干货」将数十万行CoffeeScript代码迁移到TypeScript

    作者 | David Goldstein 译者 | 王强 策划 | 小智 转发链接:https://mp.weixin.qq.com/s/TK7kWXX4hR3e-jtpVMuBnw 序言 2017 ...

  4. 110配线架打法图解_「干货」图文并茂教会你110语音配线架线缆打法

    原标题:「干货」图文并茂教会你110语音配线架线缆打法 110语音配线架是机房工程中常用的语音配线工具,下面我们就来看下110配线架是如何安装的,以安装25对大对数为例. 110语音配线架 (1)将配 ...

  5. 计算机二级的Word知识点,计算机二级word知识点「干货」

    计算机网络的分类与的一般的事物分类方法一样,可以按事物的所具有的不同性质特点即事物的属性分类.yjbys小编下面整理一些计算机二级word知识点,希望大家认真阅读! Word软件考核的重点内容为:正文 ...

  6. 谷歌发布史上最强人类大脑「地图」,在线可视3D神经元「森林」!

    突触,是神经网络的「桥梁」. 我们知道,人类大脑有860亿个神经元,因为有了突触,才可以把神经元上的电信号传递到下一个神经元. 长久以来,科学家们一直梦想通过绘制完整的大脑神经网络的结构,以了解神经系 ...

  7. 「干货」Snort使用手册「详细版」

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 0x01 前言 1.1 IDS是什么? IDS(intrus ...

  8. 谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...

    来源:Google AI Blog 编辑:yaxin, LQ (新智元) 突触,是神经网络的「桥梁」. 我们知道,人类大脑有860亿个神经元,因为有了突触,才可以把神经元上的电信号传递到下一个神经元. ...

  9. 请求失败或服务未及时响应 有关详细信息_「干货」从零开始的微服务搭建之路...

    随着公司的业务发展,有幸经历了从单体应用迁移到分布式应用,又从分布式应用开始准备搭建微服务应用,以下是公司从零开始搭建微服务的过程,记录并分享出来,希望对大家有所帮助,我们先使用Spring Clou ...

最新文章

  1. C语言程序设计 细节总结(第8章 指针)
  2. 避免在JSP中写java代码
  3. 安全中间件与应用服务间如用session
  4. SAP Spartacus 服务器端渲染编程规范
  5. SQL查询中having和where的异同点
  6. P4091-[HEOI2016/TJOI2016]求和【斯特林数,NTT】
  7. [react-router] React-Router 3和React-Router 4有什么变化?添加了什么好的特性?
  8. python字典副本_如何复制字典并仅在Python中编辑副本?
  9. 使用Jenkins在Azure Web App上进行ASP.NET Core应用程序的持续集成和部署(CI/CD)–第2天
  10. 数据结构和算法 D3
  11. js中常用方法以及document.readyState 判断页面是否加载完成 complete和interactive
  12. cad打开服务器上的文件很慢,cad2018启动慢怎么处理_cad2018打开很慢的解决教程
  13. 全基因组SNP分型(Whole Genome SNP Genotyping)分析简介
  14. Jupyter notebook 打开网页无法显示
  15. Volterra方程的不动点
  16. 【阿里巴巴大数据实践笔记】第9章:阿里巴巴数据整合及管理体系
  17. 微信破解WiFi密码如何操作?一招帮你查看密码!
  18. 软件测试基础-Web前端(二)
  19. 怎样修改传奇世界服务器,传奇世界服务器如何设置怪物攻击手段详细攻略
  20. 数字签名?电子签名?傻傻分不清楚

热门文章

  1. 绝地求生等游戏是怎样做出来的?带你们去看看游戏模型的制作流程
  2. php采集(php小偷)程序设计教程
  3. file not recognized: File format not recognized
  4. idea中unicode编码转换成中文
  5. iphone播客怎么上传_如何通过限制播客下载来在Mac或iPhone上节省空间
  6. CPU的典型故障剖析
  7. 一张图弄懂汇编程序常用指令系统(知识结构图)--快速参照手册(参照:人民邮电出版社《汇编语言程序设计(第二版)》前5章内容)
  8. 张恩民php基础视频教程下载_第51讲到76讲
  9. 缓存之缓存击穿、缓存穿透和缓存雪崩
  10. android下图片