最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 用CSS造出詞云效果

    正文概述 掘金(式溪)   2021-06-12   1069

    前段时间,接到一个需求要做一个充满随机词云的区域,而且词云要互相不重叠,效果如下图:

    用CSS造出詞云效果

    我刚开始打算先把词云做出来,然后用js算每一个的位置,但实在太难和太麻烦,一方面要用js去随机生成每一个云的位置,另一方面还要考虑生成的位置不发生重叠。后来转个思路去想,不用js,只用css可以吗?最后想到用flex做布局,然后利用js随机生成位置偏移,为了不发生重叠,给每个词云相应的间距就可以了。

    现在开始把效果实现吧。

    单个词云的实现

    在去实现一堆随机词云前,先看下怎样实现单个词云。

    首先先把元素写好:

    <div class="word-cloud">
      Hello World
    </div>
    

    然后是css:

    .word-cloud {
      position: relative;
      display: flex;
      justify-content: center;
      align-items: center;
      border-radius: 96px;
      width: 200px;
      height: 100px;
      color: #01FFFC;
      box-shadow: 0 0 20px 7px #01FFFC inset;
    }
    

    效果如下:

    用CSS造出詞云效果

    codepen在綫演示

    词云实现是没有什么难度的,重点是 box-shadow,利用inset,使阴影向内,把前两个参数设成0, 就可以使阴影向四周扩散。关于box-shadow的更多实现,可以看:

    你所不知道的 CSS 阴影技巧与细节

    词云布局

    (为了方便,这里我用vue来实现,其实用原生js也可以实现)

    接下来去做一堆词云吧。先把布局做好:

    body {
        padding: 0 0;
        margin: 0 0;
        background-color: rgba(0, 0, 0, 1);
    }
    
    #app {
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
      padding: 30px;
      width: 100%;
      height: 800px;
    }
    

    先把背景色设为黑色,然后做一个flex布局。

    定义一些随机词云数据:

      data() {
        return {
          cloudTexts: [
            'hello',
            'world',
            'monday',
            'tuesday',
            'sanday',
            'foo',
            'bar',
            'cheers',
            'cloud',
            'text',
            'taste',
            'dog',
            'rose',
            'boy',
            'girl',
            'egg'
          ]
        }
      }
    

    实现一个方法来生成词云的样式:

        genStyles() {
         // 设定颜色
         const colors = [['#01FFFC', '#01FFFC'], ['#01FF84', '#01FF84'], ['#5843D7', '#E2DDFF'], ['#FD374E', '#FD374E']]
        const colorIndex = Math.floor(Math.random() * 4)
        // 设定随机位置
        const top = Math.floor((Math.random() * 140) - 70)
        const left = Math.floor((Math.random() * 160) - 80)
        
        // 给予间隔,防止折迭
        const margin = `${Math.abs(top) + 4}px ${Math.abs(left) + 4}px`
          
          return {
            position: 'relative',
            top,
            left,
            display: 'flex',
            'justify-content': 'center',
            'align-items': 'center',
            'border-radius': '96px',
            width: '150px',
            height: '70px',
            margin,
            color: colors[colorIndex][1],
            'box-shadow': `0 0 20px 7px ${colors[colorIndex][0]} inset`
          }
        }
    

    生成随机数后再相减,使偏移值可以是正或负,然后为了不让词云互相重叠,给每个词云与偏移值相等的间距,保証它们互相不重叠。

    最后效果可以看演示:

    codepen在綫演示


    起源地下载网 » 用CSS造出詞云效果

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元