Intro
- Det finns olika sätt att använda sig av CSS i React
- Vi ska gå igenom:
- Global CSS
- Inline Styling
- CSS modules
- Styled Components
Global CSS
- Precis som att länka in en CSS fil i en HTML-sida
- En CSS-class som finns här kan användas var som helst på sidan
import './App.css';
Scoped styling
- I React vill man undvika global styling
- Istället ska varje komponent ha sin egen lokala CSS som är oberoende av andra komponenters CSS
- Detta kallas scoped styling och kan åstadkommas på flera sätt
Inline Styling
- Style attributet används och sätts till ett javascript-objekt
- Objektet har attribut som motsvarar CSS-attribut
- Attributen måste skrivas i camelCase så t.ex. background-color blir backgroundColor
- Attributvärdena måste oftast skrivas som strängar
Inline styling - exempel
const ButtonStyle = {
backgroundColor: "#333333",
borderRadius: "3px",
padding: "5px 10px",
color: "white"
};
<button style={ButtonStyle}>En stylad knapp!</button>
Övning - Inline Styling
- Skapa en React-komponent som är en textruta (input) med följande styling:
input {
font-size: 18px;
line-height: 20px;
border: 1px solid gray;
border-radius: 3px;
}
CSS Modules
- CSS Modules är ett annat sätt att ha scoped styling
- En fil för CSS-moduler har filändelsen .module.css
- I den filen skriver man helt vanliga CSS-klasser
- Genom att importera filen i komponenten får man tillgång till CSS-klasserna och kan applicera på olika element via className
CSS Modules - exempel
/*button.module.css*/
.button {
background-color: #333333;
border-radius: 3px;
padding: 5px 10px;
color: white;
};
import styles from './button.module.css';
const ButtonCSSModule = () => (
<button className={styles.button} type="button">Klicka här</button>
);
export default ButtonCSSModule;
Övning - CSS Modules
- Skapa en React-komponent som är en textruta (input) med följande styling:
input {
font-size: 18px;
line-height: 20px;
border: 1px solid gray;
border-radius: 3px;
}
Styled components
- Styled components är ett mycket populärt npm-paket för att hantera CSS i React
- Det utgår ifrån CSS-in-JS som är en styling-teknik flera fördelar, bland annat:
- Komponenttänk
- JavaScript-logik
- Helt isolerad CSS (påverkar bara den egna komponenten)
https://en.wikipedia.org/wiki/CSS-in-JS
Hur funkar styled components?
- För att skapa en styled components kombinerar man ihop ett html-element och en sträng med CSS
- Strängen är en template string vilket innebär att man kan lägga in JS-kod i strängen
En röd knapp:
const MyStyledButton = button.styled`
background-color: red;
`;
Installera Styled Components
- Innan vi använder Styled components måste vi installera npm-paketet:
npm install styled-components
npm install --save-dev @types/styled-components
- Och importera i komponenten:
import styled from 'styled-components';
VSCode syntax highlightning
- Plugin som heter vscode-styled-components
- Highlightar CSS-koden i strängen
Styled components - exempel
import styled from 'styled-components';
const StyledButton = styled.button`
background-color: #333333;
border-radius: 3px;
padding: 5px 10px;
color: white;
`;
const ButtonStyledComponents = () => (
<StyledButton type="button">Klicka här</StyledButton>
);
export default ButtonStyledComponents;
Övning - Styled components
- Skapa en React-komponent som är en textruta (input) med följande styling:
input {
font-size: 18px;
line-height: 20px;
border: 1px solid gray;
border-radius: 3px;
}
Styled components - med props
- Man kan skicka med props till en styled component och variera css-koden beroende på vad som står i proppens värde:
const StyledButton = styled.button`
background-color: ${props => props.color};
border-radius: 3px;
padding: 5px 10px;
color: white;
`;
<StyledButton type="button" color="red">Klicka här!</StyledButton>
Övning - Styled Components m. props
- Skapa en textbox-komponent som tar emot en prop som heter isValid
- Om isValid=true ska bakgrundsfärger vara vit
- Om isValid=false ska bakgrundsfärgen vara ljusröd
//Exempel på implementation
<Textbox isValid={false} />
Styled components - Child-selektor
- För att kunna använda childselektorer använder man & när man refererar till det egna elementet
// Alla ul som ligger i listan MyStyledList får röd textfärg
const MyStyledList = styled.ul`
& > li {
color: red;
}
`
Styled components - Pseudoklasser
- & används också för att kunna applicera pseudoklasser till det egna elementet
const MyStyledButton = styled.button`
&:hover {
background-color: red;
}
`