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的类型简单说明
Sep 03 Javascript
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
Oct 18 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
Apr 05 Javascript
JavaScript实现打开链接页面的方式汇总
Jun 02 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
JavaScript基础之this详解
Jun 04 Javascript
初探js和简单隐藏效果的实例
Nov 23 Javascript
学习Vue组件实例
Apr 28 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
Sep 20 Javascript
在JS循环中使用async/await的方法
Oct 12 Javascript
深入理解vue-class-component源码阅读
Feb 18 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
Apr 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
星际争霸任务指南——人族
2020/03/04 星际争霸
PHP的栏目导航程序
2006/10/09 PHP
php仿discuz分页效果代码
2008/10/02 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
js登录弹出层特效
2014/03/07 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python continue继续循环用法总结
2018/06/10 Python
基于树莓派的语音对话机器人
2019/06/17 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
大三毕业自我鉴定
2014/01/15 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
融资合作协议书范本
2014/10/17 职场文书
民事和解协议书格式
2014/11/29 职场文书
元宵节寄语大全
2015/02/27 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
比较几种Redis集群方案
2021/06/21 Redis
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
一文带你探究MySQL中的NULL
2021/11/11 MySQL