前期准备
大屏适配公式
需求:已有设计稿,要求在固定比例下适配任意大屏
方案:
主要是针对页面有效宽度,方可求页面有效高度
适配原理
适配一个div
以上是整体适配大屏
以下是举例如何适配一个div:因为要适配任意屏幕,所以不能写像素单位,应使用rem单位
结论:已知div在设计稿中的尺寸,可得div在页面中的尺寸
结合scss函数使用rem
@function px($n) {
@return $n / 2420 * 100rem;
}
@import "../shared/_helper";
.home {
header {
height: px(101);
background-size: cover;
}
}
CSS补充
使用Flex和Grid布局
flex布局:
思路:
在父元素上加display:flex 和 flex-direction:column;
在子元素上加 flex:1 让子元素高度占满父元素
grid布局:
适用于一个页面出现“网格状”分布内容的情况,每个格子为一个box分区,而box中可以使用flex布局
思路:
grid-template
划分区main{
display: grid;
grid-template:
"box1 box2 box4 box5" 755fr
"box3 box3 box4 box5" 363fr / 366fr 361fr 811fr 747fr;
}
上图中第二行和第三行重复bcc可删除其中一行,只需注意高度改为80px,宽度不变grid-column-gap: px(28);
用来设置元素列之间的间隔 ,同理,也有grid-row-gapfr单位
表示等分grid-area
两个概念,一是分区别名,二是row-start / column-start/row-end>/ column-end简写,此项目用于别名main {
> .section1 {
grid-area: box1; //box1在main中声明过的分区,此处赋值给section1
display: flex;
flex-direction: column;
justify-content: space-between;
}
}
box-shadow边框妙用
可以在同一个元素上设置多个阴影效果,并用逗号将他们分隔开
box-shadow此处用于边框渐变效果:结合伪类元素,如下图效果所示:
text-shadow为文字添加阴影,如下图效果所示:
pointer-events: none 该元素永远不会成为鼠标事件的target
Echart使用
去除图表周围空白的部分
可以通过 grid 属性来控制直角坐标系内绘图网格四周边框位置
grid: {
x: px(40),
y: px(40),
x2: px(40),
y2: px(40),
containLabel: true //grid 区域是否包含坐标轴的刻度标签,默认false不包含,最好包含
},
x轴label过长需换行
补充:
\n是javascript的转义字符将输出一个换行符
是html的标签表示文本另起一行
//方法一,直接使用字符串方法
axisLabel:{
formatter(val){
if(val.length > 2){
const reallyVal = val.substring(0,3) +'\n' + val.substring(3,val.length);
return reallyVal
}else{
return val
}
....
}
//方法二,转数组再转字符串
axisLabel:{
formatter(val){
if(val.length > 2){
const array = val.split('')
array.splice(2,0,'\n'); //注意splice是改变原数组,返回的是 被修改的内容
return array.join('')
}else{
return val
}
....
}
抽离出公共baseEchartOptions文件
export const baseChartOptions = {
textStyle: {
fontSize: px(12),
color: '#79839E'
},
title:{show:false},
legend:{show:false},
grid: {
x: px(40),
y: px(40),
x2: px(40),
y2: px(40),
},
}
import bseChartOptions from '..'
myChart.setOption({
...baseChartOptions,
...
})
柱形图渐变色实现
series: [
{
name: '破案排名1',
type: 'bar',
data: [1, 2, 3, 4, 5, 6, 7, 8, 9],
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{ offset: 0, color: '#2034f9' },
{ offset: 1, color: '#01a2ff' }
])
},
},
{
name:'xxx',
...
},
...
]
自定义原生表格
<table>
<thead>
<tr>
<th>年份</th><th>破案数</th><th>抓获嫌疑人</th><th>并串案件</th><th>现勘录入</th>
</tr>
</thead>
<tbody>
<tr>
<td>2015</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td>
</tr>
<tr>
<td>2016</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td>
</tr>
<tr>
<td>2017</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td>
</tr>
</tbody>
</table>
记忆:
thead和tbody中:tr是一行
thead中:th是一列
tbody中:td是一列
合并单元格使用 rowSpan={4}或colSpan={4}
{
> table {
margin-top: px(38);
border-collapse: collapse;
th, td {
border: 1px solid #1a3671;
}
thead {
th {
height: px(70);
box-shadow: inset 0 0 px(60) 0 #1f3d85;
}
}
tbody {
td {height: px(50); width: px(84);
background: #1c2456;
}
}
}
}
自定义2D地图
补充:
series(系列)是指:一组数值以及他们映射成的图。
“系列”这个词原本可能来源于“一系列的数据”,而在 echarts 中取其扩展的概念,不仅表示数据,也表示数据映射成为的图。
所以,一个 系列 包含的要素至少有:一组数值、图表类型(series.type)、以及其他的关于这些数据如何映射成图的参数。
其中series.type很关键,表示该例是地图还是饼图或者是柱状图,series.data:图表所用数据,实际项目中可以通过http获取数据,再赋值给series.data
步骤:
引入地图数据:可在github下载地图资源,使用json资源的文件,下载本地后放入项目对应文件
chart文件中导入并配置:
//导入地图json数据
import china from '../geo/china.json';
//实例化echarts对象
let myChart = echarts.init(divRef.current);
//加载地图json数据,并注册到echars中
echarts.registerMap('CN', china);
//配置series系列项,举例:
series: [
{
type: 'map',
mapType: 'CN', // 自定义扩展图表类型
data: [
{name: '甘肃省', value: 1},
],
label: {show: false, color: 'white'},
itemStyle: {
areaColor: '#010D3D',
color: colors['甘肃省'],
shadowColor: '#008cd5',
shadowBlur: 7,
// opacity:0.95,
// shadowOffsetX:-1,
// shadowOffsetY:-1,
borderWidth: 1,//设置外层边框
borderColor:'#069cea',
borderType:'solid',
emphasis: {
label: {color: 'white'},
areaColor: '#5470C6',
},
}
},
...
]
数据data的处理
series-xxx.data.value:toFixed() 方法使用,能够将一个数转为指定位数的小数,返回的是这个位数的小数的字符串
55.99.toFixed(0)
// "56",当为0时,代表取整,会四舍五入,不传则默认为0
23.56.toFixed(1)
// "23.6",小数点会四舍五入
vite打包部署path修改
vite打包的前端项目默认只能通过根目录访问项目,比如http://localost:3000/,如果加上一个路径在进行访问会导致资源文件访问404
// 设置vite.config.js
export default defineConfig({
base: './'
})
这样将打包的项目放置在任意目录下都可以正常,当然也可以设置指定的访问路径,比如
通过[http://localost:3000/test](http://localost:3000/test)
访问