国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

基于vue實現(xiàn)圓形菜單欄組件

2019-11-19 11:13:38
字體:
供稿:網(wǎng)友

整個樣式都是基于css3 得transform而實現(xiàn)得。

每個扇形角度為360/12=30deg,當然,你不想做圓形也可以,公式就是     扇形角度=你想繪制得角度/扇形個數(shù)

當你計算好每個扇形得角度時,需要將li元素傾斜,傾斜角度=90-扇形面積,我的這個傾斜角度就是90-30=60deg,然后使用css3 得skew()

 

circle-panel-1

circle-panel-2

circle-panel-3

當每個扇形傾斜60deg之后,會在原來得位置上,要想每個扇形有規(guī)律得組合在一起,那么就要旋轉(zhuǎn)相應得角度,30deg,60deg,90deg…….這個以扇形得圓心角遞加。

這是基礎(chǔ)組件得完整代碼,父組件只需導入使用傳給子組件數(shù)據(jù)就可以了,當點擊每個扇形得事件也在父組件監(jiān)聽實現(xiàn)相應的邏輯。script部分我加了js代碼和ts代碼,沒有用過ts得小伙伴就忽略直接參考js代碼就可以了。并且我調(diào)用了手勢庫hammer.js,這個庫很全,大家感興趣得可以去查一下使用方法,這樣這個圓環(huán)是可以旋轉(zhuǎn)得。

<template> <div id="cn-wrapper" :style="{transform:'rotate('+rotatePanel+'deg)'}" class="cn-wrapper" >  <ul>   <li @click="clickPanel(item)" v-for="(item,index) in panel" :key="index">    <a href="#">     <img class="li-img" :src="item.img" alt />     <div class="li-text">{{item.title}}</div>    </a>   </li>  </ul> </div></template> <script >// import { Component, Prop, Vue,Emit } from 'vue-property-decorator'; // @Component// export default class CirclePanel extends Vue {//  private rotatePanel=0;//  @Prop() panel!: any; //  mounted(){//   this.initPanel()//  } //   // 操作版//  @Emit()//  clickPanel(item:any){//   return item;//  }//  initPanel(){//   let panel=document.getElementById("cn-wrapper") as HTMLElement;//   let panelMan = new Hammer.Manager(panel);//   panelMan.add(new Hammer.Pan({//     threshold: 0//    }));//   panelMan.on('panstart', (ev: any) => {//    if (ev.center.x < panel.clientWidth/2) {//左邊//     this.rotatePanel= this.rotatePanel - ev.angle//    }else{//     this.rotatePanel= this.rotatePanel + ev.angle//     }//   });//  }// } export default {   data () {      return {         rotatePanel: 0      }   },   props: {      panel: {         type: Array,         default: [    {img:'pics-gem/1.png',title:'一月石榴石'},    {img:'pics-gem/2.png',title:'一月石榴石'},    {img:'pics-gem/3.png',title:'一月石榴石'},    {img:'pics-gem/4.png',title:'一月石榴石'},    {img:'pics-gem/5.png',title:'一月石榴石'},    {img:'pics-gem/6.png',title:'一月石榴石'},    {img:'pics-gem/7.png',title:'一月石榴石'},    {img:'pics-gem/8.png',title:'一月石榴石'},    {img:'pics-gem/9.png',title:'一月石榴石'},    {img:'pics-gem/10.png',title:'一月石榴石'},    {img:'pics-gem/11.png',title:'一月石榴石'},    {img:'pics-gem/12.png',title:'一月石榴石'},]      },   },   activated(){    this.initPanel()   },   methods: {     // 操作版     clickPanel(item){      this.$emit('clickPanel',{item})     },     initPanel(){      let panel=document.getElementById("cn-wrapper");      let panelMan = new Hammer.Manager(panel);      panelMan.add(new Hammer.Pan({        threshold: 0       }));      panelMan.on('panstart', (ev) => {       if (ev.center.x < panel.clientWidth/2) {//左邊        this.rotatePanel= this.rotatePanel - ev.angle       }else{        this.rotatePanel= this.rotatePanel + ev.angle        }      });     }   }}</script> <style scoped>.cn-wrapper { font-size: 1em; width: 24em; height: 24em; overflow: hidden; position: fixed; z-index: 10; bottom: 84px; margin-left: -288px; left: 50%; border-radius: 50%; -webkit-transform: scale(0.1); -ms-transform: scale(0.1); -moz-transform: scale(0.1); transform: scale(1); /* pointer-events: none; */ -webkit-transition: all 0.3s ease; -moz-transition: all 0.3s ease; transition: all 0.3s ease;} .cn-wrapper li { position: absolute; font-size: 1.5em; width: 10em; height: 10em; -webkit-transform-origin: 100% 100%; -moz-transform-origin: 100% 100%; -ms-transform-origin: 100% 100%; transform-origin: 100% 100%; overflow: hidden; left: 50%; /* top: 50%; */ margin-top: -2em; /* border: solid 1px #f2cc81; */ margin-left: -10em; -webkit-transition: border 0.3s ease; -moz-transition: border 0.3s ease; transition: border 0.3s ease;} .cn-wrapper li a { display: block; font-size: 1.18em; height: 14.5em; width: 14.5em; /* position: absolute; */ position: fixed; /* fix the "displacement" bug in webkit browsers when using tab key */ bottom: -7.25em; right: -7.25em; border-radius: 50%; text-decoration: none; color: #fff; padding-top: 1em; text-align: center; -webkit-transform: skew(-60deg) rotate(-70deg) scale(1); -ms-transform: skew(-60deg) rotate(-70deg) scale(1); -moz-transform: skew(-60deg) rotate(-70deg) scale(1); transform: skew(-60deg) rotate(-70deg) scale(1); -webkit-backface-visibility: hidden; -webkit-transition: opacity 0.3s, color 0.3s; -moz-transition: opacity 0.3s, color 0.3s; transition: opacity 0.3s, color 0.3s;} /* for a central angle x, the list items must be skewed by 90-x degreesin our case x=40deg so skew angle is 50degitems should be rotated by x, minus (sum of angles - 180)2s (for this demo) */ .cn-wrapper li:first-child { transform: rotate(-10deg) skew(60deg);} .cn-wrapper li:nth-child(2) { transform: rotate(20deg) skew(60deg);} .cn-wrapper li:nth-child(3) { transform: rotate(50deg) skew(60deg);} .cn-wrapper li:nth-child(4) { transform: rotate(80deg) skew(60deg);} .cn-wrapper li:nth-child(5) { transform: rotate(110deg) skew(60deg);}.cn-wrapper li:nth-child(6) { transform: rotate(140deg) skew(60deg);}.cn-wrapper li:nth-child(7) { transform: rotate(170deg) skew(60deg);}.cn-wrapper li:nth-child(8) { transform: rotate(200deg) skew(60deg);}.cn-wrapper li:nth-child(9) { transform: rotate(230deg) skew(60deg);}.cn-wrapper li:nth-child(10) { transform: rotate(260deg) skew(60deg);}.cn-wrapper li:nth-child(11) { transform: rotate(290deg) skew(60deg);}.cn-wrapper li:nth-child(12) { transform: rotate(320deg) skew(60deg);} .cn-wrapper li:nth-child(odd) a { background-color: #a11313; background-color: hsla(0, 88%, 63%, 1);} .cn-wrapper li:nth-child(even) a { background-color: #a61414; background-color: hsla(0, 88%, 65%, 1);} /* active style */.cn-wrapper li.active a { /* background-color: #b31515; background-color: hsla(0, 88%, 70%, 1); */ background-color: rgba(135, 137, 155, 0.52); border: solid 0px #f2cc81;} /* hover style */.cn-wrapper li:not(.active) a:hover,.cn-wrapper li:not(.active) a:active,.cn-wrapper li:not(.active) a:focus { background-color: rgba(135, 137, 155, 0.52); border: solid 0px #f2cc81;} .li-img { width: 50px; margin-bottom: 44px; margin-left: -30px;}.li-text { color: #f2cc81; font-size: 20px; line-height: 1.4; width: 76px; margin: 0 calc(50% - 50px);}</style>

父組件調(diào)用:

 <div class="making-panel">     <CirclePanel :title="title" :panel="panel"           @clickTab="clickTabCircle"           @clickPanel="clickPanel" ></CirclePanel>  </div>

總結(jié)

以上所述是小編給大家介紹的基于vue實現(xiàn)圓形菜單欄組件,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 德州市| 晋城| 疏勒县| 报价| 武宣县| 克拉玛依市| 兴宁市| 瑞金市| 于田县| 任丘市| 武清区| 军事| 高陵县| 华阴市| 北碚区| 日照市| 大宁县| 禄丰县| 南和县| 滨州市| 越西县| 资溪县| 南川市| 南木林县| 邓州市| 临城县| 高清| 宽甸| 温宿县| 筠连县| 九龙坡区| 江门市| 胶南市| 喀喇沁旗| 无锡市| 谢通门县| 临夏市| 渝中区| 鄂尔多斯市| 长寿区| 洪湖市|