用vue3實現(xiàn)數(shù)據(jù)漏斗圖

原文地址

用vue3實現(xiàn)數(shù)據(jù)漏斗圖

在前端開發(fā)中幢尚,漏斗圖我們一般會借助一些第三方的庫來實現(xiàn),如: echarts致稀。這些庫使用起來雖然簡單順手,但是如果要定制樣式就會不太方便彼水。今天我就來用vue3手擼一個漏斗圖纽乱。

代碼實現(xiàn)

比如有以下一組數(shù)據(jù),我希望至上而下從大到小排序薄啥,并生成一個漏斗圖:

[
  { label: 'A', value: 100 },
  { label: 'B', value: 200 },
  { label: 'C', value: 50 },
  { label: 'D', value: 800 },
  { label: 'E', value: 500 }
]

廢話不多說,直接上代碼:

<template>
  <div class="funnel-container">
    <div class="top-title">這是一個漏斗</div>
    <div v-for="(option, index) in sortOptions()" :key="index" class="funnel-item">
      <!-- 白色遮罩逛尚,底部為弧形罪佳,遮在下一個option色塊上,以實現(xiàn)色塊的頂部凹陷效果 -->
      <div
        class="white-rad"
        :style="{
          width: `${index === 0 ? topWidth : topWidth * Math.pow(0.76, index) + 5}px`,
          zIndex: topZIndex - (index + 1) * 2 + 1
        }"
      />
      <!-- 每一個option的色塊 -->
      <div
        class="funnel-step"
        :style="{
          width: `${topWidth * Math.pow(0.76, index)}px`,
          zIndex: topZIndex - (index + 1) * 2,
          backgroundColor: colors[index]
        }"
      >
        <!-- 色塊中顯示的文字 -->
        <p>{{ option.label }} {{ option.value }}</p>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
// 最頂部title的zindex
const topZIndex = ref(100)
// 最頂部title和第一個option的寬度
const topWidth = ref(320)
// 顏色值
const colors = ref(['#7c0a3a', '#d42d2a', '#ff8833', '#2790c3', '#005587'])
// 數(shù)據(jù)
const optionsData = ref([
  { label: 'A', value: 100 },
  { label: 'B', value: 200 },
  { label: 'C', value: 50 },
  { label: 'D', value: 800 },
  { label: 'E', value: 500 }
])

// 從大到小排序
const sortOptions = () => {
  optionsData.value.sort((a, b) => b.value - a.value)
  return optionsData.value
}
</script>

<style>
.funnel-container {
  width: 320px;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  margin: 50px;
}

/* 頂部橢圓形title */
.funnel-container .top-title {
  margin: 0;
  padding: 10px;
  background-color: #935d71;
  color: #fff;
  border-width: 3px 6px 10px 6px;
  border-style: solid;
  border-color: #520a2a;
  border-radius: 50%;
  z-index: 100;
  position: relative;
  height: 55px;
  width: 320px;
}

.funnel-container .funnel-item {
  width: 100%;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* option的白色遮罩 */
.funnel-container .funnel-item .white-rad {
  background-color: white;
  height: 55px;
  margin-top: -50px;
  border-radius: 0 0 50% 50%;
  position: relative;
}

/* 每一個option色塊黑低,利用clip-path屬性裁剪為底部弧形效果 */
.funnel-container .funnel-item .funnel-step {
  margin-top: -25px;
  border-radius: 0 0 50% 50%;
  position: relative;
  clip-path: polygon(0% 0%, 100% 0%, 85% 100%, 15% 100%);
  height: 100px;
}

/* 色塊上的文字 */
.funnel-step p {
  color: white;
  text-align: center;
  margin-top: 40px;
  font-weight: 500;
}
</style>

效果圖如下:


效果圖.jpg

實現(xiàn)思路

  1. 最頂部的橢圓使用css的屬性border-radius: 50%;實現(xiàn)赘艳,橢圓的上下左右border寬度有出入,以實現(xiàn)視差效果: border-width: 3px 6px 10px 6px;
  2. 漏斗每一個option使用css的屬性clip-path: polygon(0% 0%, 100% 0%, 85% 100%, 15% 100%);實現(xiàn)底部弧度克握。
  3. 漏斗每一個option頂部用一個底部被切成孤度的白色遮罩遮蓋蕾管,以實現(xiàn)頂部的凹陷效果。
  4. 把數(shù)據(jù)optionsData以對象的value屬性從大到小進行排序菩暗,并將label屬性值和value屬性值顯示在色塊中

注意事項

  1. 每個色塊的底部寬度為頂部寬度的70%掰曾,而下一個色塊頂部需要比上一個色塊底部寬一些才能實現(xiàn)較好的視覺效果,本demo中采用的是76%停团。即:下一個色塊的頂部寬度為上一個色塊頂部寬度的76%旷坦。
  2. 因為使用的遮罩實現(xiàn)的頂部凹陷效果掏熬,所以元素的z-index屬性,自上而下依次遞減秒梅。
  3. 白色遮罩需要比下面色塊稍寬旗芬,以實現(xiàn)色塊兩邊尖尖的效果,可根據(jù)實際情況調(diào)整

原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捆蜀,一起剝皮案震驚了整個濱河市疮丛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辆它,老刑警劉巖誊薄,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锰茉,居然都是意外死亡呢蔫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門飒筑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來片吊,“玉大人,你說我怎么就攤上這事扬霜《瘢” “怎么了而涉?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵著瓶,是天一觀的道長。 經(jīng)常有香客問我啼县,道長材原,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任季眷,我火速辦了婚禮余蟹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘子刮。我一直安慰自己威酒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布挺峡。 她就那樣靜靜地躺著葵孤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橱赠。 梳的紋絲不亂的頭發(fā)上尤仍,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音狭姨,去河邊找鬼宰啦。 笑死苏遥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赡模。 我是一名探鬼主播田炭,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纺裁!你這毒婦竟也來了诫肠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤欺缘,失蹤者是張志新(化名)和其女友劉穎栋豫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谚殊,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡丧鸯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫩絮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丛肢。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剿干,靈堂內(nèi)的尸體忽然破棺而出蜂怎,到底是詐尸還是另有隱情,我是刑警寧澤置尔,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布杠步,位于F島的核電站,受9級特大地震影響榜轿,放射性物質(zhì)發(fā)生泄漏幽歼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一谬盐、第九天 我趴在偏房一處隱蔽的房頂上張望甸私。 院中可真熱鬧,春花似錦飞傀、人聲如沸皇型。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弃鸦。三九已至,卻和暖如春外冀,著一層夾襖步出監(jiān)牢的瞬間寡键,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留西轩,地道東北人员舵。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像藕畔,于是被迫代替她去往敵國和親马僻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容