Expo Web
  • Awesome Web!
  • Intro
  • FAQ
  • Anti-Pitch
  • Primitives
    • Intro to Primitives
    • View
    • TextInput
  • Styling
    • Animations
      • animationDelay
      • animationDirection
      • animationDuration
      • animationFillMode
      • animationIterationCount
      • animationKeyframes
      • animationPlayState
      • animationTimingFunction
      • animationDelay
      • animationDirection
      • animationDuration
      • animationFillMode
      • animationIterationCount
      • animationKeyframes
      • animationPlayState
      • animationTimingFunction
    • Aspect Ratio
    • Grids
    • Interactions
    • Text
    • Transforms
    • Transitions
    • View
Powered by GitBook
On this page

Was this helpful?

  1. Styling

Aspect Ratio

Universal solution to the missing aspect ratio prop

PreviousAnimationsNextGrids

Last updated 5 years ago

Was this helpful?

Because the aspectRatio style prop isn't available in react-native-web's StyleSheet API, we need to improvise a bit. Here is a View which accepts an aspectRatio style prop and calculates the ratio for you!

Example

import * as React from 'react';
import { Text, View, StyleSheet } from 'react-native';

function AspectView(props) {
  const [layout, setLayout] = React.useState(null);

  const { aspectRatio = 1, ...inputStyle } =
    StyleSheet.flatten(props.style) || {};
  const style = [inputStyle, { aspectRatio }];

  if (layout) {
    const { width = 0, height = 0 } = layout;
    if (width === 0) {
      style.push({ width: height * aspectRatio, height });
    } else {
      style.push({ width, height: width * aspectRatio });
    }
  }

  return (
    <View
      {...props}
      style={style}
      onLayout={({ nativeEvent: { layout } }) => setLayout(layout)}
    />
  );
}

// ...

return <AspectView style={{ width: 48, aspectRatio: 0.75 }} />;
Snack