Пользовательская форма для изображения радиуса границы в React-Native - PullRequest
1 голос
/ 23 мая 2019

Я хочу воспроизвести этот стиль в моем компоненте (граница снизу). Я в основном загружаю прямоугольное изображение, затем хочу округлить его внизу.

enter image description here

Я думаю о:

  • border-bottom-right-radius и left, но это не точно с пользовательской формой экрана.
  • преобразование scaleX, но оно масштабирует пропорции изображения (очевидно)
  • создайте белое изображение с пользовательской формой и загрузите его внизу экрана, но я хочу добавить тень внизу изображения ... С белым изображением я не смог бы этого сделать ...

Есть ли способ сделать это в правильном стиле с React-Native?

Спасибо!

Ответы [ 3 ]

1 голос
/ 23 мая 2019

Это возможно, но это немного сложно.Идея в том, что вам нужно создать «маску», к которой вы можете применить форму.После этого вы можете поместить изображение как дочерний элемент маски, чтобы он по существу маскировал область, которую вы хотите.Вероятно, возможно сделать это с динамическим размером, но я не нашел время, чтобы придумать это решение, я оставлю это вам;)

Надеюсь, это поможет вамправильное направление, хотя.

Сначала давайте настроим структуру приложения

class App extends Component {
  render() {
    return (
      <View style={styles.app}>
        <Mask />
      </View>
    );
  }
}

Довольно просто, просто базовое приложение с компонентом маски.Я сделал его компонентом, чтобы вы могли передавать ему реквизиты в будущем (как, например, изображение uri).

Тогда компонент маски

const logoUri = `http://66.media.tumblr.com/86b941b3445b80a518ea51208f48ab35/tumblr_ntpi99a6Pl1uounv1o1_500.png`;
const Mask = (props) => (
  <View style={styles.maskContainer}>
    <View style={styles.mask}>
      <Image
        source={{ uri: logoUri }}
        style={styles.img}
      />
    </View>
  </View>
)

maskContainer - это позиционированиеэлемент, чтобы помочь центрировать изображение.mask использует подход овального стиля , но чтобы края не закруглялись как радиус границы, мы должны масштабировать его в 2 разаСтиль img должен изменить масштабирование так, чтобы само изображение не деформировалось :)

const styles = StyleSheet.create({
  app: {
    marginHorizontal: "auto",
    maxWidth: 500,
    backgroundColor: "#e0e0e0",
    width: 700,
    height: 700
  },
  mask: {
    width: 200,
    height: 470,
    borderBottomLeftRadius: 100,
    borderBottomRightRadius: 100,
    overflow: "hidden",
    transform: [{ scaleX: 2 }]
  },
  img: {
    height: 470,
    width: 299,
    left: 25,
    position: "absolute",
    transform: [{ scaleX: 0.5 }, { translate: "-50%" }]
  },
  maskContainer: {
    position: "absolute",
    left: "50%",
    transform: [{ translate: "-50%" }]
  }
});

Смотрите, как работает эта скрипка!

0 голосов
/ 23 мая 2019

Я предполагаю, что вы хотите сохранить прямые левый и правый края только с изогнутым нижним краем. Вот один способ с CSS и два сложенных divs.

Вам нужно настроить CSS и размер изображения, чтобы радиус точно соответствовал вашим предпочтениям. Лучше всего работает с изображением размером больше divs, настроенным с помощью background-position: и background-repeat: no-repeat. Вы также можете использовать border-left и border-right, чтобы верхний элемент не имел верхней или нижней рамки.

.imagediv {
width: 400px;
height: 300px;
border-radius: 0 0 50% 50%;
background-image: url("https://www.scriptbarrel.com/images/swim.png");
background-position: 50% 20%;
background-repeat: no-repeat;
position: relative;
box-shadow: 0px 5px 4px #999;
z-index: 0;
margin: 0 auto;
}

.topdiv {
margin: 0 auto;
left: -10px;
width: 340px;
height: 300px;
border-top: 15px solid white;
border-left: 40px solid white;
border-right: 40px solid white;
position: absolute;
z-index: 1;
}
 
<html><head>
<title>CSS fun</title>
</head>
<body>
<div class = "imagediv">
<div class = "topdiv"></div>
</div>

</body>
</html>
0 голосов
/ 23 мая 2019

Да.Свойство clip-path!

Просто добавьте: clip-path: circle (69,3% при 50% 30%)

В ваш класс, и он будет работать.

, если выхотите создать его самостоятельно, здесь есть генератор: https://bennettfeely.com/clippy/

...