前期准备
大屏适配公式
需求:已有设计稿,要求在固定比例下适配任意大屏
方案:
主要是针对页面有效宽度,方可求页面有效高度
适配原理
适配一个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中声明过的分区,此处赋值给section1display: 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时,代表取整,会四舍五入,不传则默认为023.56.toFixed(1)// "23.6",小数点会四舍五入
vite打包部署path修改
vite打包的前端项目默认只能通过根目录访问项目,比如http://localost:3000/,如果加上一个路径在进行访问会导致资源文件访问404
// 设置vite.config.jsexport default defineConfig({base: './'})
这样将打包的项目放置在任意目录下都可以正常,当然也可以设置指定的访问路径,比如
通过[http://localost:3000/test](http://localost:3000/test)访问
