JS实现transform实现扇子效果


Posted in Javascript onJanuary 17, 2020

本文实例为大家分享了JS实现transform实现扇子效果的具体代码,供大家参考,具体内容如下

描述:

JS面向对象——利用transform实现扇子效果

效果:

JS实现transform实现扇子效果

实现:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<style>
.fan { margin: 0 auto; position: relative; top: 100px; width: 50px;}
.fan-other { margin: 0 auto; position: relative; top: 300px; width: 50px;}
</style>
<body>
  <div class="fan"></div>
  <div class="fan-other"></div>
 
  <script>
  (function(){
    
    // 扇子类
    class Fan {
      // Fan类的构造器,接收传入的参数
      // params selector 容器的选择器
      // params options 一些配置参数
      // options size 尺寸
      // ...
      // void return 
      constructor ( selector, options ) {
        // 扇子容器
        this.selector = selector
        this.wrapper = document.querySelector(selector)
        // 默认配置项
        let _options = {
          size: 'normal' // large
        }
        // 配置项
        this.options = options || _options
        // 扇叶的尺寸
        this.size = {
          width: 50, height: 150
        }
        // 进行初始化操作
        this.init()
      }
      // 初始化函数
      init () {
        // 创建扇叶
        this.createFanBlade()    
      }
      // 创建扇叶
      createFanBlade () {
        // 扇叶的数量 当new时size不为normal时,输出11片扇叶的扇子
        let _bladeNumbers = this.options.size === 'normal' ? 9 : 11;
        let _fragmentStr = '';
        let { width, height } = this.size;
        // 扇叶样式
        let _bladeStyle = {
          width: width + 'px',
          height: height+ 'px',
          position: 'absolute',
          top: 0, left: 0
        }
        for (let i = 0; i < _bladeNumbers; i++) {
          _bladeStyle.background = this.createRandomColor()//背景颜色随机
           _fragmentStr += `<div style="${this.turnStyleToString(_bladeStyle)}"></div>`
        }
        // 放入扇叶
        this.wrapper.innerHTML = _fragmentStr ;
        this.createTransition(_bladeNumbers);
      }
      // 制作动效Style并插入到head中
 
      createTransition (_bladeNumbers) {
        let _result = '<style>';
        _result += `
          ${this.selector} div { transition: all 0.5s; transform-origin: center bottom; }
        `;
        // 0 1 2 3 4 5 6 7 8 角度转化 0-8 中间是0° -70°~70°
        for (let i = 0; i < _bladeNumbers; i++) {
          let _num = (_bladeNumbers - 1) / 2
          let _angle = (i - _num) * 70 / _num
          _result += `
            ${this.selector}:hover div:nth-child(${i+1}){ 
            transform: rotate(${_angle}deg); }
          `
        }
        _result += '</style>'
        document.querySelector('head').innerHTML += _result;
      }
 
      // 转换样式对象为字符串
      turnStyleToString (styleObject) {
        let _result = ''
        for (const key in styleObject) {
        _result += key + ':' + styleObject[key] + ';'
        }
        return _result;
      }
 
      // 随机创建颜色
      createRandomColor () {
        return "#"+(function(color){
          return new Array(7-color.length).join("0")+color;
        })((Math.random() * 0x1000000 | 0).toString(16));
      }
 
    }
 
 
    new Fan('.fan')
    new Fan('.fan-other', {
      size: 'large'
    })
    
  })();
 
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
Jun 07 Javascript
JavaScript基于对象去除数组重复项的方法
Oct 09 Javascript
深入理解JS中的Function.prototype.bind()方法
Oct 11 Javascript
angular分页指令操作
Jan 09 Javascript
微信小程序富文本渲染引擎的详解
Sep 30 Javascript
vue项目中引入noVNC远程桌面的方法
Mar 05 Javascript
JS实现的JSON数组去重算法示例
Apr 11 Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 Javascript
Vue项目添加动态浏览器头部title的方法
Jul 11 Javascript
解决angularjs WdatePicker ng-model的问题
Sep 13 Javascript
Ant Design Pro 下实现文件下载的实现代码
Dec 03 Javascript
JavaScript通如何过RGraph实现动态仪表盘
Oct 15 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
Jan 16 #jQuery
浅谈VUE中演示v-for为什么要加key
Jan 16 #Javascript
Vue引入Stylus知识点总结
Jan 16 #Javascript
js实现提交前对列表数据的增删改查
Jan 16 #Javascript
react实现移动端下拉菜单的示例代码
Jan 16 #Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
Jan 16 #Javascript
JS实现简单的表格增删
Jan 16 #Javascript
You might like
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
Python 性能优化技巧总结
2016/11/01 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
纽约海:Sea New York
2018/11/04 全球购物
珍珠鸟教学反思
2014/02/01 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
2015双创工作总结
2015/07/24 职场文书
员工工作心得体会
2019/05/07 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
Mysql 一主多从的部署
2022/05/20 MySQL