React Native 中的 CSS 三角形

Posted

技术标签:

【中文标题】React Native 中的 CSS 三角形【英文标题】:CSS Triangles in React Native 【发布时间】:2015-07-24 20:45:46 【问题描述】:

我正在开发一个使用覆盖其他容器/div 的三角形的应用程序。之前用 CSS 解决了这个问题:

.triangle:after 
  content: "";
  display: block;
  position: absolute;
  top: 15px;
  left: -15px;
  width: 0;
  border-width: 0px 0px 15px 15px;
  border-style: solid;

但这在 React 中不再起作用了。去这里的最佳解决方案是什么?

【问题讨论】:

生成的 DOM 最终是什么样子的?看起来应该仍然有效。 【参考方案1】:

仍然可以使用 CSS 技巧在 React Native 中绘制三角形。 我写了一个类来封装这个:https://github.com/Jpoliachik/react-native-triangle

如果你想自己写,我使用了这个工具:http://apps.eky.hk/css-triangle-generator/ 来生成我想要的三角形并将样式修改为 React Native 语法。

例如,在 CSS 中指向上方的等腰三角形 90x90 表示:

width: 0;
height: 0;
border-style: solid;
border-width: 0 45px 90px 45px;
border-color: transparent transparent #007bff transparent;

但在 React Native 中,样式会是:

triangle: 
     width: 0,
     height: 0,
     backgroundColor: 'transparent',
     borderStyle: 'solid',
     borderTopWidth: 0,
     borderRightWidth: 45,
     borderBottomWidth: 90,
     borderLeftWidth: 45,
     borderTopColor: 'transparent',
     borderRightColor: 'transparent',
     borderBottomColor: 'red',
     borderLeftColor: 'transparent',
   ,

【讨论】:

更新:目前仅适用于 iosandroid 支持的修复工作也在进行中。 github.com/facebook/react-native/issues/5411 是否可以为该三角形添加框阴影?如果在 android 中作为 'elevation' 应用,它会覆盖正方形区域。 @GeniusGo 您可能需要使用图像或 SVG 来实现这一点 - 因为它已经有点渲染技巧了,添加阴影可能很时髦。 (不过我没有在 iOS 上测试过)【参考方案2】:
render() 
    return (
        <View style=[styles.triangle,styles.arrowUp]/>
    );

和样式

const styles = 
    triangle: 
        width: 0,
        height: 0,
        backgroundColor: 'transparent',
        borderStyle: 'solid',
    ,
    arrowUp: 
        borderTopWidth: 0,
        borderRightWidth: 30,
        borderBottomWidth: 30,
        borderLeftWidth: 30,
        borderTopColor: 'transparent',
        borderRightColor: 'transparent',
        borderBottomColor: "tomato",
        borderLeftColor: 'transparent',
    ,
    arrowRight: 
        borderTopWidth: 30,
        borderRightWidth: 0,
        borderBottomWidth: 30,
        borderLeftWidth: "tomato",
        borderTopColor: 'transparent',
        borderRightColor: 'transparent',
        borderBottomColor: 'transparent',
        borderLeftColor: "tomato",
    ,
    arrowDown: 
        borderTopWidth: 30,
        borderRightWidth: 30,
        borderBottomWidth: 0,
        borderLeftWidth: 30,
        borderTopColor: "tomato",
        borderRightColor: 'transparent',
        borderBottomColor: 'transparent',
        borderLeftColor: 'transparent',
    ,
    arrowLeft: 
        borderTopWidth: 30,
        borderRightWidth: "tomato",
        borderBottomWidth: 30,
        borderLeftWidth: 0,
        borderTopColor: 'transparent',
        borderRightColor: "tomato",
        borderBottomColor: 'transparent',
        borderLeftColor: 'transparent',
    ,
    arrowUpLeft: 
        borderTopWidth: 30,
        borderRightWidth: "tomato",
        borderBottomWidth: 0,
        borderLeftWidth: 0,
        borderTopColor: "tomato",
        borderRightColor: 'transparent',
        borderBottomColor: 'transparent',
        borderLeftColor: 'transparent',
    ,
    arrowUpRight: 
        borderTopWidth: 0,
        borderRightWidth: "tomato",
        borderBottomWidth: 30,
        borderLeftWidth: 0,
        borderTopColor: 'transparent',
        borderRightColor: "tomato",
        borderBottomColor: 'transparent',
        borderLeftColor: 'transparent',
    ,
    arrowDownLeft: 
        borderTopWidth: 30,
        borderRightWidth: 0,
        borderBottomWidth: 0,
        borderLeftWidth: "tomato",
        borderTopColor: 'transparent',
        borderRightColor: 'transparent',
        borderBottomColor: 'transparent',
        borderLeftColor: "tomato",
    ,
    arrowDownRight: 
        borderTopWidth: 0,
        borderRightWidth: 0,
        borderBottomWidth: 30,
        borderLeftWidth: "tomato",
        borderTopColor: 'transparent',
        borderRightColor: 'transparent',
        borderBottomColor: "tomato",
        borderLeftColor: 'transparent',
    ,

来源:https://github.com/Jpoliachik/react-native-triangle

【讨论】:

非常棒的例子。【参考方案3】:

对于初学者:

大多数刚接触 CSS 的人都对这个三角形感到困惑, 我的回答可能很长,但请完整阅读。

使用 CSS 样式绘制三角形其实是由于“边框”的美感,如果 你们仔细看看边框的末端,你会发现边框的末端不是直的,让我告诉你,通过改变每个边框的颜色。

container having borders

应用于上图的样式是:


   height: 100px;
   width: 100px;
   border-style: solid;
   border-left-width: 10px;
   border-right-width: 10px;
   border-top-width: 10px;
   border-bottom-width: 10px;
  
   border-left-color: pink;
   border-right-color: red;
   border-top-color: gray;
   border-bottom-color: green;

现在仔细观察上图你会发现,如果你增加边框宽度,它会在某种程度上看起来像一个三角形。

在将边框宽度从 10px 增加到 50px 后,我们得到了这些 结果:

<!DOCTYPE html>
<html>
<head>
<style>

div 
  height: 100px;
  width: 100px;
  border-style: solid;
  border-left-width: 50px;
  border-right-width: 50px;
  border-top-width: 50px;
  border-bottom-width: 50px;
  
  border-left-color: pink;
  border-right-color: red;
  border-top-color: gray;
  border-bottom-color: green;


</style>
</head>

<body>
<div>I'm a container having colorful borders of 50px each</div>
<p><strong>Note:</strong> All the borders are not straight at their endings</p>
</body>
</html>

到目前为止,我们能够理解它,但是有一个问题是我们无法获得三角形的尖端,这是因为我们在容器内部有空间,避免了边界的尖端并产生平坦的表面而不是小费。

要摆脱容器内的这个空间,只需将高度和宽度设置为 0px,然后查看结果。

<!DOCTYPE html>
<html>
<head>
<style>
h1 
  border-left-style: solid;
  border-left-width: medium;


div 
  height: 0px;
  width: 0px;
  border-style: solid;
  border-left-width: 50px;
  border-right-width: 50px;
  border-top-width: 50px;
  border-bottom-width: 50px;
  
  border-left-color: pink;
  border-right-color: red;
  border-top-color: gray;
  border-bottom-color: green;

</style>
</head>
<body>


<div></div>

<p><strong>Note:</strong> All the borders are not straight at their endings</p>

</body>
</html>

到目前为止,我们几乎完成了所有工作,现在我们可以通过玩样式来制作任何三角形。 如果要制作一个向上的三角形,则只需为左右边框和顶部边框赋予透明色,如下所示:


   height: 0px;
   width: 0px;
   border-style: solid;
   border-left-width: 50px;
   border-right-width: 50px;
   border-top-width: 50px;
   border-bottom-width: 50px;
  
   border-left-color: transparent;
   border-right-color: transparent;
   border-top-color: transparent;
   border-bottom-color: green;

如果您不希望三角形尖端上方有空间,那么您很清楚具有透明颜色的“topBorder”会占用空间,您可以通过给出“border-top-width: 0像素;"或将其从您的样式中删除。

反应原生

在 react-native 中将使用相同的技术,只需在 camelNotation 中编写您的样式,例如(borderTopWidth,borderBottonWidth ...)

进一步,我希望你自己玩代码。

参考:本文中使用的图片是使用 w3schools 在线代码编辑器生成的。

w3schools Code Editor

【讨论】:

【参考方案4】:

为什么不使用专用库? https://github.com/react-native-community/react-native-svg

【讨论】:

【参考方案5】:

最好的方法是创建一个&lt;Image&gt; 组件并绝对定位它,类似于纯 CSS 三角形。如果三角形具有平面颜色,而不是渐变或其他图案,您可以使用 tintColor 样式属性设置其颜色。

例子:

<Image
  source=require('image!triangle')
  style=tintColor: '#008080'
/>

【讨论】:

所以我只是创建一个带有三角形的真实图像,然后将其着色为我需要的颜色? 这不可能是正确的答案,因为三角形不是由 CSS 生成的

以上是关于React Native 中的 CSS 三角形的主要内容,如果未能解决你的问题,请参考以下文章

创建不改变css中角度的三角形

CSS绘制三角形—border法

React Native中的六角形图像

用CSS3做网页中的小三角,以及transition的用法

使用 Javascript、CSS 和 HTML 进行三角形定位(欢迎使用其他方法)

CSS实现三角形