# Adding And Styling Forms
Styling form elements and handling user input with grace.
## Adding The Unstyled Form
```html
Awesome! Let's dive right in!
Hi!
` | `Hi!
` | We also can select attributes with a specific value prefix, e.g. `[href^="#"]` would select all elements with `href` attribute with value starting with a `#`. We can also select attributes with value suffix, e.g. `[href$=".de"]` would select all elements with `href` attribute with value end with `.de`. To select an element with attribute `src` that contains atleast one value `cdn`, we can use `[src*="cdn"]`. And finally, we can use `i` to make it case insensitive, e.g. `[src*="cdn" i]`. | Element with Specific Attribute Value Prefix | Element with Specific Attribute Value Suffix | Element with At Least One Attribute Value | Check Values Case-Insensitivity | | --- | --- | --- | --- | | `[href^="#"] { color: red; }` | `[href$=".de"] { color: red; }` | `[src*="cdn"] { color: red; }` | `[src*="cdn" i] { color: red; }` | | `` | `` | `Hi!
` | `Hi!
` | ## Working On The General Layout Selecting the `checkbox` element using our knowledge about attribute selectors, `checkbox` element is an input element which has `type="checkbox"`: ```css .signup-form input[type="checkbox"] { ... } ``` And for our submit button: ```css .signup-form button[type="submit"] { ... } ``` ## Restyling The Form Elements ```css .signup-form input, .singup-form select { border: 1px solid #ccc; padding: 0.2rem 0.5rem; font: inherit; } .signup-form input:focus, .singup-form select:focus { outline: none; background: #d8f3df; border-color: #2ddf5dc; } ``` ## Styling The Checkbox First of all we don't want the styles we defined previously using `.signup-form input` selector to be applied to our checkbox, to exclude checkbox we can use the `not()` sudo selector, which takes in a selector to exclude: ```css .singup-form input:not([type="checkbox"]), .signup-form select { ... } .signup-form input:not([type="checkbox"]):focus, .singup-form select:focus { ... } ``` And now to style our checkbox: ```css .signup-form input[type="checkbox"] { border: 1px solid #ccc; background: white; width: 1rem; height: 1rem; -webkit-appearance: none; -moz-appearance: none; appearance: none; } .signup-form input[type="checkbox"]:checked { background: #2ddf5c; border: #0e4f1f; } ``` ## Providing Validation Feedback A manual approach would be too mark a field as invalid, we can probably add a class to the element we want to mark invalid, lets name it `invalid`. And then we can add the styles for our `invalid` class: ```css .signup-form input.invalid, .signup-form select.invalid { border-color: red; background: #faacac; } ``` A more elegent approach is using the `:invalid` sudo selector, which the browser will add the input element automatically based on the `type`: ```css .signup-form input.invalid, .signup-form select.invalid, .signup-form :invalid { border-color: red !important; background: #faacac; } ``` We can also add the `required` attribute to our HTML elements and they will appear red or invalid from the start. There's also a `:valid` sudo selector, which as you can guess is opposite of `:invalid`. Keep in mind that for a production website, we need javascript to add and remove classes for form validatoin etc, that we are not covering here. ## Styling The Signup Button To style a button element with `disabled` attribute, to give the user a clear feedback that the button is not clickable: ```css .button[disabled] { cursor: not-allowed; border: #a1a1a1; background: #ccc; color: #a1a1a1; } ```