欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS实现transform实现扇子效果

程序员文章站 2022-03-10 11:31:01
本文实例为大家分享了js实现transform实现扇子效果的具体代码,供大家参考,具体内容如下 描述: js面向对象——利用transform实现扇子效果 效果: 实现:...

本文实例为大家分享了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>

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