Saat saya mengerjakan visualisasi kalender ini, saya menemukan cara yang keren untuk mengubah warna teks supaya tampil hitam pada background yang terang dan putih pada background yang gelap.
<template>
<div style="display: flex;">
<div v-for="value in items" :style="{ backgroundColor: `${bgScale(value)}`, width: '30px', height: '30px', display: 'flex', alignItems: 'center', justifyContent: 'center' }">
<span :style="{ color: `${colorScale(valueToRatio(value))}` }">{{ value }}</span>
</div>
</div>
</template>
<script>
import * as d3 from 'd3'
export default {
props: {
items: {
type: Array,
default: () => [0, 1, 20, 30, 40, 23, 33, 50],
}
},
data() {
return {
bgScale: d3.scaleQuantize([0, d3.max(this.items, value => value)], d3.schemeBlues[9]),
colorScale: d3.scaleQuantize([0, 1], ['black', 'white']),
valueToRatio: d3.scaleLinear().domain([0, d3.max(this.items, value => value)]).range([0, 1])
}
}
}
</script>
Idenya adalah mengubah data menjadi rasio menggunakan fungsi valueToRatio
, dan membuat dua fungsi scale untuk warna background dan teks.
Dengan nilai yang belum ditransform, ambil warna background dengan fungsi bgScale
yang mengembalikan warna terang pada range rendah, dan warna gelap pada range tinggi. Lalu dengan nilai rasio, ambil warna teks dengan fungsi colorScale
yang mengembalikan warna gelap pada range rendah, dan warna terang pada range tinggi.