网页中实现正六边形的N中姿势

1578735832 8年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/e3f700abc3bc42b4c50e3858bdead160.jpg"></p>    <p>经常在别人家的网页上看到各中好看图形,其中就有正六边形和组合的蜂窝状图形。今天我们来盘点一下,网页上有哪些姿势实现这个效果</p>    <h2>姿势1</h2>    <p>css的border</p>    <pre>  <code class="language-xml">/*css*/  .lb01 {   position: relative;   width: 200px;   height: 120px;   background-color: red;   margin: 100px;  }  .lb01:after {   content: "";   position: absolute;   display: block;   top: -160px;   width: 0;   height: 0;   border: 100px solid transparent;   border-bottom: 60px solid red;  }  .lb01:before {   content: "";   position: absolute;   display: block;   bottom: -160px;   width: 0;   height: 0;   border: 100px solid transparent;   border-top: 60px solid red;  }</code></pre>    <pre>  <code class="language-xml"><div class="lb01"></div></code></pre>    <p>效果如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bb2a069ed4c1dd7f278d3ede3e906c5b.png"></p>    <p> 优点:代码简单,兼容性好。缺点:内部不能完美的嵌套内容,只有填充纯色才好看.</p>    <h2>姿势2</h2>    <p>css3的transform</p>    <pre>  <code class="language-xml">.lb02 {   width: 260px;   height: 300px;   margin: 50px;   -webkit-transform: rotate(60deg);   overflow: hidden;  }  .lb02 div,  .lb02 img {   width: 100%;   height: 100%;   overflow: hidden;  }    .lb02> div {   -webkit-transform: rotate(-120deg);  }    .lb02> div> div {   -webkit-transform: rotate(60deg);  }</code></pre>    <pre>  <code class="language-xml"><div class="lb02">   <div>    <div>     <img src="000.png" />    </div>   </div>  </div></code></pre>    <p>效果如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7b0e971d2850addd65c2e4968b0ea99b.png"></p>    <p>优点:内部可以嵌套图片内容。缺点:dom结构稍微多,需要对css3支持的浏览器才可以.</p>    <h2>姿势3</h2>    <p>svg的多边形</p>    <pre>  <code class="language-xml"><svg viewbox="0,0,400,400" width="400" height="400">   <polygon     points="300.0000,200.0000     250.0000,113.3975     150.0000,113.3975     100.0000,200.0000     150.0000,286.6025     250.0000,286.6025"     style="fill:lime;     stroke:purple;     stroke-width:2" />  </svg></code></pre>    <p>效果图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1e1761faf1ad836aef5e90823f7e805e.png"></p>    <p>优点:矢量图形。缺点:浏览器兼容性不理想,稍微有一点偏冷门。</p>    <p>什么?你问我上面的坐标点怎么得到的?肯定是写一点代码算出来的呀,难道手写?具体怎么算可以参考下一种方式中的代码.</p>    <h2>姿势4</h2>    <p>canvas绘图</p>    <pre>  <code class="language-xml">var canvas = document.getElementById("canvas");   canvas.width = 400;   canvas.height = 400;  var cc = canvas.getContext("2d");    // 填充一个背景  cc.fillStyle = "#31a6e2";  cc.rect(0 , 0 , 400 , 400);  cc.fill();    cc.beginPath();  for (var i = 0 ; i < 6 ; i++) {   var x =  Math.cos((i * 60)/180 * Math.PI) * 150 + 200 ;   var y = -Math.sin((i * 60)/180 * Math.PI) * 150 + 200;    cc.lineTo(x,y);  }  cc.closePath();      cc.lineWidth = 2;  cc.fillStyle = "#fc3598";  cc.fill();</code></pre>    <pre>  <code class="language-xml"><canvas id="canvas"></canvas></code></pre>    <p>效果图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9b81867730b5eb65ca08c1238c9bb6ec.png"></p>    <p>优点:还没想好。缺点:还没想好。这个我已经不知道怎么描述了.....</p>    <p>然后我们用六边形玩点有意思的:如图</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/554f257723d12460ec233206d235f40c.png"></p>    <p>代码如下:</p>    <pre>  <code class="language-xml"><!DOCTYPE html>  <html>   <head>    <meta charset="UTF-8">    <title></title>        <style type="text/css">     #test {      width: 850px;      padding: 100px;      height: 800px;      margin: 0 auto;      border: 1px solid red;      -webkit-perspective: 1920px;         -webkit-transform-origin: 50% 30% 600px;         overflow: hidden;     }          ul {      -webkit-transform-style: preserve-3d;         -webkit-transform: rotateX(60deg);     }          ul:after {      content: "";      display: block;      clear: both;     }          ul li {      position: relative;      float: left;      width: 90px;      height: 160px;      list-style: none;      margin: 0px 50px;      background-color: #21a4e8;      -webkit-transform: rotate(90deg);     }     ul li:after {      content: "";      display: block;      position: absolute;      top: 0;      right: 100%;      border-style: solid;      border: 80px solid transparent;      border-width: 80px 50px;      border-right-color: #21a4e8;         }     ul li:before {      content: "";      display: block;      position: absolute;      top: 0;      left: 100%;      border-style: solid;      border: 80px solid transparent;      border-width: 80px 50px;      border-left-color: #21a4e8;         }     .dob {      margin-left: 145px;     }         </style>       </head>   <body>    <div id="test">     <ul>      <li></li>      <li></li>      <li></li>      <li></li>      <li class="dob"></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li class="dob"></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>      <li></li>     </ul>         </div>   </body>  </html></code></pre>    <p>当然,你也发挥你的聪明才智,玩点更有意思的。如果你有新的写六边形的方式,也欢迎你补充!</p>    <p> </p>    <p>来自:https://zhuanlan.zhihu.com/p/24489820</p>    <p> </p>