画一条精细无比的实线
还记得一开始作为前端小萌新,被 0.5px 支配的恐惧吗?
“你这条线画的有问题,跟我视觉稿上不一样,看起来不够精致~”
“就一条线,咋不一样?咋不精致?”
“你这个粗了一点点!”
“哪有???我看不出来啊???”
“很明显啊!你再帮我调小 0.5 个像素。”
“。。。”
当年我们幸运 + 惊喜地发现 CSS 有伪元素、有 transform: scaleY(0.5)
,可以相对画出一条精确到小数点的线条时,才意识到:原来细微处还有这么多门门道道呵。
我在 React Native 中尝试了:
1.borderBottomWidth: 0.5
2.borderBottomWidth: 1; transform: [{scaleY: 0.5}]
3.height: 0.5
4.height: 1;transform: [{scaleY: 0.5}]
四种方式,结果都不尽如人意之后。我依旧没有选择狗带,下面这个方式通(逃)过了视觉妹子的火眼金睛。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import React from 'react'; import { View, StyleSheet, PixelRatio } from 'react-native'; export default function UnderLine() { return <View style={styles.underLine}></View>; } const styles = StyleSheet.create({ underLine: { height: 1 / PixelRatio.get(), backgroundColor: '#DADFE6' } });
|
画一条虚线(Dashed)
这个也许是一个相对挑(keng)战(die)过程了。
想当然,准备轻轻松松 borderStyle: 'dashed'; borderBottomWidth: 1
???
怎么可能。
安卓对于 ‘dashed’ 支持可以说是惨不忍睹(IOS 我亲测也有问题),无法给元素单独一条边设置边框样式。
我的思路来自于 https://www.ctolib.com/mip/qfight-rn-dashline.html。
实现方式大同小异,都是用最原始方式,也就是一个个 View
元素,硬生生画出来。
不过我的方法支持横竖两种类型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import React from 'react'; import { Text, View, StyleSheet, Dimensions, } from 'react-native'; const screenWidth = Dimensions.get('window').width; export default function DashLine({ dashScale=6, type='row', color='#CED2D9', height=100 }) { let len = type === 'row' ? Math.ceil(screenWidth / dashScale) : Math.ceil(height / dashScale); let arr = []; let computedStyle = {}; for(let i = 0; i < len; i++){ arr.push(i); } if (type === 'row') { direction = 'row'; computedStyle = { ...styles.dashItem, backgroundColor: color }; } else { direction = 'column'; computedStyle = { ...styles.dashItemCol, backgroundColor: color }; } return <View style={{flexDirection: direction}}> { arr.map((item, index)=>{ return ( <Text style={computedStyle} key={'dash'+index} /> ); }) } </View>; } const styles = StyleSheet.create({ dashItem: { transform: [{scaleY: 0.5}], height: 1, width: 2, marginRight: 2, flex: 1, backgroundColor: '#CED2D9', }, dashItemCol: { transform: [{scaleX: 0.5}], height: 2, width: 1, marginBottom: 2, flex: 1, backgroundColor: '#CED2D9', } });
|
画阴影
RN 提供了阴影样式属性,但其仅支持 IOS 平台,在 Android 中需要:
- 需要设置 elevation 属性;
- color 只支持纯黑色
#000000
;
- 如果 1 和 2 设置好了依旧在安卓不 work,请尝试为设置阴影的元素加上
backgroundColor: #FFFFFF
;
其他
- 小心渲染一个列表时候,元素之间出现诡异的间隙
- 事件响应元素层级不宜过深,安卓手机有兼容性问题
先到这儿。。。