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 相关文章推荐
javascript新手语法小结
Jun 15 Javascript
jquery创建并行对象或者合并对象的实现代码
Oct 10 Javascript
如何通过javascript操作web控件的自定义属性
Nov 25 Javascript
javascript中replace( )方法的使用
Apr 24 Javascript
基于JavaScript代码实现pc与手机之间的跳转
Dec 23 Javascript
详细讲解JavaScript中的this绑定
Oct 10 Javascript
详解js跨域请求的两种方式,支持post请求
May 05 Javascript
vue首次赋值不触发watch的解决方法
Sep 11 Javascript
微信小程序wx:for循环的实例详解
Oct 07 Javascript
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
微信小程序实用代码段(收藏版)
Dec 17 Javascript
vue cli4.0项目引入typescript的方法
Jul 17 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
PHP 超链接 抓取实现代码
2009/06/29 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
jquery的幻灯片图片切换效果代码分享
2015/09/07 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
简单的Python2.7编程初学经验总结
2015/04/01 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
Python3中使用PyMongo的方法详解
2017/07/28 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
Python基于内置函数type创建新类型
2020/10/22 Python
学生党员公开承诺书
2014/05/28 职场文书
教师师德考核自我评价
2014/09/13 职场文书
乡镇党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
银行员工考核评语
2014/12/31 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
Django显示可视化图表的实践
2021/05/10 Python
python 标准库原理与用法详解之os.path篇
2021/10/24 Python
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
Python中itertools库的四个函数介绍
2022/04/06 Python
Python列表的索引与切片
2022/04/07 Python