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 获取URL参数的插件
Mar 04 Javascript
jQuery知识点整理
Jan 30 Javascript
JSONP之我见
Mar 24 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
May 09 Javascript
Vue.js 60分钟快速入门教程
Mar 28 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 Javascript
elementui的默认样式修改方法
Feb 23 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
Node.js 深度调试方法解析
Jul 28 Javascript
js实现数字跳动到指定数字
Aug 25 Javascript
jQuery实现可以扩展的日历
Dec 01 jQuery
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中global和$GLOBALS[]的分析之一
2012/02/02 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
php使用codebase生成随机数
2014/03/25 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
php中序列化与反序列化详解
2017/02/13 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
深入浅析Python的类
2018/06/22 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
如何卸载python插件
2020/07/08 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
Matlab使用Plot函数实现数据动态显示方法总结
2021/02/25 Python
刑事法律意见书
2015/06/04 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
Mybatis是这样防止sql注入的
2021/12/06 Java/Android
nginx设置资源请求目录的方式详解
2022/05/30 Servers