الفرق بين المراجعتين لصفحة: «ReactNative/text style props»

من موسوعة حسوب
ط مراجعة
طلا ملخص تعديل
 
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:Text Style Props في React Native}}</noinclude>
<noinclude>{{DISPLAYTITLE:خاصيات تنسيق النصوص في React Native}}</noinclude>  
__toc__
خاصيات تنسيق النصوص (Text Style Props) في React Native.
 
== مثال ==
== مثال ==
<syntaxhighlight lang="javascript">
إليك المثال التالي ([https://snack.expo.dev/@hsoubwiki/textstyleprops تجربة حية]):<syntaxhighlight lang="javascript">
import React, { useState } from "react";
import React, { useState } from "react";
import { FlatList, Platform, ScrollView, Slider, StyleSheet, Switch, Text, TouchableWithoutFeedback, View } from "react-native";
import { FlatList, Platform, ScrollView, Slider, StatusBar, StyleSheet, Switch, Text, TouchableWithoutFeedback, View } from "react-native";
import Constants from "expo-constants";


const fontStyles = ["normal", "italic"];
const fontStyles = ["normal", "italic"];
سطر 298: سطر 298:
   container: {
   container: {
     flex: 1,
     flex: 1,
     paddingTop: Constants.statusBarHeight,
     paddingTop: StatusBar.currentHeight,
     backgroundColor: "#ecf0f1",
     backgroundColor: "#ecf0f1",
     padding: 8
     padding: 8
سطر 343: سطر 343:


export default App;
export default App;
</syntaxhighlight>
</syntaxhighlight>


== الخاصيّات (Props) ==
== الخاصيات (Props) ==


=== <code>textShadowOffset</code> ===
===<code>color</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|كائن
|([[ReactNative/colors|لون]])
 
‏‎‏‪object<code>{width:number,height:number}</code>
|لا
|لا
|}
|}


=== <code>color</code> ===
=== <code>fontFamily</code> ===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|([https://reactnative.dev/docs/colors لون])
|سلسلة نصية (string)
|لا
|لا
|}
|}
سطر 373: سطر 370:
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|رقم
|عدد (number)
 
(number)
|لا
|لا
|}
|}
سطر 384: سطر 379:
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|قيمة اسمية
|‎‏('normal','italic')
 
<code>‎‏‪enum('normal','italic')</code>
|لا
|لا
|}
|}
سطر 396: سطر 389:
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|قيمة اسمية
|('normal','bold','100','200','300','400','500','600','700','800','900')
 
<code>‪enum('normal','bold','100','200','300','400','500','600','700','800','900')</code>
|لا
|لا
|}
|}


=== <code>lineHeight</code> ===
=== <code>includeFontPadding</code> ===
القيمة الافتراضية لها <code>true</code>، وعند إعطائها القيمة <code>false</code>، فإنها تقوم بإزالة الحواشي الزّائدة بهدف توفير الفراغ لأجزاء الأحرف الصّاعدة (ascenders)، والنّازلة (descenders)، غير أن هذا قد يجعل النّصوص المكتوبة ببعض الخطوط تظهر  غير مرتَّبة قليلًا عند توسيطها عموديًا، لذا يجب إعطاء الخاصيّة <code>textAlignVertical</code> القيمة <code>center</code> للحصول على نتيجةٍ أفضل.
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|رقم
|قيمة منطقية (bool)
 
(number)
|لا
|لا
|Android
|}
|}


=== <code>textAlgin</code> ===
===<code>fontVariant</code>===
تُستخدم هذه الخاصية لتحديد محاذاة الخط، وتدعم منصّة iOS القيمة 'justify' فقط، وتقابلها القيمة <code>left</code> على منصّة Android.
 
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|قيمة اسمية
|مصفوفة من القيم ('small-caps','oldstyle-nums','lining-nums','tabular-nums','proportional-nums')
 
<code>‪‏‏‏ enum('auto','left','right','center','justify')</code>
|لا
|لا
|iOS, Android>=5.0
|}
|}


=== <code>textDecorationLine</code> ===
=== <code>letterSpacin</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|قيمة اسمية
|عدد (number)
 
<code>‪enum('none','underline','line-through','underline line-through')</code>
|لا
|لا
|iOS, Android>=5.0
|}
|}


=== <code>textShadowColor</code> ===
===<code>lineHeight</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|([https://reactnative.dev/docs/colors لون])
|عدد (number)
|لا
|لا
|}
|}


=== <code>fontFamily</code> ===
===<code>textAlgin</code>===
تُستخدم هذه الخاصية لتحديد محاذاة الخط، وتدعم منصّة iOS القيمة 'justify' فقط، وتقابلها القيمة <code>left</code> على منصّة Android.
 
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|سلسلة نصية
|‪‏‏‏ ('auto','left','right','center','justify')
 
(string)
|لا
|لا
|}
|}


=== <code>textShadowRadious</code> ===
===<code>textAlignVerticaly</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|رقم
|('auto','top','bottom','center')
 
(number)
|لا
|لا
|Android
|}
|}


=== <code>includeFontPadding</code> ===
===<code>textDecorationColor</code>===
القيمة الافتراضية لها <code>true</code>، وعند إعطائها القيمة <code>false</code>، فإنها تقوم بإزالة الحواشي الزائدة بهدف توفير الفراغ لأجزاء الأحرف الصّاعدة (ascenders)، والنّازلة (descenders)، غير أن هذا قد يجعل النّصوص المكتوبة ببعض الخطوط تظهر  غير مرتَّبة قليلًا عند توسيطها عموديًا، لذا يجب إعطاء الخاصيّة <code>textAlignVertical</code> القيمة <code>center</code> للحصول على نتيجةٍ أفضل.
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
سطر 475: سطر 464:
!'''المنصة'''
!'''المنصة'''
|-
|-
|قيمة منطقية
|([[ReactNative/colors|لون]])
 
(bool)
|لا
|لا
|Android
|iOS
|}
|}


=== <code>textAlignVerticaly</code> ===
=== <code>textDecorationLine</code> ===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|قيمة اسمية
|('none','underline','line-through','underline line-through')
 
‪enum('auto','top','bottom','center')
|لا
|لا
|Android
|}
|}


=== <code>fontVariant</code> ===
===<code>textDecorationStyle</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
سطر 501: سطر 484:
!'''المنصة'''
!'''المنصة'''
|-
|-
|مصفوفة قيم اسمية
|('solid','double','dotted','dashed')
 
<code>‪array of enum('small-caps','oldstyle-nums','lining-nums','tabular-nums','proportional-nums')</code>
|لا
|لا
|iOS, Android>=5.0
|iOS
|}
|}


=== <code>letterSpacin</code>===
===<code>textShadowColor</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|رقم
|([[ReactNative/colors|لون]])
 
(number)
|لا
|لا
|iOS, Android>=5.0
|}
|}


=== <code>textDecorationColor</code> ===
=== <code>textShadowOffset</code> ===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|([https://reactnative.dev/docs/colors لون])
|كائن<code>{width:number,height:number}</code>
|لا
|لا
|iOS
|}
|}


=== <code>textDecorationStyle</code> ===
===<code>textShadowRadious</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
!'''المنصة'''
|-
|-
|قيمة اسمية
|عدد (number)
 
<code>‪enum('solid','double','dotted','dashed')</code>
|لا
|لا
|iOS
|}
|}


=== <code>textTransForm</code> ===
===<code>textTransForm</code>===
{| class="wikitable"
{| class="wikitable"
!'''النوع'''
!'''النوع'''
!'''مطلوب'''
!'''مطلوب'''
|-
|-
|قيمة اسمية
|‪('none','uppercase','lowercase','capitalize')
 
<code>enum('none','uppercase','lowercase','capitalize')</code>
|لا
|لا
|}
|}
سطر 562: سطر 531:
!'''المنصة'''
!'''المنصة'''
|-
|-
|قيمة اسمية
|‪‏ ('auto','ltr','rtl')
 
‪‏ <code>enum('auto','ltr','rtl')</code>
|لا
|لا
|iOS
|iOS
سطر 573: سطر 540:
* [https://facebook.github.io/react-native/docs/text-style-props صفحة Text Style Props في توثيق React Native الرسميّ]
* [https://facebook.github.io/react-native/docs/text-style-props صفحة Text Style Props في توثيق React Native الرسميّ]
[[تصنيف:ReactNative]]
[[تصنيف:ReactNative]]
[[تصنيف:React Native Component]]

المراجعة الحالية بتاريخ 14:05، 9 أكتوبر 2021

خاصيات تنسيق النصوص (Text Style Props) في React Native.

مثال

إليك المثال التالي (تجربة حية):

import React, { useState } from "react";
import { FlatList, Platform, ScrollView, Slider, StatusBar, StyleSheet, Switch, Text, TouchableWithoutFeedback, View } from "react-native";

const fontStyles = ["normal", "italic"];
const fontVariants = [
  undefined,
  "small-caps",
  "oldstyle-nums",
  "lining-nums",
  "tabular-nums",
  "proportional-nums"
];
const fontWeights = [
  "normal",
  "bold",
  "100",
  "200",
  "300",
  "400",
  "500",
  "600",
  "700",
  "800",
  "900"
];
const textAlignments = ["auto", "left", "right", "center", "justify"];
const textDecorationLines = [
  "none",
  "underline",
  "line-through",
  "underline line-through"
];
const textDecorationStyles = ["solid", "double", "dotted", "dashed"];
const textTransformations = ["none", "uppercase", "lowercase", "capitalize"];
const textAlignmentsVertical = ["auto", "top", "bottom", "center"];
const writingDirections = ["auto", "ltr", "rtl"];

const App = () => {
  const [fontSize, setFontSize] = useState(10);
  const [fontStyleIdx, setFontStyleIdx] = useState(0);
  const [fontWeightIdx, setFontWeightIdx] = useState(0);
  const [lineHeight, setLineHeight] = useState(10);
  const [textAlignIdx, setTextAlignIdx] = useState(0);
  const [textDecorationLineIdx, setTextDecorationLineIdx] = useState(0);
  const [includeFontPadding, setIncludeFontPadding] = useState(false);
  const [textVerticalAlignIdx, setTextVerticalAlignIdx] = useState(0);
  const [fontVariantIdx, setFontVariantIdx] = useState(0);
  const [letterSpacing, setLetterSpacing] = useState(0);
  const [textDecorationStyleIdx, setTextDecorationStyleIdx] = useState(0);
  const [textTransformIdx, setTextTransformIdx] = useState(0);
  const [writingDirectionIdx, setWritingDirectionIdx] = useState(0);
  const [textShadowRadius, setTextShadowRadius] = useState(0);
  const [textShadowOffset, setTextShadowOffset] = useState({
    height: 0,
    width: 0
  });

  return (
    <View style={styles.container}>
      <Text
        style={[
          styles.paragraph,
          {
            fontSize,
            fontStyle: fontStyles[fontStyleIdx],
            fontWeight: fontWeights[fontWeightIdx],
            lineHeight,
            textAlign: textAlignments[textAlignIdx],
            textDecorationLine: textDecorationLines[textDecorationLineIdx],
            textTransform: textTransformations[textTransformIdx],
            textAlignVertical: textAlignmentsVertical[textVerticalAlignIdx],
            fontVariant: [fontVariants[fontVariantIdx]],
            letterSpacing,
            includeFontPadding,
            textDecorationStyle: textDecorationStyles[textDecorationStyleIdx],
            writingDirection: writingDirections[writingDirectionIdx],
            textShadowOffset,
            textShadowRadius
          }
        ]}
      >
        Lorem Ipsum is simply dummy text of the printing and typesetting
        industry. 112 Likes
      </Text>
      <ScrollView>
        <View>
          <Text>Common platform properties</Text>
          <CustomSlider
            label="Text Shadow Offset - Height"
            value={textShadowOffset.height}
            minimumValue={-40}
            maximumValue={40}
            handleValueChange={val =>
              setTextShadowOffset(prev => ({ ...prev, height: val }))
            }
          />
          <CustomSlider
            label="Text Shadow Offset - Width"
            value={textShadowOffset.width}
            minimumValue={-40}
            maximumValue={40}
            handleValueChange={val =>
              setTextShadowOffset(prev => ({ ...prev, width: val }))
            }
          />
          <CustomSlider
            label="Font Size"
            value={fontSize}
            maximumValue={40}
            handleValueChange={setFontSize}
          />
          <CustomPicker
            label="Font Style"
            data={fontStyles}
            currentIndex={fontStyleIdx}
            onSelected={setFontStyleIdx}
          />
          <CustomPicker
            label="Font Weight"
            data={fontWeights}
            currentIndex={fontWeightIdx}
            onSelected={setFontWeightIdx}
          />
          <CustomSlider
            label="Line Height"
            value={lineHeight}
            minimumValue={10}
            maximumValue={50}
            handleValueChange={setLineHeight}
          />
          <CustomPicker
            label="Text Align"
            data={textAlignments}
            currentIndex={textAlignIdx}
            onSelected={setTextAlignIdx}
          />
          <CustomPicker
            label="Text Decoration Line"
            data={textDecorationLines}
            currentIndex={textDecorationLineIdx}
            onSelected={setTextDecorationLineIdx}
          />
          <CustomSlider
            label="Text Shadow Radius"
            value={textShadowRadius}
            handleValueChange={setTextShadowRadius}
          />
          <CustomPicker
            label="Font Variant"
            data={fontVariants}
            currentIndex={fontVariantIdx}
            onSelected={setFontVariantIdx}
          />
          <CustomSlider
            label="Letter Spacing"
            step={0.1}
            value={letterSpacing}
            handleValueChange={setLetterSpacing}
          />
          <CustomPicker
            label="Text Transform"
            data={textTransformations}
            currentIndex={textTransformIdx}
            onSelected={setTextTransformIdx}
          />
        </View>
        {Platform.OS === "android" && (
          <View style={styles.platformContainer}>
            <Text style={styles.platformContainerTitle}>
              Android only properties
            </Text>
            <CustomPicker
              label="Text Vertical Align"
              data={textAlignmentsVertical}
              currentIndex={textVerticalAlignIdx}
              onSelected={setTextVerticalAlignIdx}
            />
            <CustomSwitch
              label="Include Font Padding"
              handleValueChange={setIncludeFontPadding}
              value={includeFontPadding}
            />
          </View>
        )}
        {Platform.OS === "ios" && (
          <View style={styles.platformContainer}>
            <Text style={styles.platformContainerTitle}>
              iOS only properties
            </Text>
            <CustomPicker
              label="Text Decoration Style"
              data={textDecorationStyles}
              currentIndex={textDecorationStyleIdx}
              onSelected={setTextDecorationStyleIdx}
            />
            <CustomPicker
              label="Writing Direction"
              data={writingDirections}
              currentIndex={writingDirectionIdx}
              onSelected={setWritingDirectionIdx}
            />
          </View>
        )}
      </ScrollView>
    </View>
  );
}

const CustomSwitch = ({ label, handleValueChange, value }) => {
  return (
    <>
      <Text style={styles.title}>{label}</Text>
      <View style={{ alignItems: "flex-start" }}>
        <Switch
          trackColor={{ false: "#767577", true: "#DAA520" }}
          thumbColor={value ? "#DAA520" : "#f4f3f4"}
          onValueChange={handleValueChange}
          value={value}
        />
      </View>
    </>
  );
}

const CustomSlider = ({
  label,
  handleValueChange,
  step = 1,
  minimumValue = 0,
  maximumValue = 10,
  value
}) => {
  return (
    <>
      {label && (
        <Text style={styles.title}>{`${label} (${value.toFixed(2)})`}</Text>
      )}
      <View style={styles.wrapperHorizontal}>
        <Slider
          thumbTintColor="#DAA520"
          minimumTrackTintColor="#DAA520"
          minimumValue={minimumValue}
          maximumValue={maximumValue}
          step={step}
          onValueChange={handleValueChange}
          value={value}
        />
      </View>
    </>
  );
}

const CustomPicker = ({ label, data, currentIndex, onSelected }) => {
  return (
    <>
      <Text style={styles.title}>{label}</Text>
      <View style={styles.wrapperHorizontal}>
        <FlatList
          bounces
          horizontal
          data={data}
          keyExtractor={(item, idx) => String(item)}
          renderItem={({ item, index }) => {
            const selected = index === currentIndex;
            return (
              <TouchableWithoutFeedback onPress={() => onSelected(index)}>
                <View
                  style={[
                    styles.itemStyleHorizontal,
                    selected && styles.itemSelectedStyleHorizontal
                  ]}
                >
                  <Text
                    style={{
                      textAlign: "center",
                      color: selected ? "black" : "grey",
                      fontWeight: selected ? "bold" : "normal"
                    }}
                  >
                    {item + ""}
                  </Text>
                </View>
              </TouchableWithoutFeedback>
            );
          }}
        />
      </View>
    </>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: StatusBar.currentHeight,
    backgroundColor: "#ecf0f1",
    padding: 8
  },
  paragraph: {
    color: "black",
    textDecorationColor: "yellow",
    textShadowColor: "red",
    textShadowRadius: 1,
    margin: 24
  },
  wrapperHorizontal: {
    height: 54,
    justifyContent: "center",
    color: "black",
    marginBottom: 12
  },
  itemStyleHorizontal: {
    marginRight: 10,
    height: 50,
    padding: 8,
    borderWidth: 1,
    borderColor: "grey",
    borderRadius: 25,
    textAlign: "center",
    justifyContent: "center"
  },
  itemSelectedStyleHorizontal: {
    borderWidth: 2,
    borderColor: "#DAA520"
  },
  platformContainer: {
    marginTop: 8,
    borderTopWidth: 1
  },
  platformContainerTitle: {
    marginTop: 8
  },
  title: {
    fontWeight: "bold",
    marginVertical: 4
  }
});

export default App;

الخاصيات (Props)

color

النوع مطلوب
(لون) لا

fontFamily

النوع مطلوب
سلسلة نصية (string) لا

fontSize

النوع مطلوب
عدد (number) لا

fontStyle

النوع مطلوب
‎‏('normal','italic') لا

fontWeight

تُستخدم هذه الخاصية لتحديد ثخن الخط، ومعظم الخطوط تدعم القيمتين طبيعي 'normal'، وثخين 'bold'، بينما لا تدعم جميع الخطوط كلّ احتمالات القيم العدديّةٍ، لذا نختار أقرب قيمةٍ في هذه الحالة.

النوع مطلوب
('normal','bold','100','200','300','400','500','600','700','800','900') لا

includeFontPadding

القيمة الافتراضية لها true، وعند إعطائها القيمة false، فإنها تقوم بإزالة الحواشي الزّائدة بهدف توفير الفراغ لأجزاء الأحرف الصّاعدة (ascenders)، والنّازلة (descenders)، غير أن هذا قد يجعل النّصوص المكتوبة ببعض الخطوط تظهر غير مرتَّبة قليلًا عند توسيطها عموديًا، لذا يجب إعطاء الخاصيّة textAlignVertical القيمة center للحصول على نتيجةٍ أفضل.

النوع مطلوب المنصة
قيمة منطقية (bool) لا Android

fontVariant

النوع مطلوب المنصة
مصفوفة من القيم ('small-caps','oldstyle-nums','lining-nums','tabular-nums','proportional-nums') لا iOS, Android>=5.0

letterSpacin

النوع مطلوب المنصة
عدد (number) لا iOS, Android>=5.0

lineHeight

النوع مطلوب
عدد (number) لا

textAlgin

تُستخدم هذه الخاصية لتحديد محاذاة الخط، وتدعم منصّة iOS القيمة 'justify' فقط، وتقابلها القيمة left على منصّة Android.

النوع مطلوب
‪‏‏‏ ('auto','left','right','center','justify') لا

textAlignVerticaly

النوع مطلوب المنصة
‪('auto','top','bottom','center') لا Android

textDecorationColor

النوع مطلوب المنصة
(لون) لا iOS

textDecorationLine

النوع مطلوب
‪('none','underline','line-through','underline line-through') لا

textDecorationStyle

النوع مطلوب المنصة
‪('solid','double','dotted','dashed') لا iOS

textShadowColor

النوع مطلوب
(لون) لا

textShadowOffset

النوع مطلوب
كائن{width:number,height:number} لا

textShadowRadious

النوع مطلوب
عدد (number) لا

textTransForm

النوع مطلوب
‪('none','uppercase','lowercase','capitalize') لا

writingDirection

النوع مطلوب المنصة
‪‏ ('auto','ltr','rtl') لا iOS

مصادر