<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>daladada</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://yoursite.com/"/>
  <updated>2021-12-31T09:05:32.796Z</updated>
  <id>http://yoursite.com/</id>
  
  <author>
    <name>daladada</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>echarts地图设置外边框</title>
    <link href="http://yoursite.com/2021/12/31/echarts%E5%9C%B0%E5%9B%BE%E8%AE%BE%E7%BD%AE%E5%A4%96%E8%BE%B9%E6%A1%86/"/>
    <id>http://yoursite.com/2021/12/31/echarts%E5%9C%B0%E5%9B%BE%E8%AE%BE%E7%BD%AE%E5%A4%96%E8%BE%B9%E6%A1%86/</id>
    <published>2021-12-31T05:00:00.000Z</published>
    <updated>2021-12-31T09:05:32.796Z</updated>
    
    <content type="html"><![CDATA[<h3 id="基础用法"><a href="#基础用法" class="headerlink" title="基础用法"></a>基础用法</h3><h4 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h4><p><img src="http://image.berlin4h.top/images/2021/12/31/_20211231160034.png" alt=""></p><h4 id=""><a href="#" class="headerlink" title=""></a></h4><h4 id="1、先画个中国地图"><a href="#1、先画个中国地图" class="headerlink" title="1、先画个中国地图"></a>1、先画个中国地图</h4><p>html部分</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">ref</span>=<span class="string">"myEchart"</span></span></span><br><span class="line"><span class="tag">     <span class="attr">:style</span>=<span class="string">"&#123;height:'100%%',width:'100%'&#125;"</span>/&gt;</span></span><br></pre></td></tr></table></figure><p>引入中国地图</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> echarts <span class="keyword">from</span> <span class="string">"echarts"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">"echarts/map/js/china"</span>;</span><br></pre></td></tr></table></figure><p>js部分</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> myChart = echarts.init(<span class="keyword">this</span>.$refs.myEchart); <span class="comment">// 这里是为了获得容器所在位置</span></span><br><span class="line"><span class="built_in">window</span>.onresize = myChart.resize();</span><br><span class="line">myChart.setOption(&#123;</span><br><span class="line">    backgroundColor: <span class="string">"transparent"</span>, <span class="comment">// 画布背景颜色</span></span><br><span class="line">    geo: &#123;</span><br><span class="line">        show: <span class="literal">true</span>,</span><br><span class="line">        map: <span class="string">"china"</span>,</span><br><span class="line">        zoom: <span class="number">1.1</span>,</span><br><span class="line">        aspectScale: <span class="number">0.8</span>, <span class="comment">// 长宽比</span></span><br><span class="line">        top: <span class="string">"5%"</span>,</span><br><span class="line">        layoutSize: <span class="string">"100%"</span></span><br><span class="line">        roam: <span class="literal">false</span></span><br><span class="line">    &#125;,</span><br><span class="line">    series: [</span><br><span class="line">        &#123;</span><br><span class="line">            type: <span class="string">"map"</span>,</span><br><span class="line">            map: <span class="string">"china"</span>,</span><br><span class="line">            geoIndex: <span class="number">0</span>,</span><br><span class="line">            zoom: <span class="number">1.1</span>,</span><br><span class="line">            top: <span class="string">"5%"</span>,</span><br><span class="line">            layoutSize: <span class="string">"100%"</span>,</span><br><span class="line">            aspectScale: <span class="number">0.8</span> <span class="comment">// 长宽比</span></span><br><span class="line">        &#125;</span><br><span class="line">    ]</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>效果如下，灰白白一片，啥也没有</p><p><img src="http://image.berlin4h.top/images/2021/12/31/20211231161455.png" alt=""></p><h4 id="添加边框"><a href="#添加边框" class="headerlink" title="添加边框"></a>添加边框</h4><p>echarts的geo配置里面有个边框属性，但是如果盲目的给加上这个边框，会发现每个省市都有，边框还好说，但是设计图里面有个阴影，加上去那真是惨不忍睹。所以咱换个思路讲，在geo里面添加边框和阴影，在series里面再给每个item设置一个背景色，遮盖住geo里面的阴影和边框，效果就会变得好看起来。代码如下</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line">myChart.setOption(&#123;</span><br><span class="line">    backgroundColor: <span class="string">"transparent"</span>, <span class="comment">// 画布背景颜色</span></span><br><span class="line">    tooltip: &#123; <span class="comment">// 鼠标移到图里面的浮动提示框</span></span><br><span class="line">        show: <span class="literal">false</span></span><br><span class="line">    &#125;,</span><br><span class="line">    geo: &#123;</span><br><span class="line">        ...</span><br><span class="line">        roam: <span class="literal">false</span>,</span><br><span class="line">        itemStyle: &#123;</span><br><span class="line">            normal: &#123;</span><br><span class="line">                areaColor: <span class="string">"#00A0E6"</span>,</span><br><span class="line">                borderWidth: <span class="number">0</span>, <span class="comment">// 设置外层边框</span></span><br><span class="line">                borderColor: <span class="string">"#05D8ED"</span>,</span><br><span class="line">                shadowColor: <span class="string">"#1442A4"</span>,</span><br><span class="line">                shadowOffsetX: <span class="number">0</span>,</span><br><span class="line">                shadowOffsetY: <span class="number">18</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    series: [</span><br><span class="line">        &#123;</span><br><span class="line">            geoIndex: <span class="number">1</span>, <span class="comment">// 关键代码就是将index设为1 这样就能在geo的上面去覆盖边框和阴影</span></span><br><span class="line">            ...</span><br><span class="line">            label: &#123; <span class="comment">// 这一段代码是为了显示各省份的名称</span></span><br><span class="line">                normal: &#123;</span><br><span class="line">                    show: <span class="literal">true</span>,</span><br><span class="line">                    formatter: <span class="string">"&#123;b&#125;"</span>,</span><br><span class="line">                    color: <span class="string">"#ffffff"</span>,</span><br><span class="line">                    fontSize: <span class="number">14</span>,</span><br><span class="line">                    position: <span class="string">"inside"</span></span><br><span class="line">                &#125;,</span><br><span class="line">                emphasis: &#123;</span><br><span class="line">                    show: <span class="literal">false</span>,</span><br><span class="line">                    textStyle: &#123;</span><br><span class="line">                        color: <span class="string">"#fff"</span></span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            roam: <span class="literal">false</span>,</span><br><span class="line">            itemStyle: &#123;</span><br><span class="line">                normal: &#123;</span><br><span class="line">                    areaColor: <span class="string">"#00BAE6"</span>,</span><br><span class="line">                    borderColor: <span class="string">"#01E6F6"</span>,</span><br><span class="line">                    borderWidth: <span class="number">2</span></span><br><span class="line">                &#125;,</span><br><span class="line">                emphasis: &#123;</span><br><span class="line">                    areaColor: <span class="string">"#009EE6"</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">      ]</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h4 id="尾巴彩蛋"><a href="#尾巴彩蛋" class="headerlink" title="尾巴彩蛋"></a>尾巴彩蛋</h4><p>设计图需求还有一个是要显示每个省市对应的人数，如果用tooltip的话不能多个一起显示，于是利用了scatter给每个item设置一个框显示数据，框的样式可以叫UI切个背景图，效果如下图。</p><p><img src="http://image.berlin4h.top/images/2021/12/31/20211231170254.png" alt=""></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line">myChart.setOption(&#123;</span><br><span class="line">    backgroundColor: <span class="string">"transparent"</span>, <span class="comment">// 画布背景颜色</span></span><br><span class="line">    tooltip: &#123; <span class="comment">// 鼠标移到图里面的浮动提示框</span></span><br><span class="line">        show: <span class="literal">false</span></span><br><span class="line">    &#125;,</span><br><span class="line">    geo: &#123;</span><br><span class="line">        ...</span><br><span class="line">    &#125;,</span><br><span class="line">    series: [</span><br><span class="line">        &#123;</span><br><span class="line">            ...</span><br><span class="line">            &#123; <span class="comment">// 悬浮窗</span></span><br><span class="line">                    name: <span class="string">"悬浮窗"</span>,</span><br><span class="line">                    type: <span class="string">"scatter"</span>,</span><br><span class="line">                    coordinateSystem: <span class="string">"geo"</span>,</span><br><span class="line">                    symbol: icon,</span><br><span class="line">                    symbolSize: [<span class="number">1.92</span> * <span class="keyword">this</span>.fontSize, <span class="number">2.43</span> * <span class="keyword">this</span>.fontSize], <span class="comment">// [25, 30]</span></span><br><span class="line">                    symbolOffset: [<span class="number">0</span>, <span class="number">-2.14</span> * <span class="keyword">this</span>.fontSize],</span><br><span class="line">                    showEffectOn: <span class="string">"render"</span>,</span><br><span class="line">                    rippleEffect: &#123; <span class="comment">// 涟漪特效</span></span><br><span class="line">                        brushType: <span class="string">"stroke"</span> <span class="comment">// 波纹绘制方式 stroke, fill</span></span><br><span class="line">                    &#125;,</span><br><span class="line">                    data: <span class="keyword">this</span>.convertDataDian(),</span><br><span class="line">                    hoverAnimation: <span class="literal">true</span>,</span><br><span class="line">                    zlevel: <span class="number">1</span></span><br><span class="line">                &#125;,</span><br><span class="line">                <span class="comment">// 框</span></span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"悬浮窗"</span>,</span><br><span class="line">                    type: <span class="string">"scatter"</span>,</span><br><span class="line">                    coordinateSystem: <span class="string">"geo"</span>,</span><br><span class="line">                    symbol: icon1,</span><br><span class="line">                    symbolSize: [<span class="number">10.6</span> * <span class="keyword">this</span>.fontSize, <span class="number">5</span> * <span class="keyword">this</span>.fontSize], <span class="comment">// [25, 30]</span></span><br><span class="line">                    symbolOffset: [<span class="number">0</span>, <span class="number">-5.71</span> * <span class="keyword">this</span>.fontSize],</span><br><span class="line">                    label: &#123;</span><br><span class="line">                        normal: &#123;</span><br><span class="line">                            show: <span class="literal">true</span>,</span><br><span class="line">                            textStyle: &#123;</span><br><span class="line">                                color: <span class="string">"#fff"</span>,</span><br><span class="line">                                fontSize: <span class="keyword">this</span>.fontSize * <span class="number">0.9</span></span><br><span class="line">                            &#125;,</span><br><span class="line">                            formatter: <span class="function">(<span class="params">params</span>) =&gt;</span></span><br><span class="line">                            &#123;</span><br><span class="line">                                <span class="keyword">return</span> <span class="string">`&#123;a|<span class="subst">$&#123;params.name&#125;</span>&#125;\n&#123;b|<span class="subst">$&#123;params.data.value[<span class="number">2</span>]&#125;</span>&#125;`</span>;</span><br><span class="line">                            &#125;,</span><br><span class="line">                            rich: &#123;</span><br><span class="line">                                a: &#123;</span><br><span class="line">                                    color: <span class="string">"#01D8FF"</span>,</span><br><span class="line">                                    fontWeight: <span class="string">"bold"</span>,</span><br><span class="line">                                    fontSize: <span class="keyword">this</span>.fontSize,</span><br><span class="line">                                    align: <span class="string">"center"</span></span><br><span class="line">                                &#125;,</span><br><span class="line">                                b: &#123;</span><br><span class="line">                                    color: <span class="string">"#ffffff"</span>,</span><br><span class="line">                                    fontSize: <span class="keyword">this</span>.fontSize * <span class="number">1.2</span>,</span><br><span class="line">                                    fontWeight: <span class="string">"bold"</span>,</span><br><span class="line">                                    padding: <span class="number">10</span>,</span><br><span class="line">                                    align: <span class="string">"center"</span></span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;,</span><br><span class="line">                    showEffectOn: <span class="string">"render"</span>,</span><br><span class="line">                    rippleEffect: &#123; <span class="comment">// 涟漪特效</span></span><br><span class="line">                        brushType: <span class="string">"stroke"</span> <span class="comment">// 波纹绘制方式 stroke, fill</span></span><br><span class="line">                    &#125;,</span><br><span class="line">                    data: <span class="keyword">this</span>.convertDataDian(),</span><br><span class="line">                    hoverAnimation: <span class="literal">true</span>,</span><br><span class="line">                    zlevel: <span class="number">1</span></span><br><span class="line">                &#125;</span><br><span class="line">        &#125;</span><br><span class="line">      ]</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">convertDataDian()</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">let</span> geoCoordMap = <span class="keyword">this</span>.geoCoordMap[<span class="number">0</span>];</span><br><span class="line">            <span class="keyword">let</span> res = [];</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>.dataList.length; i++)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">let</span> nativePlace = <span class="keyword">this</span>.dataList[i].nativePlace ? <span class="keyword">this</span>.dataList[i].nativePlace.replace(<span class="string">"省"</span>, <span class="string">""</span>) : <span class="string">""</span>;</span><br><span class="line">                <span class="keyword">let</span> geoCoord = geoCoordMap[nativePlace];</span><br><span class="line">                <span class="keyword">if</span> (geoCoord)</span><br><span class="line">                &#123;</span><br><span class="line">                    res.push(&#123;</span><br><span class="line">                        name: <span class="keyword">this</span>.dataList[i].nativePlace,</span><br><span class="line">                        value: geoCoord.concat(<span class="keyword">this</span>.dataList[i].peopleCounting)</span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> res;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><h3 id="最后附上完整代码"><a href="#最后附上完整代码" class="headerlink" title="最后附上完整代码"></a>最后附上完整代码</h3><p>运行可直接使用</p><p>echarts：4.2.1</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">    &lt;div id&#x3D;&quot;chart-map&quot;</span><br><span class="line">         ref&#x3D;&quot;myEchart&quot;</span><br><span class="line">         :style&#x3D;&quot;&#123;height:&#39;88vh&#39;,width:&#39;100%&#39;&#125;&quot;</span><br><span class="line">         class&#x3D;&quot;map-contanier&quot;&#x2F;&gt;</span><br><span class="line">&lt;&#x2F;template&gt;</span><br><span class="line"></span><br><span class="line">&lt;script&gt;</span><br><span class="line">import echarts from &quot;echarts&quot;;</span><br><span class="line">import &quot;echarts&#x2F;map&#x2F;js&#x2F;china&quot;;</span><br><span class="line">require(&quot;echarts&#x2F;theme&#x2F;macarons&quot;); &#x2F;&#x2F; echarts theme</span><br><span class="line">import &#123; debounce &#125; from &quot;@&#x2F;utils&#x2F;common&#x2F;utils&quot;;</span><br><span class="line">export default &#123;</span><br><span class="line">    data()</span><br><span class="line">    &#123;</span><br><span class="line">        return &#123;</span><br><span class="line">            chart: null,</span><br><span class="line">            geoCoordMap: [</span><br><span class="line">                &#123;</span><br><span class="line">                    &quot;甘肃&quot;: [103.73, 36.03],</span><br><span class="line">                    &quot;青海&quot;: [101.74, 36.56],</span><br><span class="line">                    &quot;四川&quot;: [104.06, 30.67],</span><br><span class="line">                    &quot;河北&quot;: [114.48, 38.03],</span><br><span class="line">                    &quot;云南&quot;: [102.73, 25.04],</span><br><span class="line">                    &quot;贵州&quot;: [106.71, 26.57],</span><br><span class="line">                    &quot;湖北&quot;: [114.31, 30.52],</span><br><span class="line">                    &quot;河南&quot;: [113.65, 34.76],</span><br><span class="line">                    &quot;山东&quot;: [117, 36.65],</span><br><span class="line">                    &quot;江苏&quot;: [118.78, 32.04],</span><br><span class="line">                    &quot;安徽&quot;: [117.27, 31.86],</span><br><span class="line">                    &quot;浙江&quot;: [120.19, 30.26],</span><br><span class="line">                    &quot;江西&quot;: [115.89, 28.68],</span><br><span class="line">                    &quot;福建&quot;: [119.3, 26.08],</span><br><span class="line">                    &quot;广东&quot;: [113.23, 23.16],</span><br><span class="line">                    &quot;湖南&quot;: [113, 28.21],</span><br><span class="line">                    &quot;海南&quot;: [110.35, 20.02],</span><br><span class="line">                    &quot;辽宁&quot;: [123.38, 41.8],</span><br><span class="line">                    &quot;吉林&quot;: [125.35, 43.88],</span><br><span class="line">                    &quot;黑龙江&quot;: [126.63, 45.75],</span><br><span class="line">                    &quot;山西&quot;: [112.53, 37.87],</span><br><span class="line">                    &quot;陕西&quot;: [108.95, 34.27],</span><br><span class="line">                    &quot;台湾&quot;: [121.30, 25.03],</span><br><span class="line">                    &quot;北京&quot;: [116.46, 39.92],</span><br><span class="line">                    &quot;上海&quot;: [121.48, 31.22],</span><br><span class="line">                    &quot;重庆&quot;: [106.54, 29.59],</span><br><span class="line">                    &quot;天津&quot;: [117.2, 39.13],</span><br><span class="line">                    &quot;内蒙古&quot;: [111.65, 40.82],</span><br><span class="line">                    &quot;广西&quot;: [108.33, 22.84],</span><br><span class="line">                    &quot;西藏&quot;: [91.11, 29.97],</span><br><span class="line">                    &quot;宁夏&quot;: [106.27, 38.47],</span><br><span class="line">                    &quot;新疆&quot;: [87.68, 43.77],</span><br><span class="line">                    &quot;香港&quot;: [114.17, 22.28],</span><br><span class="line">                    &quot;澳门&quot;: [113.54, 22.19]</span><br><span class="line">                &#125;</span><br><span class="line">            ],</span><br><span class="line">            dataList: [</span><br><span class="line">                &#123; nativePlace: &quot;黑龙江&quot;, peopleCounting: 2635 &#125;,</span><br><span class="line">                &#123; nativePlace: &quot;北京&quot;, peopleCounting: 2635 &#125;,</span><br><span class="line">                &#123; nativePlace: &quot;新疆&quot;, peopleCounting: 2635 &#125;,</span><br><span class="line">                &#123; nativePlace: &quot;青海&quot;, peopleCounting: 2635 &#125;,</span><br><span class="line">                &#123; nativePlace: &quot;湖北&quot;, peopleCounting: 2653 &#125;,</span><br><span class="line">                &#123; nativePlace: &quot;贵州&quot;, peopleCounting: 2635 &#125;</span><br><span class="line">            ]</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;,</span><br><span class="line">    mounted()</span><br><span class="line">    &#123;</span><br><span class="line">        this.initChart();</span><br><span class="line">        this.__resizeHandler &#x3D; debounce(() &#x3D;&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            if (this.chart)</span><br><span class="line">            &#123;</span><br><span class="line">                this.chart.resize();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;, 100);</span><br><span class="line">        window.addEventListener(&quot;chart-map&quot;, this.__resizeHandler);</span><br><span class="line">    &#125;,</span><br><span class="line">    beforeDestroy()</span><br><span class="line">    &#123;</span><br><span class="line">        if (!this.chart)</span><br><span class="line">        &#123;</span><br><span class="line">            return;</span><br><span class="line">        &#125;</span><br><span class="line">        this.chart.dispose();</span><br><span class="line">        this.chart &#x3D; null;</span><br><span class="line">    &#125;,</span><br><span class="line">    methods: &#123;</span><br><span class="line">        initChart()</span><br><span class="line">        &#123;</span><br><span class="line">            let icon &#x3D; &quot;image:&#x2F;&#x2F;&quot; + require(&quot;@&#x2F;assets&#x2F;images&#x2F;reform&#x2F;ready.png&quot;); &#x2F;&#x2F; location图标</span><br><span class="line">            let icon1 &#x3D; &quot;image:&#x2F;&#x2F;&quot; + require(&quot;@&#x2F;assets&#x2F;images&#x2F;reform&#x2F;hint.png&quot;); &#x2F;&#x2F; 弹窗的背景图片</span><br><span class="line">            let myChart &#x3D; echarts.init(this.$refs.myEchart); &#x2F;&#x2F; 这里是为了获得容器所在位置</span><br><span class="line">            window.onresize &#x3D; myChart.resize();</span><br><span class="line">            myChart.setOption(&#123;</span><br><span class="line">                backgroundColor: &quot;transparent&quot;, &#x2F;&#x2F; 画布背景颜色</span><br><span class="line">                tooltip: &#123; &#x2F;&#x2F; 鼠标移到图里面的浮动提示框</span><br><span class="line">                    show: false</span><br><span class="line">                &#125;,</span><br><span class="line">                geo: &#123;</span><br><span class="line">                    show: true,</span><br><span class="line">                    map: &quot;china&quot;,</span><br><span class="line">                    zoom: 1.1,</span><br><span class="line">                    aspectScale: 0.8, &#x2F;&#x2F; 长宽比</span><br><span class="line">                    top: &quot;5%&quot;,</span><br><span class="line">                    layoutSize: &quot;100%&quot;,</span><br><span class="line">                    label: &#123;</span><br><span class="line">                        normal: &#123;</span><br><span class="line">                            show: false</span><br><span class="line">                        &#125;,</span><br><span class="line">                        emphasis: &#123;</span><br><span class="line">                            show: false</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;,</span><br><span class="line">                    roam: false,</span><br><span class="line">                    itemStyle: &#123;</span><br><span class="line">                        normal: &#123;</span><br><span class="line">                            areaColor: &quot;#00A0E6&quot;,</span><br><span class="line">                            borderWidth: 0, &#x2F;&#x2F; 设置外层边框</span><br><span class="line">                            borderColor: &quot;#05D8ED&quot;,</span><br><span class="line">                            shadowColor: &quot;#1442A4&quot;,</span><br><span class="line">                            shadowOffsetX: 0,</span><br><span class="line">                            shadowOffsetY: 18</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;,</span><br><span class="line">                series: [</span><br><span class="line">                &#123;</span><br><span class="line">                    type: &quot;map&quot;,</span><br><span class="line">                    map: &quot;china&quot;,</span><br><span class="line">                    geoIndex: 1,</span><br><span class="line">                    zoom: 1.1,</span><br><span class="line">                    top: &quot;5%&quot;,</span><br><span class="line">                    layoutSize: &quot;100%&quot;,</span><br><span class="line">                    aspectScale: 0.8, &#x2F;&#x2F; 长宽比</span><br><span class="line">                    showLegendSymbol: false, &#x2F;&#x2F; 存在legend时显示</span><br><span class="line">                    label: &#123;</span><br><span class="line">                        normal: &#123;</span><br><span class="line">                            show: true,</span><br><span class="line">                            formatter: &quot;&#123;b&#125;&quot;,</span><br><span class="line">                            color: &quot;#ffffff&quot;,</span><br><span class="line">                            fontSize: 14,</span><br><span class="line">                            position: &quot;inside&quot;</span><br><span class="line">                        &#125;,</span><br><span class="line">                        emphasis: &#123;</span><br><span class="line">                            show: false,</span><br><span class="line">                            textStyle: &#123;</span><br><span class="line">                                color: &quot;#fff&quot;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;,</span><br><span class="line">                    selectedMode: &quot;multiple&quot;,</span><br><span class="line">                    colorBy: &quot;series&quot;,</span><br><span class="line">                    roam: false,</span><br><span class="line">                    itemStyle: &#123;</span><br><span class="line">                        normal: &#123;</span><br><span class="line">                            areaColor: &quot;#00BAE6&quot;,</span><br><span class="line">                            borderColor: &quot;#01E6F6&quot;,</span><br><span class="line">                            borderWidth: 2</span><br><span class="line">                        &#125;,</span><br><span class="line">                        emphasis: &#123;</span><br><span class="line">                            areaColor: &quot;#009EE6&quot;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;,</span><br><span class="line">                &#x2F;&#x2F; 地图中闪烁的点</span><br><span class="line">                &#123;</span><br><span class="line">                    name: &quot;闪点&quot;,</span><br><span class="line">                    type: &quot;effectScatter&quot;,</span><br><span class="line">                    coordinateSystem: &quot;geo&quot;,</span><br><span class="line">                    symbolOffset: [0, -30],</span><br><span class="line">                    data: this.convertDataDian(),</span><br><span class="line">                    showEffectOn: &quot;render&quot;,</span><br><span class="line">                    encode: &#123;</span><br><span class="line">                        value: 5</span><br><span class="line">                    &#125;,</span><br><span class="line">                    rippleEffect: &#123; &#x2F;&#x2F; 涟漪特效</span><br><span class="line">                        brushType: &quot;stroke&quot;, &#x2F;&#x2F; 波纹绘制方式 stroke, fill</span><br><span class="line">                        period: 5, &#x2F;&#x2F; 动画时间，值越小速度越快</span><br><span class="line">                        scale: 5 &#x2F;&#x2F; 波纹圆环最大限制，值越大波纹越大</span><br><span class="line">                    &#125;,</span><br><span class="line">                    hoverAnimation: true,</span><br><span class="line">                    itemStyle: &#123;</span><br><span class="line">                        color: &quot;#0154BE&quot;,</span><br><span class="line">                        shadowBlur: 10,</span><br><span class="line">                        shadowColor: &quot;#0154BE&quot;</span><br><span class="line">                    &#125;,</span><br><span class="line">                    zlevel: 1</span><br><span class="line">                &#125;,</span><br><span class="line">                &#123; &#x2F;&#x2F; 悬浮窗</span><br><span class="line">                    name: &quot;悬浮窗&quot;,</span><br><span class="line">                    type: &quot;scatter&quot;,</span><br><span class="line">                    coordinateSystem: &quot;geo&quot;,</span><br><span class="line">                    symbol: icon,</span><br><span class="line">                    symbolSize: [27, 34],</span><br><span class="line">                    symbolOffset: [0, -30],</span><br><span class="line">                    showEffectOn: &quot;render&quot;,</span><br><span class="line">                    rippleEffect: &#123; &#x2F;&#x2F; 涟漪特效</span><br><span class="line">                        brushType: &quot;stroke&quot; &#x2F;&#x2F; 波纹绘制方式 stroke, fill</span><br><span class="line">                    &#125;,</span><br><span class="line">                    data: this.convertDataDian(),</span><br><span class="line">                    hoverAnimation: true,</span><br><span class="line">                    zlevel: 1</span><br><span class="line">                &#125;,</span><br><span class="line">                &#x2F;&#x2F; 框</span><br><span class="line">                &#123;</span><br><span class="line">                    name: &quot;悬浮窗&quot;,</span><br><span class="line">                    type: &quot;scatter&quot;,</span><br><span class="line">                    coordinateSystem: &quot;geo&quot;,</span><br><span class="line">                    symbol: icon1,</span><br><span class="line">                    symbolSize: [149, 70],</span><br><span class="line">                    symbolOffset: [0, -80],</span><br><span class="line">                    label: &#123;</span><br><span class="line">                        normal: &#123;</span><br><span class="line">                            show: true,</span><br><span class="line">                            textStyle: &#123;</span><br><span class="line">                                color: &quot;#fff&quot;,</span><br><span class="line">                                fontSize: this.fontSize * 0.9</span><br><span class="line">                            &#125;,</span><br><span class="line">                            formatter: (params) &#x3D;&gt;</span><br><span class="line">                            &#123;</span><br><span class="line">                                return &#96;&#123;a|$&#123;params.name&#125;&#125;\n&#123;b|$&#123;params.data.value[2]&#125;&#125;&#96;;</span><br><span class="line">                            &#125;,</span><br><span class="line">                            rich: &#123;</span><br><span class="line">                                a: &#123;</span><br><span class="line">                                    color: &quot;#01D8FF&quot;,</span><br><span class="line">                                    fontWeight: &quot;bold&quot;,</span><br><span class="line">                                    fontSize: this.fontSize,</span><br><span class="line">                                    align: &quot;center&quot;</span><br><span class="line">                                &#125;,</span><br><span class="line">                                b: &#123;</span><br><span class="line">                                    color: &quot;#ffffff&quot;,</span><br><span class="line">                                    fontSize: this.fontSize * 1.2,</span><br><span class="line">                                    fontWeight: &quot;bold&quot;,</span><br><span class="line">                                    padding: 10,</span><br><span class="line">                                    align: &quot;center&quot;</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;,</span><br><span class="line">                    showEffectOn: &quot;render&quot;,</span><br><span class="line">                    rippleEffect: &#123; &#x2F;&#x2F; 涟漪特效</span><br><span class="line">                        brushType: &quot;stroke&quot; &#x2F;&#x2F; 波纹绘制方式 stroke, fill</span><br><span class="line">                    &#125;,</span><br><span class="line">                    data: this.convertDataDian(),</span><br><span class="line">                    hoverAnimation: true,</span><br><span class="line">                    zlevel: 1</span><br><span class="line">                &#125;</span><br><span class="line">                ]</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125;,</span><br><span class="line">        convertDataDian()</span><br><span class="line">        &#123;</span><br><span class="line">            let geoCoordMap &#x3D; this.geoCoordMap[0];</span><br><span class="line">            let res &#x3D; [];</span><br><span class="line">            for (let i &#x3D; 0; i &lt; this.dataList.length; i++)</span><br><span class="line">            &#123;</span><br><span class="line">                let geoCoord &#x3D; geoCoordMap[this.dataList[i].nativePlace];</span><br><span class="line">                if (geoCoord)</span><br><span class="line">                &#123;</span><br><span class="line">                    res.push(&#123;</span><br><span class="line">                        name: this.dataList[i].nativePlace,</span><br><span class="line">                        value: geoCoord.concat(this.dataList[i].peopleCounting)</span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            return res;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line">&lt;&#x2F;script&gt;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;基础用法&quot;&gt;&lt;a href=&quot;#基础用法&quot; class=&quot;headerlink&quot; title=&quot;基础用法&quot;&gt;&lt;/a&gt;基础用法&lt;/h3&gt;&lt;h4 id=&quot;示例效果&quot;&gt;&lt;a href=&quot;#示例效果&quot; class=&quot;headerlink&quot; title=&quot;示例效果&quot;&gt;&lt;/a
      
    
    </summary>
    
    
      <category term="vue" scheme="http://yoursite.com/categories/vue/"/>
    
    
      <category term="vue" scheme="http://yoursite.com/tags/vue/"/>
    
      <category term="echarts" scheme="http://yoursite.com/tags/echarts/"/>
    
      <category term="map" scheme="http://yoursite.com/tags/map/"/>
    
  </entry>
  
  <entry>
    <title>uniapp实现调起手机相机增加人脸框</title>
    <link href="http://yoursite.com/2021/09/17/uniapp%E5%AE%9E%E7%8E%B0%E8%B0%83%E8%B5%B7%E6%89%8B%E6%9C%BA%E7%9B%B8%E6%9C%BA%E5%A2%9E%E5%8A%A0%E4%BA%BA%E8%84%B8%E6%A1%86/"/>
    <id>http://yoursite.com/2021/09/17/uniapp%E5%AE%9E%E7%8E%B0%E8%B0%83%E8%B5%B7%E6%89%8B%E6%9C%BA%E7%9B%B8%E6%9C%BA%E5%A2%9E%E5%8A%A0%E4%BA%BA%E8%84%B8%E6%A1%86/</id>
    <published>2021-09-17T03:22:09.000Z</published>
    <updated>2021-09-18T08:37:16.982Z</updated>
    
    <content type="html"><![CDATA[<h3 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h3><p>在web页面上调起手机摄像头，并增加人脸框进行拍照，然后把图片上传到服务器。</p><p><img src="http://image.berlin4h.top/images/2021/09/17/d4fc53a5653c9010851a8e1d3716654.png" alt=""></p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><h5 id="1、基本原理"><a href="#1、基本原理" class="headerlink" title="1、基本原理"></a>1、基本原理</h5><p>使用<code>getUserMedia()</code>方法获取视频流，通过<code>video</code>标签在页面上播放，通过canvas画布截取图片。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--video用于显示媒体设备的视频流，自动播放--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"camera-wrapper"</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- 人脸框照片 --&gt;</span></span><br><span class="line">    &lt;image class="face-icon" src="@/static/images/home/collecte/face.png"&lt;/image&gt;</span><br><span class="line">    <span class="tag">&lt;<span class="name">video</span> <span class="attr">class</span>=<span class="string">"video"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">id</span>=<span class="string">"video"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">autoplay</span></span></span><br><span class="line"><span class="tag">           <span class="attr">height</span>=<span class="string">"100%"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">width</span>=<span class="string">"100%"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">:controls</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">:show-play-btn</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">:show-center-play-btn</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">:show-mute-btn</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag">           <span class="attr">:muted</span>=<span class="string">"true"</span>&gt;</span><span class="tag">&lt;/<span class="name">video</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="comment">&lt;!--拍照按钮--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"bottom-btn"</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">"btn-cell bottom-btn-left"</span> @<span class="attr">click</span>=<span class="string">"stopMedia"</span>&gt;</span>取消<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">"btn-cell bottom-btn-middle"</span> @<span class="attr">click</span>=<span class="string">"captureImg"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">image</span> <span class="attr">class</span>=<span class="string">"capture-icon"</span> <span class="attr">src</span>=<span class="string">"@/static/images/home/collecte/capture.png"</span>&gt;</span><span class="tag">&lt;/<span class="name">image</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">button</span> <span class="attr">class</span>=<span class="string">"btn-cell bottom-btn-right"</span> @<span class="attr">click</span>=<span class="string">"clipMedia"</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">image</span> <span class="attr">src</span>=<span class="string">"@/static/images/home/collecte/flip.png"</span> <span class="attr">class</span>=<span class="string">"flip-icon"</span>&gt;</span><span class="tag">&lt;/<span class="name">image</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">            <span class="comment">&lt;!--拍照图片--&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">canvas</span> <span class="attr">id</span>=<span class="string">"canvas"</span>&gt;</span><span class="tag">&lt;/<span class="name">canvas</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// getUserMedia()获取视频流</span></span><br><span class="line">getUserMedia()&#123;</span><br><span class="line">            <span class="keyword">const</span> constraints = <span class="built_in">window</span>.constraints = &#123;</span><br><span class="line">                <span class="comment">// 关闭视频声音</span></span><br><span class="line">                    audio: <span class="literal">false</span>,</span><br><span class="line">                <span class="comment">// 摄像头参数  user 前置摄像头 environment 后置摄像头 </span></span><br><span class="line">                <span class="comment">// 默认前置 通过变量isFront控制展示前置还是后置</span></span><br><span class="line">                    video: &#123;<span class="attr">facingMode</span>: <span class="keyword">this</span>.isFront ? <span class="string">"user"</span> : <span class="string">"environment"</span>&#125;</span><br><span class="line">                &#125;;</span><br><span class="line">            <span class="keyword">if</span>(navigator.mediaDevices.getUserMedia)&#123;</span><br><span class="line">                <span class="comment">//最新标准API navigator.mediaDevices.getUserMedia(constraints).then(this.success).catch(this.error);</span></span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (navigator.webkitGetUserMedia)&#123;</span><br><span class="line">                <span class="comment">//webkit内核浏览器</span></span><br><span class="line">                navigator.webkitGetUserMedia(constraints,<span class="keyword">this</span>.success, <span class="keyword">this</span>.error)</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (navigator.mozGetUserMedia)&#123;</span><br><span class="line">                <span class="comment">//Firefox浏览器</span></span><br><span class="line">                navigator.mozGetUserMedia(constraints, <span class="keyword">this</span>.success, <span class="keyword">this</span>.error);</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (navigator.getUserMedia)&#123;</span><br><span class="line">                <span class="comment">//旧版API</span></span><br><span class="line">                navigator.getUserMedia(constraints, <span class="keyword">this</span>.success, <span class="keyword">this</span>.error);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        init()</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> ((navigator.mediaDevices &amp;&amp; navigator.mediaDevices.getUserMedia) || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia)&#123;</span><br><span class="line">                <span class="keyword">this</span>.getUserMedia();</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="built_in">console</span>.log(<span class="string">"你的浏览器不支持访问用户媒体设备"</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        error(error)&#123;</span><br><span class="line">            uni.showToast(&#123;</span><br><span class="line">                title: error.message,</span><br><span class="line">                icon: <span class="string">'none'</span></span><br><span class="line">            &#125;);</span><br><span class="line">            <span class="built_in">console</span>.log(error.name+error.message);</span><br><span class="line">        &#125;,</span><br><span class="line">        success(stream)&#123;</span><br><span class="line">            <span class="keyword">const</span> video = <span class="built_in">document</span>.getelementIdBy(<span class="string">'video'</span>);</span><br><span class="line">            <span class="keyword">const</span> videoTracks = stream.getVideoTracks();</span><br><span class="line">            <span class="built_in">console</span>.log(<span class="string">'Got stream with constraints:'</span>, constraints);</span><br><span class="line">            <span class="keyword">this</span>.mediaStreamTrack  = stream; </span><br><span class="line">            video.srcObject = stream;</span><br><span class="line">            video.play();</span><br><span class="line">        &#125;，</span><br><span class="line">        <span class="comment">//关闭视频流</span></span><br><span class="line">        stopMedia()</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">this</span>.mediaStreamTrack.getTracks().forEach( <span class="function">(<span class="params">track</span>) =&gt;</span></span><br><span class="line">            &#123;</span><br><span class="line">                track.stop();</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125;,</span><br><span class="line">         <span class="comment">// 拍照片</span></span><br><span class="line">        captureImg()</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">var</span> videoHtml = <span class="built_in">document</span>.getElementById(<span class="string">"video"</span>);</span><br><span class="line">            <span class="keyword">var</span> canvasHtml = <span class="built_in">document</span>.getelementById(<span class="string">"canvas"</span>);</span><br><span class="line">            <span class="keyword">var</span> context = canvasHtml.getContext(<span class="string">"2d"</span>);</span><br><span class="line">            context.drawImage(videoHtml, <span class="number">0</span>, <span class="number">0</span>, <span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line">        &#125;,</span><br><span class="line">            <span class="comment">// 翻转摄像头</span></span><br><span class="line">        clipMedia()</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">this</span>.isFront = !<span class="keyword">this</span>.isFront;</span><br><span class="line">            <span class="keyword">this</span>.getUserMedia();</span><br><span class="line">        &#125;,</span><br></pre></td></tr></table></figure><h5 id="2、坑1：getContext-is-not-undefined"><a href="#2、坑1：getContext-is-not-undefined" class="headerlink" title="2、坑1：getContext is not undefined"></a>2、坑1：getContext is not undefined</h5><p>uniapp里面获取的canvas画布没法转getContext，官方给的是用uni.createCanvasContext获取，但是用这个截取不了视频流，就是没法获取照片。</p><p>解决办法：利用原生的方法创建一个canvas画布，利用这个canvas画布截取视频流，再转成图片路径展示。拍照函数做下改动。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> videoHtml = <span class="built_in">document</span>.getElementById(<span class="string">"video"</span>);</span><br><span class="line"><span class="keyword">var</span> canvasHtml = <span class="built_in">document</span>.createElement(<span class="string">"canvas"</span>);</span><br><span class="line"><span class="keyword">var</span> context = canvasHtml.getContext(<span class="string">"2d"</span>);</span><br><span class="line">context.drawImage(videoHtml, <span class="number">0</span>, <span class="number">0</span>, <span class="number">100</span>, <span class="number">100</span>);</span><br><span class="line"><span class="keyword">let</span> img = canvasHtml.toDataURL(<span class="string">"image/png"</span>, <span class="number">1</span>); <span class="comment">// 获取的图片路径，可直接在页面显示</span></span><br></pre></td></tr></table></figure><h5 id="3、坑2：截取视频流时报错，数据不是视频流"><a href="#3、坑2：截取视频流时报错，数据不是视频流" class="headerlink" title="3、坑2：截取视频流时报错，数据不是视频流"></a>3、坑2：截取视频流时报错，数据不是视频流</h5><p>与上一个坑一个意思，利用id去获取的vedio标签其实是uniapp包装以后的div盒子，所以直接获取是不行的，还是要用原生的方法获取vedio标签。</p><p>解决办法：改动代码如下。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">var videoHtml &#x3D; document.getElementById(&quot;video&quot;).querySelector(&quot;video&quot;);</span><br><span class="line"> var canvasHtml &#x3D; document.createElement(&quot;canvas&quot;);</span><br><span class="line"> var context &#x3D; canvasHtml.getContext(&quot;2d&quot;);</span><br><span class="line"> context.drawImage(videoHtml, 0, 0, width, height);</span><br><span class="line"> let img &#x3D; canvasHtml.toDataURL(&quot;image&#x2F;png&quot;, 1); &#x2F;&#x2F; 获取的图片路径，可直接在页面显示</span><br></pre></td></tr></table></figure><h5 id="4、坑三：画出的图片不完整"><a href="#4、坑三：画出的图片不完整" class="headerlink" title="4、坑三：画出的图片不完整"></a>4、坑三：画出的图片不完整</h5><p>图片不完整是因为图片的宽高设置有问题，drawImage需要传入起点终点及宽高数据，直接写的话会有适配问题。</p><p>解决办法：获取视频vedio标签的宽高，作为截取的宽高赋值，别忘了也给canvas赋值。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">var videoHtml &#x3D; document.getElementById(&quot;video&quot;).querySelector(&quot;video&quot;);</span><br><span class="line">var width &#x3D; document.getElementById(&quot;video&quot;).clientWidth;</span><br><span class="line">var height &#x3D; document.getElementById(&quot;video&quot;).clientHeight;</span><br><span class="line">var canvasHtml &#x3D; document.createElement(&quot;canvas&quot;);</span><br><span class="line">canvasHtml.width &#x3D; width;</span><br><span class="line">canvasHtml.height &#x3D; height;</span><br><span class="line">var context &#x3D; canvasHtml.getContext(&quot;2d&quot;);</span><br><span class="line">context.drawImage(videoHtml, 0, 0, width, height);</span><br><span class="line">let img &#x3D; canvasHtml.toDataURL(&quot;image&#x2F;png&quot;, 1);</span><br></pre></td></tr></table></figure><h5 id="5、补充"><a href="#5、补充" class="headerlink" title="5、补充"></a>5、补充</h5><p>getUserMedia()方法需要在https协议或者localhost才能调用，如果电脑开发，需要手机上看效果的话，可以在manifest.json中设置”https” : true，就可以在手机上运行测试了。</p><p>配置代码如下：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">"h5"</span> : &#123;</span><br><span class="line">    <span class="string">"devServer"</span>:&#123;</span><br><span class="line">            <span class="string">"https"</span> : <span class="literal">true</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;应用场景&quot;&gt;&lt;a href=&quot;#应用场景&quot; class=&quot;headerlink&quot; title=&quot;应用场景&quot;&gt;&lt;/a&gt;应用场景&lt;/h3&gt;&lt;p&gt;在web页面上调起手机摄像头，并增加人脸框进行拍照，然后把图片上传到服务器。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http:/
      
    
    </summary>
    
    
      <category term="uni-app" scheme="http://yoursite.com/categories/uni-app/"/>
    
    
      <category term="uni-app" scheme="http://yoursite.com/tags/uni-app/"/>
    
  </entry>
  
  <entry>
    <title>关于drag拖拽事件的那些事</title>
    <link href="http://yoursite.com/2021/08/12/%E5%85%B3%E4%BA%8Edrag%E6%8B%96%E6%8B%BD%E4%BA%8B%E4%BB%B6%E9%82%A3%E4%BA%9B%E4%BA%8B%20-%20%E5%89%AF%E6%9C%AC/"/>
    <id>http://yoursite.com/2021/08/12/%E5%85%B3%E4%BA%8Edrag%E6%8B%96%E6%8B%BD%E4%BA%8B%E4%BB%B6%E9%82%A3%E4%BA%9B%E4%BA%8B%20-%20%E5%89%AF%E6%9C%AC/</id>
    <published>2021-08-12T03:01:00.000Z</published>
    <updated>2021-08-12T07:13:57.416Z</updated>
    
    <content type="html"><![CDATA[<h3 id="基础用法"><a href="#基础用法" class="headerlink" title="基础用法"></a>基础用法</h3><h5 id="1、官网代码"><a href="#1、官网代码" class="headerlink" title="1、官网代码"></a>1、官网代码</h5><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 接受被移动元素 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">"div1"</span> <span class="attr">ondrop</span>=<span class="string">"drop(event)"</span> <span class="attr">ondragover</span>=<span class="string">"allowDrop(event)"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 被移动元素 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">img</span> <span class="attr">loading</span>=<span class="string">"lazy"</span> <span class="attr">id</span>=<span class="string">"drag1"</span> <span class="attr">src</span>=<span class="string">"/images/logo.png"</span> <span class="attr">draggable</span>=<span class="string">"true"</span> <span class="attr">ondragstart</span>=<span class="string">"drag(event)"</span> <span class="attr">width</span>=<span class="string">"336"</span> <span class="attr">height</span>=<span class="string">"69"</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 拖动元素放置的容器 </span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">allowDrop</span>(<span class="params">ev</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ev.preventDefault();</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drag</span>(<span class="params">ev</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ev.dataTransfer.setData(<span class="string">"Text"</span>,ev.target.id);</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drop</span>(<span class="params">ev</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ev.preventDefault();</span><br><span class="line">    <span class="keyword">var</span> data=ev.dataTransfer.getData(<span class="string">"Text"</span>);</span><br><span class="line">    ev.target.appendChild(<span class="built_in">document</span>.getElementById(data));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>代码解释：</p><ul><li>调用 preventDefault() 来避免浏览器对数据的默认处理（drop 事件的默认行为是以链接形式打开）</li><li>通过 dataTransfer.getData(“Text”) 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。</li><li>被拖数据是被拖元素的 id (“drag1”)</li><li>把被拖元素追加到放置元素（目标元素）中</li></ul><h3 id="鼠标默认显示"><a href="#鼠标默认显示" class="headerlink" title="鼠标默认显示"></a>鼠标默认显示</h3><h5 id="1、效果描述"><a href="#1、效果描述" class="headerlink" title="1、效果描述"></a>1、效果描述</h5><p>一个课表，每个格子都是一个课程。拖到空白元素的可新增，而有课程的地方需要显示禁选。理想效果如下图：</p><p><img src="http://image.berlin4h.top/images/2021/08/12/_2021_08_12_14_49_35_105.gif" alt=""></p><h5 id="2、代码："><a href="#2、代码：" class="headerlink" title="2、代码："></a>2、代码：</h5><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">allowDrop(e, week, index, id)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 如果格子有元素 才阻断默认行为（其实默认行为就是鼠标icon为禁选，取消就是可以新增）</span></span><br><span class="line">    <span class="keyword">if</span> (!week)</span><br><span class="line">    &#123;</span><br><span class="line">        e.preventDefault();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="拖动中样式设置"><a href="#拖动中样式设置" class="headerlink" title="拖动中样式设置"></a>拖动中样式设置</h3><h5 id="1、效果描述-1"><a href="#1、效果描述-1" class="headerlink" title="1、效果描述"></a>1、效果描述</h5><p>拖动过程中，我希望我能知道我现在悬停在哪个元素上。实现效果如下：</p><p><img src="http://image.berlin4h.top/images/2021/08/12/_2021_08_12_15_00_39_384.gif" alt=""></p><h5 id="2、实现思路"><a href="#2、实现思路" class="headerlink" title="2、实现思路"></a>2、实现思路</h5><p>dragover事件监听的其实是被拖到的位置，于是可以在dragover事件中获取当前元素，给它一个标记。</p><p>由于我的代码是用vue循环得出，于是我给了一个下标值标记。</p><p>伪代码如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- dragHoverIndex 代表当前悬浮的元素  drag-hover-cell 为悬浮元素的样式 --&gt;</span><br><span class="line">&lt;td v-for&#x3D;&quot;(week, wi) in d.arrangeList&quot;</span><br><span class="line">:key&#x3D;&quot;&#39;daily_week_&#39;+wi&quot;</span><br><span class="line">:class&#x3D;&quot;&#123;&#39;drag-hover-cell&#39;: dragHoverIndex &#x3D;&#x3D;&#x3D; (wi + &#39;_&#39; + d.id)&#125;&quot;&quot;</span><br><span class="line">class&#x3D;&quot;course-cell has-class&quot;</span><br><span class="line">@drop&#x3D;&quot;drop($event, d, wi)&quot;</span><br><span class="line">@dragover&#x3D;&quot;allowDrop($event, week, wi, d.id)&quot;</span><br><span class="line">                            &gt;</span><br><span class="line">                                ...</span><br><span class="line">                            &lt;&#x2F;td&gt;</span><br></pre></td></tr></table></figure><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.drag-hover-cell</span>&#123;<span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#409EFF</span>;&#125;</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">allowDrop(e, week, index, id)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// week 有值 则有课程  无值则显示悬浮样式</span></span><br><span class="line"><span class="keyword">if</span> (!week)</span><br><span class="line">    &#123;</span><br><span class="line">    e.preventDefault();</span><br><span class="line">    <span class="keyword">this</span>.dragHoverIndex = index + <span class="string">"_"</span> + id;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="keyword">this</span>.dragHoverIndex = <span class="number">-1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;基础用法&quot;&gt;&lt;a href=&quot;#基础用法&quot; class=&quot;headerlink&quot; title=&quot;基础用法&quot;&gt;&lt;/a&gt;基础用法&lt;/h3&gt;&lt;h5 id=&quot;1、官网代码&quot;&gt;&lt;a href=&quot;#1、官网代码&quot; class=&quot;headerlink&quot; title=&quot;1、官网代
      
    
    </summary>
    
    
      <category term="CSS" scheme="http://yoursite.com/categories/CSS/"/>
    
    
      <category term="vue" scheme="http://yoursite.com/tags/vue/"/>
    
      <category term="drag" scheme="http://yoursite.com/tags/drag/"/>
    
      <category term="css" scheme="http://yoursite.com/tags/css/"/>
    
  </entry>
  
  <entry>
    <title>SVG实现logo及点击动态效果</title>
    <link href="http://yoursite.com/2021/07/06/SVG%E5%AE%9E%E7%8E%B0logo%E5%8F%8A%E7%82%B9%E5%87%BB%E5%8A%A8%E6%80%81%E6%95%88%E6%9E%9C/"/>
    <id>http://yoursite.com/2021/07/06/SVG%E5%AE%9E%E7%8E%B0logo%E5%8F%8A%E7%82%B9%E5%87%BB%E5%8A%A8%E6%80%81%E6%95%88%E6%9E%9C/</id>
    <published>2021-07-06T08:46:00.000Z</published>
    <updated>2021-07-21T02:20:00.287Z</updated>
    
    <content type="html"><![CDATA[<h3 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a>效果展示</h3><p><img src="http://image.berlin4h.top/images/2021/07/06/GIF-2021-7-6--16-48-40.gif" alt=""></p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><h5 id="1、路径绘图"><a href="#1、路径绘图" class="headerlink" title="1、路径绘图"></a>1、路径绘图</h5><p>图标主要是用svg的path属性，首先先了解一下，path有哪些命令。</p><table><thead><tr><th>命令</th><th>属性</th></tr></thead><tbody><tr><td>M</td><td>移动到某个点</td></tr><tr><td>L</td><td>画直线</td></tr><tr><td>H</td><td>水平线</td></tr><tr><td>V</td><td>垂直线</td></tr><tr><td>C</td><td>二次赛贝尔曲线</td></tr><tr><td>S</td><td>平滑二次赛贝尔曲线</td></tr><tr><td>Q</td><td>三次赛贝尔曲线</td></tr><tr><td>T</td><td>平滑赛贝尔曲线</td></tr><tr><td>A</td><td>弧线</td></tr><tr><td>Z</td><td>结束点</td></tr></tbody></table><h5 id="2、简单绘图"><a href="#2、简单绘图" class="headerlink" title="2、简单绘图"></a>2、简单绘图</h5><p>现在先简单的绘制一个屋顶三角形，图标大小为45 X 45。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">svg</span> <span class="attr">width</span>=<span class="string">"45"</span> <span class="attr">height</span>=<span class="string">"45"</span> <span class="attr">class</span>=<span class="string">"path"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">path</span> <span class="attr">d</span>=<span class="string">"M 1 22 </span></span></span><br><span class="line"><span class="tag"><span class="string"> L 22.5 1</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 44 22</span></span></span><br><span class="line"><span class="tag"><span class="string">  Z"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">path</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">svg</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="http://image.berlin4h.top/images/2021/07/20/20210720180223.png" alt=""></p><h5 id="3、添加圆角"><a href="#3、添加圆角" class="headerlink" title="3、添加圆角"></a>3、添加圆角</h5><p>因为图标所有线条的连接点都是圆滑的曲线，只是单纯的用坐标绘制会得到如上图所示生硬的结果，于是二次赛贝尔曲线就出现了。利用三次赛贝尔曲线的原理，以转折点的左边坐标点为起始点，然后以转折点为控制点，转折点右边坐标点为终点。先拿顶角为例，顶角坐标为 （22.5,1），圆角的实现为：</p><p>起始点  (21.5 2)、控制点（22.5,1）、终点（23.5,2）</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">svg</span> <span class="attr">width</span>=<span class="string">"45"</span> <span class="attr">height</span>=<span class="string">"45"</span> <span class="attr">class</span>=<span class="string">"path"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">path</span> <span class="attr">d</span>=<span class="string">"M 1 22 </span></span></span><br><span class="line"><span class="tag"><span class="string"> L 21.5 2 Q 22.5 1 23.5 2</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 44 22</span></span></span><br><span class="line"><span class="tag"><span class="string">  Z"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">path</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">svg</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="http://image.berlin4h.top/images/2021/07/20/20210720180058.png" alt=""></p><h5 id="4、画icon"><a href="#4、画icon" class="headerlink" title="4、画icon"></a>4、画icon</h5><p>有了上面的基础，我们只需要把icon的每个坐标点都通过三次赛贝尔曲线描绘，就可以得到一个完整的小房子。</p><p><img src="http://image.berlin4h.top/images/2021/07/20/20210720180537.png" alt=""></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">svg</span> <span class="attr">width</span>=<span class="string">"45"</span> <span class="attr">height</span>=<span class="string">"45"</span> <span class="attr">class</span>=<span class="string">"path"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">path</span> <span class="attr">d</span>=<span class="string">"M 25 3 Q 22.5 1 20 3 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 2 18 Q 1 22 5 22 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 7 20 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 7 35 Q 7 43 12 43 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 17 43 Q 19 43 19 41</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 19 31 Q 19 29 20 29</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 25 29 Q 26 29 26 31 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 26 41 Q 26 43 28 43 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 33 43 Q 38 43 38 35 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 38 20 </span></span></span><br><span class="line"><span class="tag"><span class="string">             L 40 22 Q 44 22 43 18 Z"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">stroke</span>=<span class="string">"#333"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">stroke-width</span>=<span class="string">"1.5"</span> </span></span><br><span class="line"><span class="tag">        <span class="attr">fill</span>=<span class="string">"none"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">path</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">path</span> <span class="attr">d</span>=<span class="string">"M 23.5 25 Q 22.5 25 21.5 25</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 19 25 Q 18 25 18 24</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 18 21</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 18 19 Q 18 18 19 18</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 20 18 Q 21 18 22 18</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 20 18 Q 21 18 22 18</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 23 18 Q 24 18 24 18</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 23 18 Q 24 18 24 18</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 26 18 Q 27 18 27 19</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 27 21</span></span></span><br><span class="line"><span class="tag"><span class="string">             L 27 24 Q 27 25 26 25 </span></span></span><br><span class="line"><span class="tag"><span class="string">             Z"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">fill</span>=<span class="string">"#0BCCB0"</span></span></span><br><span class="line"><span class="tag">        <span class="attr">stroke</span>=<span class="string">"none"</span>&gt;</span><span class="tag">&lt;/<span class="name">path</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">svg</span>&gt;</span></span><br></pre></td></tr></table></figure><h5 id="5、添加动画"><a href="#5、添加动画" class="headerlink" title="5、添加动画"></a>5、添加动画</h5><p>动画的原理是改变SVG的路径，变成另一个图形，前提是这两个图形的坐标值数量必须一样。因此为了正方形能够转换变成房子，将正方形的坐标拆解成多个。利用css的animation动画，实现路径变化的动态效果。伪代码如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">html：</span><br><span class="line"><span class="tag">&lt;<span class="name">label</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"checkbox"</span> <span class="attr">id</span>=<span class="string">"home"</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">svg</span> <span class="attr">width</span>=<span class="string">"45px"</span> <span class="attr">height</span>=<span class="string">"45px"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">defs</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">linearGradient</span> <span class="attr">id</span>=<span class="string">"grad1"</span> <span class="attr">x1</span>=<span class="string">"0%"</span> <span class="attr">y1</span>=<span class="string">"0%"</span> <span class="attr">x2</span>=<span class="string">"0"</span> <span class="attr">y2</span>=<span class="string">"100%"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">stop</span> <span class="attr">offset</span>=<span class="string">"0%"</span> <span class="attr">style</span>=<span class="string">"stop-color:#67F1DD;stop-opacity:1"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">stop</span> <span class="attr">offset</span>=<span class="string">"100%"</span> <span class="attr">style</span>=<span class="string">"stop-color:#15CCB2;stop-opacity:1"</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">linearGradient</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;/<span class="name">defs</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">path</span> <span class="attr">class</span>=<span class="string">"background"</span>&gt;</span><span class="tag">&lt;/<span class="name">path</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">path</span> <span class="attr">class</span>=<span class="string">"border"</span>&gt;</span><span class="tag">&lt;/<span class="name">path</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">svg</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#home</span>&#123;</span><br><span class="line"><span class="attribute">display</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.background</span>&#123;</span><br><span class="line"><span class="attribute">fill</span>: <span class="built_in">url</span>(#grad1);</span><br><span class="line"><span class="attribute">animation</span>: toSmall .<span class="number">5s</span> linear forwards;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.border</span>&#123;</span><br><span class="line"><span class="attribute">fill</span>: none;</span><br><span class="line"><span class="attribute">stroke</span>: <span class="number">#333</span>;</span><br><span class="line"><span class="attribute">stroke-width</span>: <span class="number">1.5</span>;</span><br><span class="line"><span class="attribute">animation</span>: fade-in .<span class="number">5s</span> linear forwards;</span><br><span class="line"><span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">d</span>: <span class="built_in">path</span>(<span class="string">'M 25 3 Q 22.5 1 20 3 L 2 18 Q 1 22 5 22 L 7 20 L 7 35 Q 7 43 12 43 L 17 43 Q 19 43 19 41 L 19 31 Q 19 29 20 29 L 25 29 Q 26 29 26 31 L 26 41 Q 26 43 28 43 L 33 43 Q 38 43 38 35 L 38 20 L 40 22 Q 44 22 43 18 Z'</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#home</span><span class="selector-pseudo">:checked</span> + <span class="selector-tag">svg</span> <span class="selector-class">.background</span> &#123;</span><br><span class="line"><span class="attribute">stroke-width</span>: <span class="number">1.5</span>;</span><br><span class="line"><span class="attribute">stroke</span>: <span class="built_in">url</span>(#grad1);</span><br><span class="line"><span class="attribute">animation</span>: bigger .<span class="number">5s</span>  linear forwards;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#home</span><span class="selector-pseudo">:checked</span> + <span class="selector-tag">svg</span> <span class="selector-class">.border</span> &#123;</span><br><span class="line"><span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line"><span class="attribute">animation</span>: fade-out .<span class="number">3s</span> linear forwards;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> bigger &#123;</span><br><span class="line">0% &#123;</span><br><span class="line"><span class="attribute">d</span>: <span class="built_in">path</span>(<span class="string">'M 23.5 18 Q 22.5 18 21.5 18 L 19 18 Q 18 18 18 19 L 18 21 L 18 24 Q 18 25 19 25 L 20 25 Q 21 25 22 25 L 20 25 Q 21 25 22 25 L 23 25 Q 24 25 24 25 L 23 25 Q 24 25 24 25 L 26 25 Q 27 25 27 24 L 27 21 L 27 19 Q 27 18 26 18 Z'</span>);</span><br><span class="line">&#125;</span><br><span class="line">50% &#123;</span><br><span class="line"><span class="attribute">d</span>: <span class="built_in">path</span>(<span class="string">'M 25 3 Q 22.5 1 20 3 L 2 18 Q 1 22 5 22 L 7 20 L 7 35 Q 7 43 12 43 L 17 43 Q 19 43 19 43 L 19 43 Q 19 43 20 43 L 25 43 Q 26 43 26 43 L 26 43 Q 26 43 28 43 L 33 43 Q 38 43 38 35 L 38 20 L 40 22 Q 44 22 43 18 Z'</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">100% &#123;</span><br><span class="line"><span class="attribute">d</span>: <span class="built_in">path</span>(<span class="string">'M 25 3 Q 22.5 1 20 3 L 2 18 Q 1 22 5 22 L 7 20 L 7 35 Q 7 43 12 43 L 17 43 Q 19 43 19 41 L 19 31 Q 19 29 20 29 L 25 29 Q 26 29 26 31 L 26 41 Q 26 43 28 43 L 33 43 Q 38 43 38 35 L 38 20 L 40 22 Q 44 22 43 18 Z'</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> toSmall&#123;</span><br><span class="line">0%&#123;</span><br><span class="line"><span class="attribute">d</span>: <span class="built_in">path</span>(<span class="string">'M 25 3 Q 22.5 1 20 3 L 2 18 Q 1 22 5 22 L 7 20 L 7 35 Q 7 43 12 43 L 17 43 Q 19 43 19 41 L 19 31 Q 19 29 20 29 L 25 29 Q 26 29 26 31 L 26 41 Q 26 43 28 43 L 33 43 Q 38 43 38 35 L 38 20 L 40 22 Q 44 22 43 18 Z'</span>);</span><br><span class="line">&#125;</span><br><span class="line">50%&#123;</span><br><span class="line"><span class="attribute">d</span>: <span class="built_in">path</span>(<span class="string">'M 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 L 22.5 22.5 L 22.5 22.5 Q 22.5 22.5 22.5 22.5 Z'</span>);</span><br><span class="line">&#125;</span><br><span class="line">100%&#123;</span><br><span class="line"><span class="attribute">d</span>: <span class="built_in">path</span>(<span class="string">'M 23.5 18 Q 22.5 18 21.5 18 L 19 18 Q 18 18 18 19 L 18 21 L 18 24 Q 18 25 19 25 L 20 25 Q 21 25 22 25 L 20 25 Q 21 25 22 25 L 23 25 Q 24 25 24 25 L 23 25 Q 24 25 24 25 L 26 25 Q 27 25 27 24 L 27 21 L 27 19 Q 27 18 26 18 Z'</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> fade-in&#123;</span><br><span class="line"><span class="selector-tag">from</span>&#123;<span class="attribute">opacity</span>: <span class="number">0</span>;&#125;</span><br><span class="line"><span class="selector-tag">to</span>&#123; <span class="attribute">opacity</span>: <span class="number">1</span>;&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@keyframes</span> fade-out&#123;</span><br><span class="line"><span class="selector-tag">from</span>&#123;<span class="attribute">opacity</span>: <span class="number">1</span>;&#125;</span><br><span class="line"><span class="selector-tag">to</span>&#123;<span class="attribute">opacity</span>: <span class="number">0</span>;&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;效果展示&quot;&gt;&lt;a href=&quot;#效果展示&quot; class=&quot;headerlink&quot; title=&quot;效果展示&quot;&gt;&lt;/a&gt;效果展示&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;http://image.berlin4h.top/images/2021/07/06/GIF-2021
      
    
    </summary>
    
    
      <category term="SVG" scheme="http://yoursite.com/categories/SVG/"/>
    
    
      <category term="SVG" scheme="http://yoursite.com/tags/SVG/"/>
    
  </entry>
  
  <entry>
    <title>vue+echarts-wordcloud字符云踩雷</title>
    <link href="http://yoursite.com/2021/04/16/vue+echarts-wordcloud%E5%AD%97%E7%AC%A6%E4%BA%91%E8%B8%A9%E9%9B%B7/"/>
    <id>http://yoursite.com/2021/04/16/vue+echarts-wordcloud%E5%AD%97%E7%AC%A6%E4%BA%91%E8%B8%A9%E9%9B%B7/</id>
    <published>2021-04-16T03:19:00.000Z</published>
    <updated>2021-09-18T08:38:21.611Z</updated>
    
    <content type="html"><![CDATA[<h3 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h3><p>报表统计某个项目中使用的关键字数量集合，由于关键字是用户自定义输入，存在不可控性，可能会有大量不同的关键字存在，于是便想到了用字符云做统计。实现效果：</p><p><img src="http://image.berlin4h.top/images/2021/04/16/20210416104154.png" alt=""></p><h4 id="踩雷过程"><a href="#踩雷过程" class="headerlink" title="踩雷过程"></a>踩雷过程</h4><h5 id="1、安装依赖"><a href="#1、安装依赖" class="headerlink" title="1、安装依赖"></a>1、安装依赖</h5><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install echarts;</span><br><span class="line">npm install echarts-wordcloud</span><br></pre></td></tr></table></figure><h5 id="2、页面引入"><a href="#2、页面引入" class="headerlink" title="2、页面引入"></a>2、页面引入</h5><p>options的代码我是复制的官方示例代码。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> echarts <span class="keyword">from</span> <span class="string">"echarts"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="string">"echarts-wordcloud"</span>;</span><br><span class="line"><span class="keyword">this</span>.chart.setOption(</span><br><span class="line">    &#123;</span><br><span class="line">        tooltip: &#123;&#125;,</span><br><span class="line">        series: [&#123;</span><br><span class="line">            type: <span class="string">"wordCloud"</span>,</span><br><span class="line">            gridSize: <span class="number">5</span>,</span><br><span class="line">            textStyle: &#123;</span><br><span class="line">                color: <span class="function"><span class="params">()</span> =&gt;</span></span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="string">"rgb("</span> + [</span><br><span class="line">                    <span class="built_in">Math</span>.round(<span class="built_in">Math</span>.random() * <span class="number">160</span>),</span><br><span class="line">                    <span class="built_in">Math</span>.round(<span class="built_in">Math</span>.random() * <span class="number">160</span>),</span><br><span class="line">                    <span class="built_in">Math</span>.round(<span class="built_in">Math</span>.random() * <span class="number">160</span>)</span><br><span class="line">                    ].join(<span class="string">","</span>) + <span class="string">")"</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            emphasis: &#123;</span><br><span class="line">                textStyle: &#123;</span><br><span class="line">                    shadowBlur: <span class="number">10</span>,</span><br><span class="line">                    shadowColor: <span class="string">"#333"</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            data: [</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Sam S Club"</span>,</span><br><span class="line">                    value: <span class="number">6987</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Macys"</span>,</span><br><span class="line">                    value: <span class="number">6181</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Amy Schumer"</span>,</span><br><span class="line">                    value: <span class="number">4386</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Jurassic World"</span>,</span><br><span class="line">                    value: <span class="number">4055</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Charter Communications"</span>,</span><br><span class="line">                    value: <span class="number">2467</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Chick Fil A"</span>,</span><br><span class="line">                    value: <span class="number">2244</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Planet Fitness"</span>,</span><br><span class="line">                    value: <span class="number">1898</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Pitch Perfect"</span>,</span><br><span class="line">                    value: <span class="number">1484</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Express"</span>,</span><br><span class="line">                    value: <span class="number">1112</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Home"</span>,</span><br><span class="line">                    value: <span class="number">965</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Johnny Depp"</span>,</span><br><span class="line">                    value: <span class="number">847</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Lena Dunham"</span>,</span><br><span class="line">                    value: <span class="number">582</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Lewis Hamilton"</span>,</span><br><span class="line">                    value: <span class="number">555</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"KXAN"</span>,</span><br><span class="line">                    value: <span class="number">550</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Mary Ellen Mark"</span>,</span><br><span class="line">                    value: <span class="number">462</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Farrah Abraham"</span>,</span><br><span class="line">                    value: <span class="number">366</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Rita Ora"</span>,</span><br><span class="line">                    value: <span class="number">360</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Serena Williams"</span>,</span><br><span class="line">                    value: <span class="number">282</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"NCAA baseball tournament"</span>,</span><br><span class="line">                    value: <span class="number">273</span></span><br><span class="line">                &#125;,</span><br><span class="line">                &#123;</span><br><span class="line">                    name: <span class="string">"Point Break"</span>,</span><br><span class="line">                    value: <span class="number">265</span></span><br><span class="line">                &#125;</span><br><span class="line">            ]</span><br><span class="line">        &#125;]</span><br><span class="line">    &#125;);</span><br></pre></td></tr></table></figure><h5 id="3、踩雷在途"><a href="#3、踩雷在途" class="headerlink" title="3、踩雷在途"></a>3、踩雷在途</h5><p>上面一顿操作之后，页面运行直接报错”TypeError: echarts_lib_echarts__WEBPACK_IMPORTED_MODULE_0__.helper.createDimensions is not a function”</p><p>百度之后也没整明白啥问题，然后在官网上看到了一句话。</p><p>NOTE:</p><p>echarts-wordcloud@2 is for echarts@5 echarts-wordcloud@1 is for echarts@4</p><p><img src="C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210416105319164.png" alt="image-20210416105319164"></p><p>我的echarts版本是4.0.1，于是卸载echarts-wordcloud重新安装，再次运行。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm uninstall echarts-wordcloud</span><br><span class="line">npm install echarts-wordcloud@<span class="number">1.1</span><span class="number">.2</span></span><br></pre></td></tr></table></figure><p>欢喜运行，再次打开页面，报了另一个错。</p><p>echarts_lib_echarts__WEBPACK_IMPORTED_MODULE_0__.helper.createTextStyle is not a function</p><p><img src="http://image.berlin4h.top/images/2021/04/16/20210416110121.png" alt=""></p><p>沉着思考，冷静分析。。。分析不出来，开始疯狂百度，于是我又换了一个echarts的版本，从4.0.1换成了3.7.2。</p><p>再次欢喜运行。（其实重复安装依赖安装了非常多次，经过我多次试验，我发现需要先安装<a href="mailto:echarts@3.7.2">echarts@3.7.2</a>的版本，再安装<a href="mailto:echarts-wordcloud@1.1.2">echarts-wordcloud@1.1.2</a>的版本，欢喜运行就能出来）</p><p><img src="http://image.berlin4h.top/images/2021/04/16/20210416110928.png" alt=""></p><h5 id="4、曙光在即"><a href="#4、曙光在即" class="headerlink" title="4、曙光在即"></a>4、曙光在即</h5><p>页面是欢欢喜喜的运行出来了，然而字体却还是有点差强人意。仔细对照了官方给的文档，但是字体颜色就是不生效，出来全是一个色。</p><p>疯狂百度无果，正当山穷水尽疑无路之时，我默默的看了一眼echarts-wordcloud的源码，好家伙，还真让我发现了一个东西，color颜色定义放在textStyle的normal下面，把代码改了一下之后，字体颜色如期展示了。页面源码如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">    &lt;div class&#x3D;&quot;middle-chart&quot;&gt;</span><br><span class="line">        &lt;div ref&#x3D;&quot;chart&quot;</span><br><span class="line">             :style&#x3D;&quot;&#123;height:height,width:width&#125;&quot;&#x2F;&gt;</span><br><span class="line">    &lt;&#x2F;div&gt;</span><br><span class="line">&lt;&#x2F;template&gt;</span><br><span class="line">&lt;script&gt;</span><br><span class="line">import echarts from &quot;echarts&quot;;</span><br><span class="line">import &quot;echarts-wordcloud&quot;;</span><br><span class="line">import &#123; debounce &#125; from &quot;@&#x2F;scripts&#x2F;common&#x2F;utils&quot;;</span><br><span class="line">export default &#123;</span><br><span class="line">    props: &#123;</span><br><span class="line">        height: &#123;</span><br><span class="line">            type: String,</span><br><span class="line">            default: &quot;100%&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        width: &#123;</span><br><span class="line">            type: String,</span><br><span class="line">            default: &quot;100%&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    data()</span><br><span class="line">    &#123;</span><br><span class="line">        return &#123;</span><br><span class="line">        &#125;;</span><br><span class="line">    &#125;,</span><br><span class="line">    mounted()</span><br><span class="line">    &#123;</span><br><span class="line">        this.initChart();</span><br><span class="line">        this.__resizeHandler &#x3D; debounce(() &#x3D;&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            if (this.chart)</span><br><span class="line">            &#123;</span><br><span class="line">                this.chart.resize();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;, 100);</span><br><span class="line">        window.addEventListener(&quot;resize&quot;, this.__resizeHandler);</span><br><span class="line">    &#125;,</span><br><span class="line">    beforeDestroy()</span><br><span class="line">    &#123;</span><br><span class="line">        if (!this.chart)</span><br><span class="line">        &#123;</span><br><span class="line">            return;</span><br><span class="line">        &#125;</span><br><span class="line">        window.removeEventListener(&quot;resize&quot;, this.__resizeHandler);</span><br><span class="line">        this.chart.dispose();</span><br><span class="line">        this.chart &#x3D; null;</span><br><span class="line">    &#125;,</span><br><span class="line">    methods: &#123;</span><br><span class="line">        initChart: function()</span><br><span class="line">        &#123;</span><br><span class="line">            this.chart &#x3D; echarts.init(this.$refs.chart);</span><br><span class="line"></span><br><span class="line">            this.chart.setOption(</span><br><span class="line">                &#123;</span><br><span class="line">                    tooltip: &#123;&#125;,</span><br><span class="line">                    series: [&#123;</span><br><span class="line">                        type: &quot;wordCloud&quot;,</span><br><span class="line">                        gridSize: 5,</span><br><span class="line">                        textStyle: &#123;</span><br><span class="line">                            normal: &#123;</span><br><span class="line">                                color: () &#x3D;&gt;</span><br><span class="line">                                &#123;</span><br><span class="line">                                    return &quot;rgb(&quot; + [</span><br><span class="line">                                            Math.round(Math.random() * 160) + 45,</span><br><span class="line">                                            Math.round(Math.random() * 160) + 45,</span><br><span class="line">                                            Math.round(Math.random() * 160) + 45</span><br><span class="line">                                        ].join(&quot;,&quot;) + &quot;)&quot;;</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;,</span><br><span class="line">                        emphasis: &#123;</span><br><span class="line">                            textStyle: &#123;</span><br><span class="line">                                shadowBlur: 10,</span><br><span class="line">                                shadowColor: &quot;#333&quot;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;,</span><br><span class="line">                        data: [</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Sam S Club&quot;,</span><br><span class="line">                            value: 6987</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Macys&quot;,</span><br><span class="line">                            value: 6181</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Amy Schumer&quot;,</span><br><span class="line">                            value: 4386</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Jurassic World&quot;,</span><br><span class="line">                            value: 4055</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Charter Communications&quot;,</span><br><span class="line">                            value: 2467</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Chick Fil A&quot;,</span><br><span class="line">                            value: 2244</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Planet Fitness&quot;,</span><br><span class="line">                            value: 1898</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Pitch Perfect&quot;,</span><br><span class="line">                            value: 1484</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Express&quot;,</span><br><span class="line">                            value: 1112</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Home&quot;,</span><br><span class="line">                            value: 965</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Johnny Depp&quot;,</span><br><span class="line">                            value: 847</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Lena Dunham&quot;,</span><br><span class="line">                            value: 582</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Lewis Hamilton&quot;,</span><br><span class="line">                            value: 555</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;KXAN&quot;,</span><br><span class="line">                            value: 550</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Mary Ellen Mark&quot;,</span><br><span class="line">                            value: 462</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Farrah Abraham&quot;,</span><br><span class="line">                            value: 366</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Rita Ora&quot;,</span><br><span class="line">                            value: 360</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Serena Williams&quot;,</span><br><span class="line">                            value: 282</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;NCAA baseball tournament&quot;,</span><br><span class="line">                            value: 273</span><br><span class="line">                        &#125;,</span><br><span class="line">                        &#123;</span><br><span class="line">                            name: &quot;Point Break&quot;,</span><br><span class="line">                            value: 265</span><br><span class="line">                        &#125;</span><br><span class="line">                    ]</span><br><span class="line">                    &#125;]</span><br><span class="line">                &#125;);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line">&lt;&#x2F;script&gt;</span><br><span class="line">&lt;style lang&#x3D;&quot;scss&quot; scoped&gt;</span><br><span class="line">@import url(&quot;.&#x2F;chart.scss&quot;);</span><br><span class="line">&lt;&#x2F;style&gt;</span><br></pre></td></tr></table></figure><h5 id="6、结语"><a href="#6、结语" class="headerlink" title="6、结语"></a>6、结语</h5><p>官方给的随机颜色是在0-160区间，红黄蓝都在这个区间显示的字体颜色是深色的，比较适合浅色背景，如果和我一样是深色背景的可以将rgba的色值调高一点，一般160-255之间的出来颜色会偏浅。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;应用场景&quot;&gt;&lt;a href=&quot;#应用场景&quot; class=&quot;headerlink&quot; title=&quot;应用场景&quot;&gt;&lt;/a&gt;应用场景&lt;/h3&gt;&lt;p&gt;报表统计某个项目中使用的关键字数量集合，由于关键字是用户自定义输入，存在不可控性，可能会有大量不同的关键字存在，于是便想到了
      
    
    </summary>
    
    
      <category term="Vue" scheme="http://yoursite.com/categories/Vue/"/>
    
    
      <category term="vue" scheme="http://yoursite.com/tags/vue/"/>
    
      <category term="echarts" scheme="http://yoursite.com/tags/echarts/"/>
    
      <category term="echarts-wordcloud" scheme="http://yoursite.com/tags/echarts-wordcloud/"/>
    
      <category term="字符云" scheme="http://yoursite.com/tags/%E5%AD%97%E7%AC%A6%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>react实现图片懒加载</title>
    <link href="http://yoursite.com/2021/04/06/react%E5%AE%9E%E7%8E%B0%E5%9B%BE%E7%89%87%E6%87%92%E5%8A%A0%E8%BD%BD/"/>
    <id>http://yoursite.com/2021/04/06/react%E5%AE%9E%E7%8E%B0%E5%9B%BE%E7%89%87%E6%87%92%E5%8A%A0%E8%BD%BD/</id>
    <published>2021-04-06T06:33:00.000Z</published>
    <updated>2021-08-12T07:13:26.247Z</updated>
    
    <content type="html"><![CDATA[<h3 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h3><p>某些网站中拥有大量图片，但用户可视区范围内，只展示一小部分的图片，如果不对图片进行懒加载，在网速较慢或图片资源过大的情况下，会出现加载缓慢卡顿的现象，影响用户体验。针对这种情况提出先加载用户可视范围内的图片，其他图片等用户进行操作（滑动或点击按钮）时再进行加载。</p><h4 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h4><h5 id="1、图片列表"><a href="#1、图片列表" class="headerlink" title="1、图片列表"></a>1、图片列表</h5><p>先不对图片标签赋值图片的地址，将地址放到父级里面利用data-source保存。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">&lt;div id&#x3D;&quot;imgWrapper&quot;&gt;</span><br><span class="line">    &lt;ul id&#x3D;&quot;imgList&quot;&gt;</span><br><span class="line">        &#123;taskImg.map((item, index) &#x3D;&gt;(</span><br><span class="line">            &lt;li key&#x3D;&#123;&#96;img$&#123;index&#125;&#96;&#125;</span><br><span class="line">                lazyload&#x3D;&quot;true&quot;</span><br><span class="line">                data-original&#x3D;&#123;download() + item.imageId&#125;&gt;</span><br><span class="line">                &lt;Image</span><br><span class="line">                    width&#x3D;&#123;150&#125;</span><br><span class="line">                    height&#x3D;&#123;150&#125;</span><br><span class="line">                    src&#x3D;&quot;&quot;&#x2F;&gt;</span><br><span class="line">            &lt;&#x2F;li&gt;</span><br><span class="line">        ))&#125;</span><br><span class="line">    &lt;&#x2F;ul&gt;</span><br><span class="line">&lt;&#x2F;div&gt;</span><br></pre></td></tr></table></figure><h5 id="2、页面滑动"><a href="#2、页面滑动" class="headerlink" title="2、页面滑动"></a>2、页面滑动</h5><p>横向滚动</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">&#x2F;&#x2F; 获取未显示的图片列表</span><br><span class="line">const imgList &#x3D; document.getElementById(&quot;imgList&quot;).querySelectorAll(&quot;li[data-original][lazyload]&quot;);</span><br><span class="line">&#x2F;&#x2F; 获取主容器左边距离和右边距离</span><br><span class="line">const wrapper &#x3D; document.getElementById(&quot;imgWrapper&quot;);</span><br><span class="line">const initRect &#x3D; wrapper.getBoundingClientRect();</span><br><span class="line">const initLeft &#x3D; initRect.left;</span><br><span class="line">const initRight &#x3D; initRect.right;</span><br><span class="line">imgList.forEach((item, index) &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    const img &#x3D; item.firstChild.firstChild;&#x2F;&#x2F;获取图片元素</span><br><span class="line">    const rect &#x3D; item.getBoundingClientRect();</span><br><span class="line">    let rectL &#x3D; rect.left + rect.width;&#x2F;&#x2F; 图片到可视区域左边距离</span><br><span class="line">    let rectR &#x3D; rect.right - rect.width;&#x2F;&#x2F; 图片到可视区域右边距离</span><br><span class="line">    &#x2F;&#x2F; 判断是否在可视区域内</span><br><span class="line">    if ((rect.left &gt;&#x3D; initLeft &amp;&amp; rectR &lt;&#x3D; initRight) || (rectL &gt;&#x3D; initLeft &amp;&amp; rect.right &lt;&#x3D; initRight))</span><br><span class="line">    &#123;</span><br><span class="line">        img.src &#x3D; item.dataset.original;</span><br><span class="line">        item.removeAttribute(&quot;data-original&quot;);&#x2F;&#x2F; 移除属性，下次不再遍历</span><br><span class="line">        item.removeAttribute(&quot;lazyload&quot;);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>竖向滚动</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">&#x2F;&#x2F; 获取未显示的图片列表</span><br><span class="line">const imgList &#x3D; document.getElementById(&quot;imgList&quot;).querySelectorAll(&quot;li[data-original][lazyload]&quot;);</span><br><span class="line">imgList.forEach((item, index) &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    const img &#x3D; item.firstChild.firstChild;&#x2F;&#x2F;获取图片元素</span><br><span class="line">    &#x2F;&#x2F; 判断是否在可视区域内</span><br><span class="line">    if (img.offsetTop &lt; window.innerHeight + window.pageYOffset)</span><br><span class="line">    &#123;</span><br><span class="line">        img.src &#x3D; item.dataset.original;</span><br><span class="line">        item.removeAttribute(&quot;data-original&quot;);&#x2F;&#x2F; 移除属性，下次不再遍历</span><br><span class="line">        item.removeAttribute(&quot;lazyload&quot;);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;应用场景&quot;&gt;&lt;a href=&quot;#应用场景&quot; class=&quot;headerlink&quot; title=&quot;应用场景&quot;&gt;&lt;/a&gt;应用场景&lt;/h3&gt;&lt;p&gt;某些网站中拥有大量图片，但用户可视区范围内，只展示一小部分的图片，如果不对图片进行懒加载，在网速较慢或图片资源过大的情况下，
      
    
    </summary>
    
    
      <category term="React" scheme="http://yoursite.com/categories/React/"/>
    
    
      <category term="antd" scheme="http://yoursite.com/tags/antd/"/>
    
      <category term="懒加载" scheme="http://yoursite.com/tags/%E6%87%92%E5%8A%A0%E8%BD%BD/"/>
    
  </entry>
  
  <entry>
    <title>Ailabel+react实现图片标注</title>
    <link href="http://yoursite.com/2021/03/19/Ailabel+react%E5%AE%9E%E7%8E%B0%E5%9B%BE%E7%89%87%E6%A0%87%E6%B3%A8/"/>
    <id>http://yoursite.com/2021/03/19/Ailabel+react%E5%AE%9E%E7%8E%B0%E5%9B%BE%E7%89%87%E6%A0%87%E6%B3%A8/</id>
    <published>2021-03-19T06:24:00.000Z</published>
    <updated>2021-08-12T07:13:49.204Z</updated>
    
    <content type="html"><![CDATA[<h3 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h3><p>对图片进行标注，包括画矩形框、多边形框和线条。<a href="https://dingyang9642.github.io/AILabel/#/" target="_blank" rel="noopener">官网传送门</a></p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><h5 id="1、环境准备"><a href="#1、环境准备" class="headerlink" title="1、环境准备"></a>1、环境准备</h5><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 安装ailabel依赖</span></span><br><span class="line"># npm install ailabel --save</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 页面引入ailabel</span></span><br><span class="line"><span class="keyword">const</span> AILabel = <span class="built_in">require</span>(<span class="string">"AILabel"</span>);</span><br></pre></td></tr></table></figure><h5 id="2、Map对象实例化"><a href="#2、Map对象实例化" class="headerlink" title="2、Map对象实例化"></a>2、Map对象实例化</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">const gMap &#x3D; new AILabel.Map(&quot;AiLabelImg&quot;, &#123; zoom: 0, cx: 0, cy: 0, zoomMax: 400 * 10, zoomMin: 400 &#x2F; 10, autoPan: true, drawZoom: true &#125;);</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">render()</span><br><span class="line">&#123;</span><br><span class="line">    return (</span><br><span class="line">        &lt;div id&#x3D;&quot;AiLabelImg&quot;&gt;&lt;&#x2F;div&gt;</span><br><span class="line">    );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>map实例参数说明：</p><table><thead><tr><th>参数</th><th><strong>说明</strong></th></tr></thead><tbody><tr><td>zoom</td><td>初始缩放级别</td></tr><tr><td>cx</td><td>初始中心点坐标x</td></tr><tr><td>cy</td><td>初始中心点坐标y</td></tr><tr><td>zoomMax</td><td>缩放最大级别</td></tr><tr><td>zoomMin</td><td>缩放最小级别</td></tr><tr><td>autoPan</td><td>绘制过程中是否禁止自动平移</td></tr><tr><td>drawZoom</td><td>绘制过程中是否禁止滑轮缩放</td></tr><tr><td>autoFeatureSelect</td><td>默认是否双击选中feature</td></tr></tbody></table><h5 id="3、添加图像层"><a href="#3、添加图像层" class="headerlink" title="3、添加图像层"></a>3、添加图像层</h5><p>为避免图像在容器中出现变形，先计算容器的宽高和图片的宽高，根据宽高比例自适应显示图片。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">&#x2F;&#x2F; 获取容器的宽高</span><br><span class="line">initWidth &#x3D; document.getElementById(&quot;AiLabelImg&quot;).clientWidth;</span><br><span class="line">initHeight &#x3D; document.getElementById(&quot;AiLabelImg&quot;).clientHeight;</span><br><span class="line">const image &#x3D; new Image();</span><br><span class="line">image.src &#x3D; imgUrl;&#x2F;&#x2F; 图片地址</span><br><span class="line">image.onload &#x3D; () &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    imgInitW &#x3D; image.width;</span><br><span class="line">    imgInitH &#x3D; image.height;</span><br><span class="line">    imgSjW &#x3D; initWidth;</span><br><span class="line">    imgSjH &#x3D; initHeight;</span><br><span class="line">    const sR &#x3D; imgInitW &#x2F; imgInitH;</span><br><span class="line">    const iR &#x3D; initWidth &#x2F; initHeight;</span><br><span class="line">    &#x2F;&#x2F; 如果图片宽度大于高度 则宽度百分百  高度自适应</span><br><span class="line">    if (sR &gt;&#x3D; iR)</span><br><span class="line">    &#123;</span><br><span class="line">        imgSjH &#x3D; Math.floor(initWidth &#x2F; imgInitW * imgInitH);</span><br><span class="line">    &#125;</span><br><span class="line">    else</span><br><span class="line">    &#123;</span><br><span class="line">        &#x2F;&#x2F; 如果图片高度大于宽度 则高度百分百  宽度自适应</span><br><span class="line">        imgSjW &#x3D; Math.floor(initHeight &#x2F; imgInitH * imgInitW);</span><br><span class="line">    &#125;</span><br><span class="line">    &#x2F;&#x2F; 图片层实例\添加</span><br><span class="line">    const gImageLayer &#x3D; new AILabel.Layer.Image(&quot;img&quot;, props.url, &#123; h: imgSjH, w: imgSjW &#125;, &#123;&#125;);</span><br><span class="line">    gMap.addLayer(gImageLayer);</span><br><span class="line">    const gFeatureLayer &#x3D; new AILabel.Layer.Feature(&#96;featureid&#96;, &#123; opacity: 1, zIndex: 4 &#125;);</span><br><span class="line">&#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="4、画矩形框"><a href="#4、画矩形框" class="headerlink" title="4、画矩形框"></a>4、画矩形框</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">const gTextStyle &#x3D; new AILabel.Style(&#123; strokeColor: &quot;#E43446&quot;, lineWeight: 2, fillColor: &quot;rgba(0,0,0,0)&quot; &#125;);</span><br><span class="line">&#x2F;&#x2F; 设置模式为矩形框</span><br><span class="line">gMap.setMode(&quot;drawRect&quot;, gTextStyle);</span><br><span class="line">&#x2F;&#x2F; 监听绘制过程 </span><br><span class="line">&#x2F;&#x2F; 绘制完成，将绘制的坐标值显示</span><br><span class="line">const count &#x3D; 0;</span><br><span class="line">gMap.events.on(&quot;geometryDrawDone&quot;, (type, points) &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    &#x2F;&#x2F; 每次画框的featureId都需要不一样，可以用count计数</span><br><span class="line">    feature &#x3D; new AILabel.Feature.Rect(&#96;rectid$&#123;count&#125;&#96;, points, &#123; name: &quot;矩形框&quot; &#125;, style);</span><br><span class="line">    gFeatureLayer.addFeature(feature);</span><br><span class="line">    count +&#x3D; 1;</span><br><span class="line">&#125;);</span><br><span class="line">&#x2F;&#x2F; 编辑完成，替换新的点坐标值</span><br><span class="line">gMap.events.on(&quot;geometryEditDone&quot;, (type, feature, newPoints) &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    feature.show();</span><br><span class="line">    feature.update(&#123; points: newPoints &#125;);</span><br><span class="line">&#125;);</span><br><span class="line">&#x2F;&#x2F; 绘制过程中，将之前的框先隐藏</span><br><span class="line">gMap.events.on(&quot;geometryEditing&quot;, (type, feature) &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    feature.hide();</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h5 id="5、完整代码"><a href="#5、完整代码" class="headerlink" title="5、完整代码"></a>5、完整代码</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br></pre></td><td class="code"><pre><span class="line">import React, &#123;</span><br><span class="line">    useImperativeHandle,</span><br><span class="line">    forwardRef,</span><br><span class="line">    useEffect</span><br><span class="line">&#125; from &quot;react&quot;;</span><br><span class="line">import styles from &quot;.&#x2F;index.less&quot;;</span><br><span class="line">import &#123; message &#125; from &quot;antd&quot;;</span><br><span class="line">import &#123; canvasToAil, aiToCanvas &#125; from &quot;@&#x2F;utils&#x2F;utils&quot;;</span><br><span class="line">import PropTypes from &quot;prop-types&quot;;</span><br><span class="line"></span><br><span class="line">const AILabel &#x3D; require(&quot;AILabel&quot;);</span><br><span class="line"></span><br><span class="line">let gMap;</span><br><span class="line">let gImageLayer;</span><br><span class="line">let count &#x3D; 0;</span><br><span class="line">let gFeatureLayer;</span><br><span class="line">let selectedFeature &#x3D; null;</span><br><span class="line">let showFlag &#x3D; true;</span><br><span class="line">let initWidth &#x3D; 700;&#x2F;&#x2F; 盒子宽</span><br><span class="line">let initHeight &#x3D; 400;&#x2F;&#x2F; 盒子的高</span><br><span class="line">let initZoom;&#x2F;&#x2F; 初始放大值</span><br><span class="line">let initCenter;&#x2F;&#x2F; 初始中心点</span><br><span class="line">let gTextStyle; &#x2F;&#x2F; 画笔样式</span><br><span class="line">let preTextStyle;</span><br><span class="line">let labelList &#x3D; [];&#x2F;&#x2F; 所有框的坐标和标签数据</span><br><span class="line">let current &#x3D; &#123;&#125;; &#x2F;&#x2F; 当前框的坐标和标签数据</span><br><span class="line">&#x2F;* 用于坐标值转换参数 *&#x2F;</span><br><span class="line">let imgInitH; &#x2F;&#x2F; 图片的初始宽度</span><br><span class="line">let imgInitW; &#x2F;&#x2F; 图片的初始高度</span><br><span class="line">let imgSjH;</span><br><span class="line">let imgSjW;</span><br><span class="line">const MONITOR_CANVAS &#x3D; (props, ref) &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    const textAndRect &#x3D; (points, created, index, isPreAnnotation) &#x3D;&gt;</span><br><span class="line">    &#123;</span><br><span class="line">        let feature;</span><br><span class="line">        let style;</span><br><span class="line">        if (isPreAnnotation &#x3D;&#x3D;&#x3D; &quot;1&quot;)</span><br><span class="line">        &#123;</span><br><span class="line">            style &#x3D; preTextStyle;</span><br><span class="line">        &#125;</span><br><span class="line">        else</span><br><span class="line">        &#123;</span><br><span class="line">            style &#x3D; gTextStyle;</span><br><span class="line">        &#125;</span><br><span class="line">        &#x2F;&#x2F; 实例化矩形形</span><br><span class="line">        if (props.type &#x3D;&#x3D;&#x3D; &quot;2&quot; || props.type &#x3D;&#x3D;&#x3D; &quot;1&quot;)</span><br><span class="line">        &#123;</span><br><span class="line">            feature &#x3D; new AILabel.Feature.Rect(&#96;rectid$&#123;count&#125;&#96;, points, &#123; name: &quot;矩形框&quot; &#125;, style);</span><br><span class="line">        &#125;</span><br><span class="line">        else if (props.type &#x3D;&#x3D;&#x3D; &quot;4&quot;)</span><br><span class="line">        &#123;</span><br><span class="line">            feature &#x3D; new AILabel.Feature.Polygon(&#96;rectid$&#123;count&#125;&#96;, points, &#123; name: &quot;多变型&quot; &#125;, style);</span><br><span class="line">        &#125;</span><br><span class="line">        gFeatureLayer.addFeature(feature);</span><br><span class="line">        count +&#x3D; 1;</span><br><span class="line">    &#125;;</span><br><span class="line">    useEffect(() &#x3D;&gt;</span><br><span class="line">    &#123;</span><br><span class="line">        if (props.url)</span><br><span class="line">        &#123;</span><br><span class="line">            initWidth &#x3D; document.getElementById(&quot;AiLabelImgWrapper&quot;).clientWidth;</span><br><span class="line">            initHeight &#x3D; document.getElementById(&quot;AiLabelImgWrapper&quot;).clientHeight;</span><br><span class="line">            const image &#x3D; new Image();</span><br><span class="line">            image.src &#x3D; props.url;</span><br><span class="line">            image.onload &#x3D; () &#x3D;&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                imgInitW &#x3D; image.width;</span><br><span class="line">                imgInitH &#x3D; image.height;</span><br><span class="line">                imgSjW &#x3D; initWidth;</span><br><span class="line">                imgSjH &#x3D; initHeight;</span><br><span class="line">                const sR &#x3D; imgInitW &#x2F; imgInitH;</span><br><span class="line">                const iR &#x3D; initWidth &#x2F; initHeight;</span><br><span class="line">                &#x2F;&#x2F; 如果图片宽度大于高度 则宽度百分百  高度自适应</span><br><span class="line">                if (sR &gt;&#x3D; iR)</span><br><span class="line">                &#123;</span><br><span class="line">                    imgSjH &#x3D; Math.floor(initWidth &#x2F; imgInitW * imgInitH);</span><br><span class="line">                &#125;</span><br><span class="line">                else</span><br><span class="line">                &#123;</span><br><span class="line">                    &#x2F;&#x2F; 如果图片高度大于宽度 则高度百分百  宽度自适应</span><br><span class="line">                    imgSjW &#x3D; Math.floor(initHeight &#x2F; imgInitH * imgInitW);</span><br><span class="line">                &#125;</span><br><span class="line">                count &#x3D; 0;</span><br><span class="line">                labelList &#x3D; [];</span><br><span class="line">                &#x2F;&#x2F; document.getElementById(&quot;AiLabelImg&quot;).style.width &#x3D; &#96;$&#123;imgSjW&#125;px&#96;;</span><br><span class="line">                &#x2F;&#x2F; document.getElementById(&quot;AiLabelImg&quot;).style.height &#x3D; &#96;$&#123;imgSjH&#125;px&#96;;</span><br><span class="line">                gMap &#x3D; new AILabel.Map(&quot;AiLabelImg&quot;, &#123; zoom: 0, cx: 0, cy: 0, zoomMax: 400 * 10, zoomMin: 400 &#x2F; 10, autoPan: true, drawZoom: true &#125;);</span><br><span class="line">                gMap.tipLayer.hideTips(); &#x2F;&#x2F; 关闭tip提示</span><br><span class="line">                &#x2F;&#x2F; 图片层实例\添加</span><br><span class="line">                gImageLayer &#x3D; new AILabel.Layer.Image(&quot;img&quot;, props.url, &#123; h: imgSjH, w: imgSjW &#125;, &#123;&#125;);</span><br><span class="line">                gMap.addLayer(gImageLayer);</span><br><span class="line">                gFeatureLayer &#x3D; new AILabel.Layer.Feature(&#96;featureid&#96;, &#123; opacity: 1, zIndex: 4 &#125;);</span><br><span class="line">                gMap.addLayer(gFeatureLayer);</span><br><span class="line">                initZoom &#x3D; gMap.getZoom();</span><br><span class="line">                initCenter &#x3D; gMap.getCenter();</span><br><span class="line">                &#x2F;&#x2F; 样式</span><br><span class="line">                gTextStyle &#x3D; new AILabel.Style(&#123; strokeColor: &quot;#E43446&quot;, lineWeight: 2, fillColor: &quot;rgba(0,0,0,0)&quot; &#125;);</span><br><span class="line">                preTextStyle &#x3D; new AILabel.Style(&#123; strokeColor: &quot;#0FA883&quot;, lineWeight: 2, fillColor: &quot;rgba(0,0,0,0)&quot; &#125;);</span><br><span class="line">                gMap.events.on(&quot;featureSelected&quot;, feature &#x3D;&gt;</span><br><span class="line">                &#123;</span><br><span class="line">                    &#x2F;&#x2F; TODO 框被选中</span><br><span class="line">                &#125;);</span><br><span class="line">                gMap.events.on(&quot;featureStatusReset&quot;, () &#x3D;&gt;</span><br><span class="line">                &#123;</span><br><span class="line">                   &#x2F;&#x2F; TODO 框失去焦点</span><br><span class="line">                &#125;);</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;, [props.url]);</span><br><span class="line">    useImperativeHandle(ref, () &#x3D;&gt; (&#123;</span><br><span class="line">        &#x2F;&#x2F; 窗口自适应</span><br><span class="line">        autoWindow()</span><br><span class="line">        &#123;</span><br><span class="line">            gMap.centerAndZoom(initCenter, initZoom);</span><br><span class="line">        &#125;,</span><br><span class="line">        &#x2F;&#x2F;回复浏览模式</span><br><span class="line">        autoWidth()</span><br><span class="line">        &#123;</span><br><span class="line">            gMap.setMode(&quot;pan&quot;);</span><br><span class="line">        &#125;,</span><br><span class="line">        &#x2F;&#x2F; 原始尺寸</span><br><span class="line">        initWidth()</span><br><span class="line">        &#123;</span><br><span class="line">            gMap.centerAndZoom(initCenter, initZoom);</span><br><span class="line">        &#125;,</span><br><span class="line">        imgZoomIn()</span><br><span class="line">        &#123;</span><br><span class="line">            gMap.zoomIn();</span><br><span class="line">        &#125;,</span><br><span class="line">        imgZoomOut()</span><br><span class="line">        &#123;</span><br><span class="line">            gMap.zoomOut();</span><br><span class="line">        &#125;,</span><br><span class="line">        draw()</span><br><span class="line">        &#123;</span><br><span class="line">            if (gFeatureLayer)</span><br><span class="line">            &#123;</span><br><span class="line">                if (props.type &#x3D;&#x3D;&#x3D; &quot;2&quot; || props.type &#x3D;&#x3D;&#x3D; &quot;1&quot;)</span><br><span class="line">                &#123;</span><br><span class="line">                    gMap.setMode(&quot;drawRect&quot;, gTextStyle);</span><br><span class="line">                &#125;</span><br><span class="line">                else if (props.type &#x3D;&#x3D;&#x3D; &quot;4&quot;)</span><br><span class="line">                &#123;</span><br><span class="line">                    gMap.setMode(&quot;drawPolygon&quot;, gTextStyle);</span><br><span class="line">                &#125;</span><br><span class="line">                gMap.events.on(&quot;geometryDrawDone&quot;, (type, points) &#x3D;&gt;</span><br><span class="line">                &#123;</span><br><span class="line">                    textAndRect(points, true, 0, null, &quot;0&quot;);</span><br><span class="line">                &#125;);</span><br><span class="line">                gMap.events.on(&quot;geometryEditDone&quot;, (type, feature, newPoints) &#x3D;&gt;</span><br><span class="line">                &#123;</span><br><span class="line">                    feature.show();</span><br><span class="line">                    feature.update(&#123; points: newPoints &#125;);</span><br><span class="line">                &#125;);</span><br><span class="line">                gMap.events.on(&quot;geometryEditing&quot;, (type, feature) &#x3D;&gt;</span><br><span class="line">                &#123;</span><br><span class="line">                    feature.hide();</span><br><span class="line">                &#125;);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        &#x2F;&#x2F; 复制框</span><br><span class="line">        copyLabel()</span><br><span class="line">        &#123;</span><br><span class="line">            if (selectedFeature &#x3D;&#x3D;&#x3D; null)</span><br><span class="line">            &#123;</span><br><span class="line">                message.error(&quot;未选择框进行复制操作&quot;);</span><br><span class="line">            &#125;</span><br><span class="line">            else</span><br><span class="line">            &#123;</span><br><span class="line">                const copyPoint &#x3D; [];</span><br><span class="line">                selectedFeature.points.forEach(item &#x3D;&gt;</span><br><span class="line">                &#123;</span><br><span class="line">                    copyPoint.push(&#123;</span><br><span class="line">                        x: item.x + 10,</span><br><span class="line">                        y: item.y - 10</span><br><span class="line">                    &#125;);</span><br><span class="line">                &#125;);</span><br><span class="line">                selectedFeature.deActive();</span><br><span class="line">                textAndRect(copyPoint, true, 0, null, &quot;0&quot;);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        &#x2F;&#x2F; 删除框</span><br><span class="line">        deleteLabel()</span><br><span class="line">        &#123;</span><br><span class="line">            if (selectedFeature &#x3D;&#x3D;&#x3D; null)</span><br><span class="line">            &#123;</span><br><span class="line">                message.error(&quot;未选择框进行删除操作&quot;);</span><br><span class="line">            &#125;</span><br><span class="line">            else</span><br><span class="line">            &#123;</span><br><span class="line">                &#x2F;&#x2F; 修改操作</span><br><span class="line">                gFeatureLayer.removeFeature(selectedFeature);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        showHideAll()</span><br><span class="line">        &#123;</span><br><span class="line">            const allFeatures &#x3D; gFeatureLayer.getAllFeatures(); &#x2F;&#x2F; 返回所有要素数据</span><br><span class="line">            allFeatures.forEach(feature &#x3D;&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                if (showFlag)</span><br><span class="line">                &#123;</span><br><span class="line">                    feature.hide();</span><br><span class="line">                &#125;</span><br><span class="line">                else</span><br><span class="line">                &#123;</span><br><span class="line">                    feature.show();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;);</span><br><span class="line">            showFlag &#x3D; !showFlag;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;));</span><br><span class="line"></span><br><span class="line">    return (</span><br><span class="line">        &lt;div id&#x3D;&quot;AiLabelImgWrapper&quot; className&#x3D;&#123;styles[&quot;ailabel-img&quot;]&#125;&gt;</span><br><span class="line">            &lt;div id&#x3D;&quot;AiLabelImg&quot; className&#x3D;&#123;styles[&quot;ailabel-img&quot;]&#125;&gt;&lt;&#x2F;div&gt;</span><br><span class="line">        &lt;&#x2F;div&gt;</span><br><span class="line">    );</span><br><span class="line">&#125;;</span><br><span class="line">export default forwardRef(MONITOR_CANVAS);</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;应用场景&quot;&gt;&lt;a href=&quot;#应用场景&quot; class=&quot;headerlink&quot; title=&quot;应用场景&quot;&gt;&lt;/a&gt;应用场景&lt;/h3&gt;&lt;p&gt;对图片进行标注，包括画矩形框、多边形框和线条。&lt;a href=&quot;https://dingyang9642.github.io
      
    
    </summary>
    
    
      <category term="React" scheme="http://yoursite.com/categories/React/"/>
    
    
      <category term="react" scheme="http://yoursite.com/tags/react/"/>
    
      <category term="antd" scheme="http://yoursite.com/tags/antd/"/>
    
      <category term="ailabel" scheme="http://yoursite.com/tags/ailabel/"/>
    
  </entry>
  
  <entry>
    <title>antd+react实现断点续传</title>
    <link href="http://yoursite.com/2021/02/21/antd+react%E5%AE%9E%E7%8E%B0%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/"/>
    <id>http://yoursite.com/2021/02/21/antd+react%E5%AE%9E%E7%8E%B0%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/</id>
    <published>2021-02-21T05:03:00.000Z</published>
    <updated>2021-08-12T07:13:40.781Z</updated>
    
    <content type="html"><![CDATA[<h3 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h3><p>文件上传之后，获得文件的唯一标识（MD5值），将文件切割成多个分块，根据文件标识查询文件未上传的分块，所有分块上传完之后，将分块进行合并。</p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><h5 id="1、上传文件"><a href="#1、上传文件" class="headerlink" title="1、上传文件"></a>1、上传文件</h5><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> uploadProps = &#123;</span><br><span class="line">    name: <span class="string">"file"</span>,</span><br><span class="line">    accept: <span class="string">".zip"</span>,</span><br><span class="line">    maxCount: <span class="number">1</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Dragger</span> &#123;<span class="attr">...uploadProps</span>&#125;&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">className</span>=<span class="string">"ant-upload-drag-icon"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">InboxOutlined</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">className</span>=<span class="string">"ant-upload-text"</span>&gt;</span>点击或将文件拖拽到这里上传<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">className</span>=<span class="string">"ant-upload-hint"</span>&gt;</span></span><br><span class="line">    支持文件扩展名：.zip</span><br><span class="line">    <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Dragger</span>&gt;</span></span><br></pre></td></tr></table></figure><h5 id="2、文件预处理"><a href="#2、文件预处理" class="headerlink" title="2、文件预处理"></a>2、文件预处理</h5><p>在文件上传之前，beforeUpload里对文件进行切割预处理</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line">&#x2F;&#x2F; 兼容性的处理</span><br><span class="line">           const blobSlice &#x3D; File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;</span><br><span class="line">           const chunkSize &#x3D; 1024 * 1024 * 5; &#x2F;&#x2F; 切片每次5M</span><br><span class="line">           const chunks &#x3D; Math.ceil(file.size &#x2F; chunkSize);</span><br><span class="line">           let currentChunk &#x3D; 0; &#x2F;&#x2F; 当前上传的chunk</span><br><span class="line">           const spark &#x3D; new SparkMD5.ArrayBuffer();</span><br><span class="line">           &#x2F;&#x2F; 对arrayBuffer数据进行md5加密，产生一个md5字符串</span><br><span class="line">           const chunkFileReader &#x3D; new FileReader(); &#x2F;&#x2F; 用于计算出每个chunkMd5</span><br><span class="line">           const params &#x3D; &#123; chunks: [], file: &#123;&#125;&#125;; &#x2F;&#x2F; 用于上传所有分片的md5信息</span><br><span class="line">           const arrayBufferDataT &#x3D; []; &#x2F;&#x2F; 用于存储每个chunk的arrayBuffer对象,用于分片上传使用</span><br><span class="line">&#x2F;* 文件合并所需参数 *&#x2F;</span><br><span class="line">           params.file.fileName &#x3D; file.name; &#x2F;&#x2F; 文件名</span><br><span class="line">           params.file.totalSize &#x3D; file.size; &#x2F;&#x2F; 文件总大小</span><br><span class="line">           params.file.fileType &#x3D; file.type; &#x2F;&#x2F; 文件类型</span><br><span class="line">           params.file.relativePath &#x3D; file.name; &#x2F;&#x2F; 相对路径</span><br><span class="line">           params.file.refProjectId &#x3D; &quot;dbxt-sf-gd-sz&quot;; &#x2F;&#x2F; 文件唯一标识</span><br><span class="line"></span><br><span class="line">           function loadNext()</span><br><span class="line">           &#123;</span><br><span class="line">               const start &#x3D; currentChunk * chunkSize;</span><br><span class="line">               const end &#x3D; ((start + chunkSize) &gt;&#x3D; file.size) ? file.size : start + chunkSize;</span><br><span class="line">               chunkFileReader.readAsArrayBuffer(blobSlice.call(file, start, end));</span><br><span class="line">           &#125;</span><br><span class="line">           loadNext();</span><br><span class="line">           let identifier;</span><br><span class="line">           chunkFileReader.onload &#x3D; function(e)</span><br><span class="line">           &#123;</span><br><span class="line">               &#x2F;&#x2F; 对每一片分片进行md5加密</span><br><span class="line">               if (currentChunk &#x3D;&#x3D;&#x3D; 0)</span><br><span class="line">               &#123;</span><br><span class="line">                   spark.append(e.target.result);</span><br><span class="line">                   identifier &#x3D; spark.end();</span><br><span class="line">               &#125;</span><br><span class="line">               &#x2F;&#x2F; 每一个分片需要包含的信息</span><br><span class="line">               const obj &#x3D; &#123;</span><br><span class="line">                   totalSize: file.size,</span><br><span class="line">                   relativePath: file.name,</span><br><span class="line">                   chunkNumber: currentChunk + 1, &#x2F;&#x2F; 块编号</span><br><span class="line">                   fileName: file.name,</span><br><span class="line">                   identifier, &#x2F;&#x2F; 块编号</span><br><span class="line">                   totalChunks: chunks, &#x2F;&#x2F; 总分片数</span><br><span class="line">                   chunkSize, &#x2F;&#x2F; 块大小</span><br><span class="line">                   currentChunkSize: ((currentChunk * chunkSize + chunkSize) &gt;&#x3D; file.size) ? file.size - currentChunk * chunkSize : chunkSize &#x2F;&#x2F; 当前块大小</span><br><span class="line">               &#125;;</span><br><span class="line">               &#x2F;&#x2F; 每一次分片onload,currentChunk都需要增加，以便来计算分片的次数</span><br><span class="line">               currentChunk +&#x3D; 1;</span><br><span class="line">               params.chunks.push(obj);</span><br><span class="line"></span><br><span class="line">               &#x2F;&#x2F; 将每一块分片的arrayBuffer存储起来，用来partUpload</span><br><span class="line">               const tmp &#x3D; &#123;</span><br><span class="line">                   chunk: obj.chunkNumber,</span><br><span class="line">                   currentBuffer: e.target.result</span><br><span class="line">               &#125;;</span><br><span class="line">               arrayBufferDataT.push(tmp);</span><br><span class="line">               if (currentChunk &lt; chunks)</span><br><span class="line">               &#123;</span><br><span class="line">               &#x2F;&#x2F; 当前切片总数没有达到总数时</span><br><span class="line">                   loadNext();</span><br><span class="line">                   &#x2F;&#x2F; 计算预处理进度</span><br><span class="line">                   setpreUploading(true);</span><br><span class="line">                   setpreUploadPercent(Number((currentChunk &#x2F; chunks * 100).toFixed(2)));</span><br><span class="line">               &#125;</span><br><span class="line">               else</span><br><span class="line">               &#123;</span><br><span class="line">                   setchunksSize(chunks);</span><br><span class="line">                   setpreUploadPercent(100);</span><br><span class="line">                   setFileList([file]);</span><br><span class="line">                   &#x2F;&#x2F; 记录所有chunks的长度</span><br><span class="line">                   params.file.identifier &#x3D; identifier;</span><br><span class="line">                   params.file.fileChunks &#x3D; params.chunks.length;</span><br><span class="line">                   &#x2F;&#x2F; 表示预处理结束，将上传的参数，arrayBuffer的数据存储起来</span><br><span class="line">                   setarrayBufferData(arrayBufferDataT);</span><br><span class="line">                   setpreUploading(false);</span><br><span class="line">                   setuploadParams(params);</span><br><span class="line">               &#125;</span><br><span class="line">           &#125;;</span><br><span class="line"></span><br><span class="line">           chunkFileReader.onerror &#x3D; function()</span><br><span class="line">           &#123;</span><br><span class="line">               console.warn(&quot;oops, something went wrong.&quot;);</span><br><span class="line">           &#125;;</span><br></pre></td></tr></table></figure><h5 id="3、上传分块"><a href="#3、上传分块" class="headerlink" title="3、上传分块"></a>3、上传分块</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">try</span><br><span class="line">&#123;</span><br><span class="line">    &#x2F;&#x2F; 判断是否上传</span><br><span class="line">    const data &#x3D; await examChunk(chunks[0]);</span><br><span class="line">    let &#123; uploadedChunks &#125; &#x3D; data || []; &#x2F;&#x2F; 已上传文件</span><br><span class="line">    uploadedChunks &#x3D; Array.from(new Set(uploadedChunks));</span><br><span class="line">    if (uploadedChunks.length &#x3D;&#x3D;&#x3D; uploadParams.file.fileChunks || data.skipUpload) &#x2F;&#x2F; 如果全部文件快已上传 则直接完成 实现秒传</span><br><span class="line">    &#123;</span><br><span class="line">        setuploadPercent(100); &#x2F;&#x2F; 文件上传进度</span><br><span class="line">        mergeFile();&#x2F;&#x2F; 合并文件</span><br><span class="line">    &#125;</span><br><span class="line">    else</span><br><span class="line">    &#123;</span><br><span class="line">        setuploadPercent(Number((uploadedChunks.length &#x2F; uploadParams.file.fileChunks * 100).toFixed(2)));</span><br><span class="line">        const uploadList &#x3D; chunks.filter(item &#x3D;&gt; &#123; return uploadedChunks.indexOf(item.chunkNumber) &lt; 0; &#125;);&#x2F;&#x2F; 过滤出未上传分片</span><br><span class="line">        handlePartUpload(uploadList, uploadList.length); &#x2F;&#x2F; 分片上传</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">catch (error)</span><br><span class="line">&#123;</span><br><span class="line">    console.log(error);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">&#x2F;&#x2F; 分片上传</span><br><span class="line">const handlePartUpload &#x3D; (uploadList, currentChunks) &#x3D;&gt;</span><br><span class="line">    &#123;</span><br><span class="line">        let current &#x3D; currentChunks;</span><br><span class="line">        uploadList.forEach(async(element) &#x3D;&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            const blobSlice &#x3D; File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;</span><br><span class="line">            const &#123; identifier, chunkNumber &#125; &#x3D; element;</span><br><span class="line">            const formData &#x3D; new FormData();</span><br><span class="line">            &#x2F;&#x2F; 新建一个Blob对象，将对应分片的arrayBuffer加入Blob中</span><br><span class="line">            const blob &#x3D; new Blob([arrayBufferData[chunkNumber - 1].currentBuffer], &#123; type: &quot;application&#x2F;octet-stream&quot; &#125;);</span><br><span class="line">            &#x2F;&#x2F; 将生成blob塞入到formdata中传入服务端</span><br><span class="line">            formData.append(&quot;upfile&quot;, blob, identifier);</span><br><span class="line">            Object.keys(element).forEach(el &#x3D;&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                formData.append(el, element[el]);</span><br><span class="line">            &#125;);</span><br><span class="line">            try</span><br><span class="line">            &#123;</span><br><span class="line">                const uploadData &#x3D; await upload(formData);</span><br><span class="line">                if (uploadData &#x3D;&#x3D;&#x3D; 200)</span><br><span class="line">                &#123;</span><br><span class="line">                    current -&#x3D; 1;</span><br><span class="line">                    setuploadPercent(Number(((uploadParams.file.fileChunks - current) &#x2F; uploadParams.file.fileChunks * 100).toFixed(2)));</span><br><span class="line">                    if (current &#x3D;&#x3D;&#x3D; 0)</span><br><span class="line">                    &#123;</span><br><span class="line">                        mergeFile();</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                else</span><br><span class="line">                &#123;</span><br><span class="line">                    setUploadFailed(true);</span><br><span class="line">                    setspinning(false);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            catch (error)</span><br><span class="line">            &#123;</span><br><span class="line">                setUploadFailed(true);</span><br><span class="line">                setspinning(false);</span><br><span class="line">                console.log(error);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;;</span><br></pre></td></tr></table></figure><h5 id="4、合并文件块"><a href="#4、合并文件块" class="headerlink" title="4、合并文件块"></a>4、合并文件块</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">const mergeFile &#x3D; async() &#x3D;&gt;</span><br><span class="line">&#123;</span><br><span class="line">    try</span><br><span class="line">    &#123;</span><br><span class="line">        const mergeData &#x3D; await merge(uploadParams.file);</span><br><span class="line">        if (mergeData.id)</span><br><span class="line">        &#123;</span><br><span class="line">            &#x2F;&#x2F; setUpfileId(mergeData.id);</span><br><span class="line">            &#x2F;&#x2F; message.success(&#39;上传成功&#39;);</span><br><span class="line">            createData(mergeData.id);</span><br><span class="line">            setuploading(false);</span><br><span class="line">            setuploaded(true);</span><br><span class="line">        &#125;</span><br><span class="line">        else</span><br><span class="line">        &#123;</span><br><span class="line">            setspinning(false);</span><br><span class="line">            setUploadFailed(true);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    catch (error)</span><br><span class="line">    &#123;</span><br><span class="line">        setspinning(false);</span><br><span class="line">        setUploadFailed(true);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;应用场景&quot;&gt;&lt;a href=&quot;#应用场景&quot; class=&quot;headerlink&quot; title=&quot;应用场景&quot;&gt;&lt;/a&gt;应用场景&lt;/h3&gt;&lt;p&gt;文件上传之后，获得文件的唯一标识（MD5值），将文件切割成多个分块，根据文件标识查询文件未上传的分块，所有分块上传完之后，将
      
    
    </summary>
    
    
      <category term="React" scheme="http://yoursite.com/categories/React/"/>
    
    
      <category term="断点续传" scheme="http://yoursite.com/tags/%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/"/>
    
      <category term="react" scheme="http://yoursite.com/tags/react/"/>
    
      <category term="antd" scheme="http://yoursite.com/tags/antd/"/>
    
  </entry>
  
  <entry>
    <title>canvas画布实现烟花绽放效果</title>
    <link href="http://yoursite.com/2020/11/28/canvas%E7%94%BB%E5%B8%83%E5%AE%9E%E7%8E%B0%E7%83%9F%E8%8A%B1%E7%BB%BD%E6%94%BE%E6%95%88%E6%9E%9C/"/>
    <id>http://yoursite.com/2020/11/28/canvas%E7%94%BB%E5%B8%83%E5%AE%9E%E7%8E%B0%E7%83%9F%E8%8A%B1%E7%BB%BD%E6%94%BE%E6%95%88%E6%9E%9C/</id>
    <published>2020-11-28T06:22:00.000Z</published>
    <updated>2021-04-06T08:26:10.998Z</updated>
    
    <content type="html"><![CDATA[<h3 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h3><p><img src="http://image.berlin4h.top/images/2020/11/27/GIF-2020-11-27--17-48-40.gif" alt=""></p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>项目有个场景需求是要实现点击时，出现烟花绽放的效果，在网上百度了很多关于烟花的效果图，免费的不好看，好看的要钱，贫穷的打工人选择自己上手。</p><h3 id="实现步骤"><a href="#实现步骤" class="headerlink" title="实现步骤"></a>实现步骤</h3><h5 id="1、分解"><a href="#1、分解" class="headerlink" title="1、分解"></a>1、分解</h5><p>将所有烟花都分解成一个类似水滴形状的瓣，控制它的大小、坐标和旋转角度，叠加在一起就成了一朵好看的烟花。一个瓣可以看做是两条弯曲的曲线构成，曲线可由三次贝塞尔曲线绘制。</p><h5 id="2、水平绘制"><a href="#2、水平绘制" class="headerlink" title="2、水平绘制"></a>2、水平绘制</h5><p>假设初始坐标值为（x，y），瓣的宽度为w，高度为h，第一个拐角点设在宽度0.9位置（经过我的多次测试，这个位置绘制出的烟花最好看！）。</p><p><img src="http://image.berlin4h.top/images/2020/11/28/20201128112506.png" alt=""></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ctx.beginPath();</span><br><span class="line">ctx.moveTo(x,y); &#x2F;&#x2F; 先将点放到初始坐标值</span><br><span class="line">ctx.bezierCurveTo(x+w*0.9，y-h&#x2F;2，x+w, y-h&#x2F;2, x+w,y); </span><br><span class="line">ctx.bezierCurveTo(x+w,y+h&#x2F;2,x+w*0.9,y+h&#x2F;2,x,y);&#x2F;&#x2F; 第二条曲线以第一条曲线的结束点为起始点</span><br></pre></td></tr></table></figure><h5 id="3、旋转角度"><a href="#3、旋转角度" class="headerlink" title="3、旋转角度"></a>3、旋转角度</h5><p>假设旋转角度为45度，如图计算出每个坐标的坐标值。</p><p><img src="http://image.berlin4h.top/images/2020/11/28/20201128120150.png" alt=""></p><h5 id="4、花瓣合成"><a href="#4、花瓣合成" class="headerlink" title="4、花瓣合成"></a>4、花瓣合成</h5><p>一层烟花由八朵烟花花瓣组成，分为左、右、上、下、左上、右上、左下、右下。由于canvas画布的坐标只有正数没有负数，因此可以计算出：</p><p>// 左 及 左上<br>目标横坐标 = 初始位置横坐标 - 对应点横坐标<br>目标纵坐标 = 初始位置纵坐标 - 对应点点纵坐标<br>// 上 及 右上<br>目标横坐标 = 初始位置横坐标 + 对应点点横坐标<br>目标纵坐标 = 初始位置纵坐标 - 对应点点纵坐标<br>// 右 及 右下<br>目标横坐标 = 初始位置横坐标 + 对应点点横坐标<br>目标纵坐标 = 初始位置纵坐标 + 对应点点纵坐标<br>// 下 及 左下<br>目标横坐标 = 初始位置横坐标 - 对应点点横坐标<br>目标纵坐标 = 初始位置纵坐标 + 对应点点纵坐标</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 假设a为偏移的角度，（x，y)为起始点坐标值，h为花瓣高度，w为花瓣宽度</span></span><br><span class="line"><span class="comment">// 左边花瓣代码示例</span></span><br><span class="line"><span class="keyword">var</span> angel = a;<span class="comment">//偏移的角度</span></span><br><span class="line"><span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p1x = x - ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line"><span class="keyword">var</span> p1y = y - (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line"><span class="keyword">var</span> p2x = x - ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line"><span class="keyword">var</span> p2y = y - (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line"><span class="keyword">var</span> p3x = x - w * cosAngel;</span><br><span class="line"><span class="keyword">var</span> p3y = y - w * sinAngel;</span><br><span class="line"><span class="keyword">var</span> p4x = x - ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line"><span class="keyword">var</span> p4y = y - (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line"><span class="keyword">var</span> p5x = x - ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line"><span class="keyword">var</span> p5y = y - (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">ctx.beginPath();</span><br><span class="line">ctx.moveTo(x,y);</span><br><span class="line">ctx.stroke();</span><br><span class="line">ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">ctx.closePath();</span><br><span class="line">ctx.fillStyle = color;</span><br><span class="line">ctx.fill();</span><br></pre></td></tr></table></figure><h5 id="5、圆点坐标值"><a href="#5、圆点坐标值" class="headerlink" title="5、圆点坐标值"></a>5、圆点坐标值</h5><p>烟花可看做一圈一圈不同半径上的点为起始坐标的花瓣组成，每一圈有八个花瓣，根据三角函数可计算出点的坐标。</p><p><img src="http://image.berlin4h.top/images/2020/11/28/20201128135626.png" alt=""></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 假设偏移角度为angle，圆心坐标为(x,y)，半径为r</span></span><br><span class="line"><span class="comment">// 左</span></span><br><span class="line"><span class="keyword">var</span> p1x = x - r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p1y = y - r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="comment">// 右</span></span><br><span class="line"><span class="keyword">var</span> p2x = x + r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p2y = y + r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="comment">// 上</span></span><br><span class="line"><span class="keyword">var</span> p3x = x + r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p3y = y - r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="comment">// 下</span></span><br><span class="line"><span class="keyword">var</span> p4x = x - r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p4y = y + r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="comment">// 左上</span></span><br><span class="line"><span class="keyword">var</span> p5x = x - r * <span class="built_in">Math</span>.cos((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p5y = y - r * <span class="built_in">Math</span>.sin((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="comment">// 右上</span></span><br><span class="line"><span class="keyword">var</span> p6x = x + r * <span class="built_in">Math</span>.cos((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p6y = y - r * <span class="built_in">Math</span>.sin((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="comment">// 左下</span></span><br><span class="line"><span class="keyword">var</span> p7x = x - r * <span class="built_in">Math</span>.cos((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p7y = y + r * <span class="built_in">Math</span>.sin((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="comment">// 右下</span></span><br><span class="line"><span class="keyword">var</span> p8x = x + r * <span class="built_in">Math</span>.cos((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line"><span class="keyword">var</span> p8y = y + r * <span class="built_in">Math</span>.sin((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br></pre></td></tr></table></figure><h5 id="6、最终实现"><a href="#6、最终实现" class="headerlink" title="6、最终实现"></a>6、最终实现</h5><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 圆心横坐标、    圆心纵坐标、   半径、   偏移角度、     瓣高  、     瓣宽、    颜色 </span></span><br><span class="line"><span class="comment">// 第一圈</span></span><br><span class="line">calcEight(pointR, pointR, canvasW * <span class="number">0.05</span>, <span class="number">1</span>,canvasW * <span class="number">0.02</span>, canvasW * <span class="number">0.15</span>, <span class="string">"#E4AF6A"</span>);</span><br><span class="line">calcEight(pointR, pointR, canvasW * <span class="number">0.05</span>, <span class="number">11</span>,canvasW * <span class="number">0.02</span>, canvasW * <span class="number">0.15</span>, <span class="string">"#F8EEB0"</span>);</span><br><span class="line"><span class="comment">// 第二圈</span></span><br><span class="line">calcEight(pointR, pointR, canvasW * <span class="number">0.1</span>, <span class="number">28</span>,canvasW * <span class="number">0.08</span>, canvasW * <span class="number">0.35</span>, <span class="string">"#E4AF6A"</span>);</span><br><span class="line">calcEight(pointR, pointR, canvasW * <span class="number">0.1</span>, <span class="number">36</span>,canvasW * <span class="number">0.08</span>, canvasW * <span class="number">0.35</span>, <span class="string">"#F8EEB0"</span>);</span><br><span class="line"><span class="comment">// 第三圈</span></span><br><span class="line">calcEight(pointR, pointR, canvasW * <span class="number">0.075</span>, <span class="number">20</span>,canvasW * <span class="number">0.058</span>, canvasW * <span class="number">0.3</span>, <span class="string">"#E4AF6A"</span>);</span><br><span class="line">calcEight(pointR, pointR, canvasW * <span class="number">0.075</span>, <span class="number">28</span>,canvasW * <span class="number">0.058</span>, canvasW * <span class="number">0.3</span>, <span class="string">"#F8EEB0"</span>);</span><br><span class="line"><span class="comment">// 第四圈</span></span><br><span class="line">calcEight(pointR, pointR,  canvasW * <span class="number">0.29</span>, <span class="number">9</span>,canvasW * <span class="number">0.03</span>, canvasW * <span class="number">0.2</span>, <span class="string">"#E4AF6A"</span>);</span><br><span class="line">calcEight(pointR, pointR,  canvasW * <span class="number">0.29</span>, <span class="number">1</span>,canvasW * <span class="number">0.03</span>, canvasW * <span class="number">0.2</span>, <span class="string">"#F8EEB0"</span>);</span><br><span class="line"><span class="comment">// 左</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw1</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = a;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x - ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y - (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x - ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y - (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x - w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y - w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x - ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y - (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x - ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y - (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.stroke();</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 右</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw2</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = a;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x + ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y + (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x + ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y + (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x + w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y + w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x + ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y + (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x + ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y + (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 上</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw3</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = <span class="number">90</span> - a;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x + ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y - (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x + ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y - (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x + w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y - w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x + ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y - (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x + ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y - (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 下</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw4</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = <span class="number">90</span> - a;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x - ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y + (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x - ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y + (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x - w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y + w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x - ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y + (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x - ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y + (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 左上</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw5</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = a + <span class="number">45</span>;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x - ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y - (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x - ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y - (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x - w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y - w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x - ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y - (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x - ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y - (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.stroke();</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 右上</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw6</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = <span class="number">45</span> - a;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x + ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y - (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x + ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y - (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x + w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y - w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x + ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y - (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x + ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y - (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 左下</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw7</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = <span class="number">45</span> - a;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x - ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y + (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x - ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y + (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x - w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y + w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x - ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y + (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x - ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y + (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 右下</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">draw8</span>(<span class="params">x,y,h,w, r,a,color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">var</span> angel = <span class="number">45</span> + a;</span><br><span class="line">    <span class="keyword">var</span> sinAngel = <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> cosAngel = <span class="built_in">Math</span>.cos(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> tanAngel = <span class="built_in">Math</span>.tan(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> hypotenuse = h / <span class="number">2</span> / <span class="built_in">Math</span>.sin(angel*<span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1x = x + ((w * rate - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p1y = y + (w * rate - h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p2x = x + ((w - h / <span class="number">2</span> / tanAngel) * cosAngel + hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p2y = y + (w - h / <span class="number">2</span> / tanAngel) * sinAngel ;</span><br><span class="line">    <span class="keyword">var</span> p3x = x + w * cosAngel;</span><br><span class="line">    <span class="keyword">var</span> p3y = y + w * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p4x = x + ((w + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p4y = y + (w + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    <span class="keyword">var</span> p5x = x + ((w * rate + h / <span class="number">2</span> / tanAngel) * cosAngel - hypotenuse);</span><br><span class="line">    <span class="keyword">var</span> p5y = y + (w * rate + h / <span class="number">2</span> / tanAngel) * sinAngel;</span><br><span class="line">    ctx.beginPath();</span><br><span class="line">    ctx.moveTo(x,y);</span><br><span class="line">    ctx.bezierCurveTo(p1x,p1y,p2x, p2y,p3x,p3y);</span><br><span class="line">    ctx.bezierCurveTo(p4x, p4y,p5x,p5y,x,y);</span><br><span class="line">    ctx.closePath();</span><br><span class="line">    ctx.fillStyle = color;</span><br><span class="line">    ctx.fill();</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">calcEight</span>(<span class="params">x,y,r, angle,h, w, color</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// 左</span></span><br><span class="line">    <span class="keyword">var</span> p1x = x - r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p1y = y - r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 右</span></span><br><span class="line">    <span class="keyword">var</span> p2x = x + r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p2y = y + r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 上</span></span><br><span class="line">    <span class="keyword">var</span> p3x = x + r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p3y = y - r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 下</span></span><br><span class="line">    <span class="keyword">var</span> p4x = x - r * <span class="built_in">Math</span>.sin(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p4y = y + r * <span class="built_in">Math</span>.cos(angle * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 左上</span></span><br><span class="line">    <span class="keyword">var</span> p5x = x - r * <span class="built_in">Math</span>.cos((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p5y = y - r * <span class="built_in">Math</span>.sin((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 右上</span></span><br><span class="line">    <span class="keyword">var</span> p6x = x + r * <span class="built_in">Math</span>.cos((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p6y = y - r * <span class="built_in">Math</span>.sin((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 左下</span></span><br><span class="line">    <span class="keyword">var</span> p7x = x - r * <span class="built_in">Math</span>.cos((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p7y = y + r * <span class="built_in">Math</span>.sin((<span class="number">45</span> - angle) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 右下</span></span><br><span class="line">    <span class="keyword">var</span> p8x = x + r * <span class="built_in">Math</span>.cos((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="keyword">var</span> p8y = y + r * <span class="built_in">Math</span>.sin((angle + <span class="number">45</span>) * <span class="built_in">Math</span>.PI / <span class="number">180</span>);</span><br><span class="line">    <span class="comment">// 左</span></span><br><span class="line">    draw1(p1x, p1y, h, w, <span class="built_in">Math</span>.PI,angle,color);</span><br><span class="line">    <span class="comment">// 右</span></span><br><span class="line">    draw2(p2x, p2y, h, w, <span class="built_in">Math</span>.PI,angle,color);</span><br><span class="line">    <span class="comment">// 上</span></span><br><span class="line">    draw3(p3x, p3y, h, w, <span class="built_in">Math</span>.PI / <span class="number">2</span>,angle,color);</span><br><span class="line">    <span class="comment">// 下</span></span><br><span class="line">    draw4(p4x, p4y, h, w, <span class="built_in">Math</span>.PI / <span class="number">2</span>,angle,color);</span><br><span class="line">    <span class="comment">// 左上</span></span><br><span class="line">    draw5(p5x, p5y, h, w, <span class="built_in">Math</span>.PI,angle,color);</span><br><span class="line">    <span class="comment">// 右上</span></span><br><span class="line">    draw6(p6x, p6y, h, w, <span class="built_in">Math</span>.PI,angle,color);</span><br><span class="line">    <span class="comment">// 左下</span></span><br><span class="line">    draw7(p7x, p7y, h, w, <span class="built_in">Math</span>.PI / <span class="number">2</span>,angle,color);</span><br><span class="line">    <span class="comment">// 右下</span></span><br><span class="line">    draw8(p8x, p8y, h, w, <span class="built_in">Math</span>.PI / <span class="number">2</span>,angle,color);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="7、动画效果"><a href="#7、动画效果" class="headerlink" title="7、动画效果"></a>7、动画效果</h5><p>将画布的大小分成30，每50ms加一份，以此来改变每个花瓣的大小以及初始坐标的位置，达到逐渐变大的动画效果。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> pointR = canvasWidth / <span class="number">2</span>;</span><br><span class="line"><span class="keyword">var</span> cw = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">var</span> aT = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">var</span> cwSpeed = canvasWidth / <span class="number">30</span>;<span class="comment">// 画布大小增长速度</span></span><br><span class="line"><span class="keyword">var</span> aSpeed = <span class="number">45</span> / <span class="number">30</span>;</span><br><span class="line"><span class="keyword">var</span> timer = setInterval(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(cw &lt; canvasWidth)</span><br><span class="line">    &#123;</span><br><span class="line">        cw += cwSpeed;</span><br><span class="line">        ctx.clearRect(<span class="number">0</span>, <span class="number">0</span>, canvasWidth, canvasWidth);</span><br><span class="line">        ctx.fill();</span><br><span class="line">        draw(cw, pointR, aT);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        ctx.globalAlpha = <span class="number">0</span>;</span><br><span class="line">        clearInterval(timer);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;, <span class="number">50</span>);</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;效果图&quot;&gt;&lt;a href=&quot;#效果图&quot; class=&quot;headerlink&quot; title=&quot;效果图&quot;&gt;&lt;/a&gt;效果图&lt;/h3&gt;&lt;p&gt;&lt;img src=&quot;http://image.berlin4h.top/images/2020/11/27/GIF-2020-11-
      
    
    </summary>
    
    
      <category term="CSS" scheme="http://yoursite.com/categories/CSS/"/>
    
    
      <category term="css" scheme="http://yoursite.com/tags/css/"/>
    
      <category term="canvas" scheme="http://yoursite.com/tags/canvas/"/>
    
  </entry>
  
</feed>
