这几天学了h5新增元素,想着可以实现个自定义颜色小案例。

效果如下:

实现思路,点击花瓣时添加一个选中类名,然后通过上方 input 属性为 type=‘range’,给花瓣添加背景颜色。

一、HTML结构部分

<div id="box"><div class="div1">r (红色): 0<input type="range" class="range" min="0" value="0" max="255" id="">255 <br>g(绿色): 0<input type="range" class="range" min="0" value="0" max="255" id="">255 <br>b(蓝色): 0<input type="range" class="range" min="0" value="0" max="255" id="">255 <br><div id="rgb"></div> <br></div><div class="flowers"><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div></div></div>

在一个大盒子box中,上方为颜色选择框,下方为花瓣部分

二、CSS样式部分

 <style>#box {width: 500px;height: 500px;margin: 50px auto;}.div1 {width: 300px;height: 100px;}.flowers {position: relative;height: 400px;width: 400px;}.petals {position: absolute;left: 200px;top: 200px;width: 70px;height: 70px;border-radius: 0 100% 0 100%;border: solid 1px;transform-origin: -10px -10px;}.petals:nth-child(2) {transform: rotate(45deg);}.petals:nth-child(3) {transform: rotate(90deg);}.petals:nth-child(4) {transform: rotate(135deg);}.petals:nth-child(5) {transform: rotate(180deg);}.petals:nth-child(6) {transform: rotate(225deg);}.petals:nth-child(7) {transform: rotate(270deg);}.petals:nth-child(8) {transform: rotate(315deg);}</style>

主要是设置花瓣的位置,transform-origin:确定动画的原点,然后因为有8片花瓣,每片花瓣的旋转占比为360/8=45deg,这里对花瓣进行每片相隔45deg(角度),实现8片刚好围成一个圆。

三、JS代码部分

<script>var petals = document.getElementsByClassName('petals') //获取所有花瓣var ranges = document.getElementsByClassName('range')  //获取调色条var rgb = document.getElementById('rgb')  //获取显示颜色rgb值面板for (var i = 0; i < petals.length; i++) {(function (i) {petals[i].onclick = function () {for (var j = 0; j < petals.length; j++) {//排他思想: 先移除selected类名petals[j].classList.remove('selected')petals[j].style.border = '1px solid'}//添加selected类名,修改样式this.classList.add('selected')this.style.border = '2px dashed'rgb.innerHTML = ''}}(i))}for (var i = 0; i < ranges.length; i++) {(function (i) {ranges[i].oninput = function () {if (document.querySelector('.selected')) {var selected = document.querySelector('.selected');selected.style.backgroundColor = `rgb(${ranges[0].value},${ranges[1].value},${ranges[2].value})`selected.style.border = '1px solid'rgb.innerHTML = `rgb(${ranges[0].value},${ranges[1].value},${ranges[2].value})`}}}(i))}</script>

首先获取所有花瓣,所有调色条,以及用来显示rgb值的div盒子。

然后给花瓣循环绑定点击事件,这里需要一个匿名的自调用函数来储存i的值,不然事件绑定不上,i值会变为最终长度值。 另一个解决办法是将for循环中声明i的关键字变为let,因为let关键字声明的变量有自己的块级作用域。

然后利用"排他思想"循环遍历将所有花瓣的selected类名去掉,然后给当前点击的花瓣添加被选中的类名"selected"将边框变为虚线,表示被选中。

下面一个for循环同样利用了匿名的自调用函数存储i值,然后给所有的调色条绑定input事件(这个事件是当input的值一旦发生改变就会立即触发该事件)。

首先判断一下是否有被选中的元素(不然如果没选择的话拖动调色条会报错),然后通过判断之后获取带有selected类名的花瓣,然后将其背景颜色改为三个input输入的value值,最后将三个rgb值渲染到显示rgb值的div盒子中,这样一个彩色花瓣的效果就完成了 。

(这里的渲染部分用到了ES6中的模板字符串,详情可以通过查阅相关资料了解)。

四、代码总结

<!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><style>#box {width: 500px;height: 500px;margin: 50px auto;}.div1 {width: 300px;height: 100px;}.flowers {position: relative;height: 400px;width: 400px;}.petals {position: absolute;left: 200px;top: 200px;width: 70px;height: 70px;border-radius: 0 100% 0 100%;border: solid 1px;transform-origin: -10px -10px;}.petals:nth-child(2) {transform: rotate(45deg);}.petals:nth-child(3) {transform: rotate(90deg);}.petals:nth-child(4) {transform: rotate(135deg);}.petals:nth-child(5) {transform: rotate(180deg);}.petals:nth-child(6) {transform: rotate(225deg);}.petals:nth-child(7) {transform: rotate(270deg);}.petals:nth-child(8) {transform: rotate(315deg);}</style>
</head><body><div id="box"><div class="div1">r (红色): 0<input type="range" class="range" min="0" value="0" max="255" id="">255 <br>g(绿色): 0<input type="range" class="range" min="0" value="0" max="255" id="">255 <br>b(蓝色): 0<input type="range" class="range" min="0" value="0" max="255" id="">255 <br><div id="rgb"></div> <br></div><div class="flowers"><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div><div class="petals"></div></div></div><script>var petals = document.getElementsByClassName('petals') //获取所有花瓣var ranges = document.getElementsByClassName('range')  //获取调色条var rgb = document.getElementById('rgb')  //获取显示颜色rgb值面板for (var i = 0; i < petals.length; i++) {(function (i) {petals[i].onclick = function () {console.log(petals[i].classList);for (let j = 0; j < petals.length; j++) {//排他思想: 先移除selected类名petals[j].classList.remove('selected')petals[j].style.border = '1px solid'}//添加selected类名,修改样式this.classList.add('selected')this.style.border = '2px dashed'rgb.innerHTML = ''}}(i))}for (var i = 0; i < ranges.length; i++) {(function (i) {ranges[i].oninput = function () {if (document.querySelector('.selected')) {var selected = document.querySelector('.selected');selected.style.backgroundColor = `rgb(${ranges[0].value},${ranges[1].value},${ranges[2].value})`selected.style.border = '1px solid'rgb.innerHTML = `rgb(${ranges[0].value},${ranges[1].value},${ranges[2].value})`}}}(i))}</script>
</body></html>

感谢浏览!

用H5新增标签实现自定义彩色花瓣相关推荐

  1. H5新增标签以及常用标签

    H5新增标签 以下是一些常用的标签 1.结构标签 (1)section:独立内容区块,可以用h1~h6组成大纲,表示文档结构,也可以有章节.页眉.页脚或页眉的其他部分: (2)article:特殊独立 ...

  2. H5新增标签、CSS3新增属性总结

    一.H5新增标签 新增元素 说明 video 表示一段视频并提供播放的用户界面 audio 表示音频 canvas 表示位图区域 source 为video和audio提供数据源 track 为vid ...

  3. 前端H5新增标签和CSS3高级

    文章目录 一.CSS3高级技巧 1.精灵图 2.字体图标 3.CSS中的三角 3.CSS用户界面样式 4.vertical-align属性应用 5.溢出的文字省略号显示 6.常见布局技巧 6.CSS初 ...

  4. web语义化与h5新增标签

    Web语义化就是html告诉我们也告诉机器这一块是什么内容,例如:"这行是一个标题,这几行组成一个段落,这是一个列表,那是一个链接." Web语义化有三个阶段: 1.h1~h6.t ...

  5. h5新增标签和表单属性

    一.h5新增结构性标签(有意义的div) 1.header 定义网页的头部 2.nav 定义网页的导航部分 3.section 定义网页的某个区域 4.footer 定义网页的底部 5.article ...

  6. 粉阿吉整理(5)之------H5 新增标签

    -1. 结构 写法上更加的简单化(DOCTYPE/charset) 相关面试题(DOCTYPE) 1). DOCTYPE声明必须是HTML文档的第一行,位于标签之前 2). DOCTYPE声明不是HT ...

  7. h5新增标签及css3新增属性

    面试中经常被问,支支吾吾的老是答不全!!血泪教训,决定记下来! h5是html的最新版本,是14年由w3c完成标准制定.增强了,浏览器的原生功能,减少浏览器插件(eg:flash)的应用,提高用户体验 ...

  8. h5新增标签和表单元素

    h5新增表单元素 1. video 2. audio标签 3.datalist标签 4. progress标签 5. 表单新增元素 1. video 作用:播放视频 video常用标签属性: src: ...

  9. H5新增标签详细解说

    html5新增标签 标签名 描述 header 头部 nav 导航 section 区分大模块 aside 侧边栏 article 文章 figure 图片标记文档中的图像 figcaption 配图 ...

最新文章

  1. 《MongoDB权威指南》迷你书连载一-入门篇
  2. Metasploit 之 webshell 提权
  3. 本地连接git 服务器方式:以及git连接时报错
  4. 尽量使用int型的列类型
  5. 如何编写常见语言带默认参数值的函数
  6. 洛谷 - P4768 [NOI2018]归程(Kruskal重构树+树上倍增+最短路)
  7. 使用idea编写SparkStreaming消费kafka中的数据【小案例】(四)
  8. ASP.NET Core 2.0 MVC项目实战
  9. oracle数值型转为char类型,PLSQL: Oracle函数to_char转化数字型指定小数点位数的技巧...
  10. mysql 用户管理系统_mysql 用户管理
  11. python类的构造函数是_python类(class)的构造函数、初始化函数、析构函数
  12. JPA基础(三):搭建JPA开发环境和全局事务介绍
  13. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
  14. 在IntelliJ IDEA配置Tomcat
  15. C++ GUI Qt4 自学笔记
  16. 决策树算法python源代码_CART决策树(Decision Tree)的Python源码实现
  17. Github 汉化插件教程
  18. iOS 一键加入QQ群
  19. [error]: Found option without preceding group in config file ....\my.ini at line:1
  20. 微信小程序 #项目笔记# | 从0到1实现外卖点餐系统小程序

热门文章

  1. Bluetooth资格认证(BQB)学习
  2. SQL 查询语句 IIF()处理条件判断
  3. Firefox 禁止中国用户!!
  4. JDK8系列之Lambda表达式教程和示例
  5. SpringBoot集成Quartz+数据库存储
  6. 深度学习第四周Key Concepts on Deep Neural Networks习题整理
  7. 计算机网络基础教程实训总结,实训总结
  8. JMeter——》调整界面比例、字体大小
  9. [ app.json 文件内容错误] app.json: window.navigationBarTextStyle 字段需为 black,white【已解决】
  10. (实战)[re:Invent 2018]-001:赛道分析-(致敬1024)