美文网首页
动态词云

动态词云

作者: Mr君 | 来源:发表于2019-02-20 14:47 被阅读0次

如果是静态的词云推荐使用echarts词云,可以自定义词云形状什么的,很方便,不需要重复造轮子了。
我没有找到为其添加动态样式的相关文档,需求需要,这里重新总结一下

代码

环境react

import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import styleProps from '../ChartSetting/styleProps';

const ColorList = ['#21bfd7', '#461ba9', '#d838ab', '#2c84f0', '#21d78f', '#cf6172'];

let timer = null;

class TagesCharts extends PureComponent {
    constructor(props) {
        super(props)
        this.renderKeyWord = this.renderKeyWord.bind(this);
        this.initialize = this.initialize.bind(this);
        this.starmove = this.starmove.bind(this);
        this.setTimeout = this.setTimeout.bind(this);
    }

    componentDidUpdate() {
        let children = this.Chart.childNodes;
        for (let i = 0; i < children.length; i++) {
            children[i].pause = 1;
            children[i].time = null;
            this.initialize(children[i]);
        }
        this.setTimeout(children);
    }

    setTimeout(children) {
        timer = setTimeout(() => {
            clearTimeout(timer)
            this.starmove(children)
            this.setTimeout(children)
        }, 50)
    }

    starmove(children) {
        for (let i = 0; i < children.length; i++) {
            if (children[i].offsetTop <= -children[i].offsetHeight) {
                children[i].style.top = `${this.Chart.offsetHeight}px`;
                this.initialize(children[i]);
            } else {
                children[i].style.top = `${children[i].offsetTop - children[i].getAttribute('ispeed')}px`;

            }
        }
    }

    componentWillUnmount() {
        clearTimeout(timer)
    }

    initialize(item) {
        let iLeft = parseInt(Math.random() * this.Chart.offsetWidth);
        let keyWeight = item.getAttribute('value');
        let iTimer = parseInt(keyWeight * 1500);
        item.pause = 0;
        if ((iLeft - item.offsetWidth) > 0) {
            item.style.left = `${iLeft - item.offsetWidth}px`;
        } else {
            item.style.left = `${iLeft}px`;
        }
        clearTimeout(item.time);
        item.time = setTimeout(() => {
            item.pause = 1;
        }, iTimer);
    }

    renderKeyWord() {
        let { data } = this.props;
        let len = ColorList.length;
        if (Object.keys(data).length) {
            let arr = [];
            let index = 0;
            for (let key in data) {
                arr.push({
                    name: key,
                    value: Math.sqrt(data[key]),
                    color: ColorList[index]
                })
                index = (index + 1) % len === 0 ? 0 : index + 1;
            }
            return arr.map((item) => {
                let fontSize = `${Math.sqrt(styleProps.bodyFontSize) * Math.sqrt(item.value)}px`;

                return <span
                    key={item.name}
                    value={item.value}
                    ispeed={Math.ceil(1 / item.value * 40) + 1}
                    style={{ fontSize: fontSize,color: item.color}}>
                    {item.name}
                </span>
            })
        } else {
            return []
        }
    }

    render() {
        let { className } = this.props;
        let keyWord = this.renderKeyWord();
        return (
            <div
                className={`keywords ${className}`}
                ref={(node) => { this.Chart = node }}>
                {keyWord}
            </div>
        )
    }
}

TagesCharts.propTypes = {
    data: PropTypes.object, // 词云的数据
    className: PropTypes.string
};

export default TagesCharts

效果:

demo.gif

补充

在这个需求中要求就是向上浮动,但是如果小伙伴们想要球形浮动的,也可以参考下面链接中除了第一个。
如果小伙伴们有更好的想法记得留言呀!!!

参考

https://m.ruzw.com/html/201805/330.html
http://www.cnblogs.com/axes/p/3501424.html
http://www.matao.me/test/tag-cloud.html
https://blog.csdn.net/huozi07/article/details/48177079?locationNum=6&fps=1

相关文章

  • 动态词云

    如果是静态的词云推荐使用echarts的词云,可以自定义词云形状什么的,很方便,不需要重复造轮子了。我没有找到为其...

  • BDP实现3D动态词云

    先上效果: 1.数据导入 2.编辑词云 选择词云,获得静态的,选择3D模式,即可获取3D词云 静态效果如下:

  • elmo 实验心得及elmo个人理解

    1. 名词:ELMO:哈工大LTP 开发的动态词向量。 问题一:何为动态词向量: 普通的词向量,是静态的,也就是一...

  • 基于wordcloud2.js的动态词云

    此前接触到的词云板块大都是python的wordcloud模块或者echarts的自浮云,echarts的词云也是...

  • 词云

    以前总看到豆瓣知乎上各种晒词云的图片,乍一看高大上,于是今天潜心研究了一下python词云的几个库:wordclo...

  • 词云

    先发感叹:Python真强大,用来做业务,太轻松了。作为一个没怎么接触过Python的小白,我只用了十多行代码,就...

  • 词云

    勤问,不要感觉自己有多厉害,三人行也必有我师,勤学多问是进步的良方

  • 词云

    方文山和林夕都是作词大家,我仅以《青花瓷》和《红豆》两首歌作为例子,来比较一下两者文风的不同。 中文版 英文版

  • 词云

    一、林夕作词的《不要爱他》与方文山作词的《菊花台》词频对比 二、BBC与CNN报道ISIS在摩苏尔战斗的报道

  • 词云

    中文词云 比较搜狐财经和网易财经在“美国总统大选电视辩论”后第二天的相关评论。 英文词云 泰戈尔和狄兰·托马斯诗作...

网友评论

      本文标题:动态词云

      本文链接:https://www.haomeiwen.com/subject/grkhyqtx.html