> For the complete documentation index, see [llms.txt](https://edrus.gitbook.io/mt-it/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://edrus.gitbook.io/mt-it/2nd-month/week-6/dom-document-object-model/selecting-elements/queryselector.md).

# querySelector()

### Introduction to JavaScript querySelector() and querySelectorAll() methods

The `querySelector()` is a method of the `Element` interface. The `querySelector()` method allows you to select the first element that matches one or more CSS selectors.

The following illustrates the syntax of the `querySelector()` method:

```javascript
let element = parentNode.querySelector(selector);Code language: JavaScript (javascript)
```

In this syntax, the `selector` is a CSS selector or a group of CSS selectors to match the descendant elements of the `parentNode`.

If the `selector` is not valid CSS syntax, the method will raise a `SyntaxError` exception.

If no element matches the CSS selectors, the `querySelector()` returns `null`.

The `querySelector()` method is available on the `document` object or any `Element` object.

Besides the `querySelector()`, you can use the `querySelectorAll()` method to select all elements that match a CSS selector or a group of CSS selectors:

```javascript
let elementList = parentNode.querySelectorAll(selector);Code language: JavaScript (javascript)
```

The `querySelectorAll()` method returns a static `NodeList` of elements that match the CSS selector. If no element matches, it returns an empty `NodeList`.

Note that the `NodeList` is an array-like object, not an array object. However, in modern web browsers, you can use the [`forEach()`](https://www.javascripttutorial.net/javascript-array-foreach/) method or the [`for...of`](https://www.javascripttutorial.net/es6/javascript-for-of/) loop.

To convert the `NodeList` to an array, you use the `Array.from()` method like this:

```javascript
let nodeList = document.querySelectorAll(selector);
let elements = Array.from(nodeList);Code language: JavaScript (javascript)
```

### Basic selectors

Suppose that you have the following HTML document:

```xml
<!DOCTYPE html>
<html lang="en">
<head>
    <title>querySelector() Demo</title>
</head>
<body>
    <header>
        <div id="logo">
            <img src="img/logo.jpg" alt="Logo" id="logo">
        </div>
        <nav class="primary-nav">
            <ul>
                <li class="menu-item current"><a href="#home">Home</a></li>
                <li class="menu-item"><a href="#services">Services</a></li>
                <li class="menu-item"><a href="#about">About</a></li>
                <li class="menu-item"><a href="#contact">Contact</a></li>
            </ul>
        </nav>
    </header>
    <main>
        <h1>Welcome to the JS Dev Agency</h1>

        <div class="container">
            <section class="section-a">
                <h2>UI/UX</h2>
                <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem placeat, atque accusamus voluptas
                    laudantium facilis iure adipisci ab veritatis eos neque culpa id nostrum tempora tempore minima.
                    Adipisci, obcaecati repellat.</p>
                <button>Read More</button>
            </section>
            <section class="section-b">
                <h2>PWA Development</h2>
                <p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Magni fugiat similique illo nobis quibusdam
                    commodi aspernatur, tempora doloribus quod, consectetur deserunt, facilis natus optio. Iure
                    provident labore nihil in earum.</p>
                <button>Read More</button>
            </section>
            <section class="section-c">
                <h2>Mobile App Dev</h2>
                <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Animi eos culpa laudantium consequatur ea!
                    Quibusdam, iure obcaecati. Adipisci deserunt, alias repellat eligendi odit labore! Fugit iste sit
                    laborum debitis eos?</p>
                <button>Read More</button>
            </section>
        </div>
    </main>
    <script src="js/main.js"></script>
</body>
</html>Code language: HTML, XML (xml)
```

#### 1) Universal selector

The universal selector is denoted by `*` that matches all elements of any type:

```
*
```

The following example uses the `querySelector()` selects the first element in the document:

```javascript
let element = document.querySelector('*');Code language: JavaScript (javascript)
```

And this select all elements in the document:

```javascript
let elements = document.querySelectorAll('*');Code language: JavaScript (javascript)
```

#### 2) Type selector

To select elements by node name, you use the type selector e.g., `a` selects all `<a>` elements:

```
elementName
```

The following example finds the first `h1` element in the document:

```javascript
let firstHeading = document.querySelector('h1');Code language: JavaScript (javascript)
```

And the following example finds all `h2` elements:

```javascript
let heading2 = document.querySelectorAll('h2');Code language: JavaScript (javascript)
```

#### 3) Class selector

To find the element with a given CSS class, you use the class selector syntax:

```css
.classNameCode language: CSS (css)
```

The following example finds the first element with the `menu-item` class:

```javascript
let note = document.querySelector('.menu-item');Code language: JavaScript (javascript)
```

And the following example finds all elements with the `menu` class:

```javascript
let notes = document.querySelectorAll('.menu-item');Code language: JavaScript (javascript)
```

#### 4) ID Selector

To select an element based on the value of its id, you use the id selector syntax:

```css
#idCode language: CSS (css)
```

The following example finds the first element with the id `#logo`:

```javascript
let logo = document.querySelector('#logo');Code language: JavaScript (javascript)
```

Since the `id` should be unique in the document, the `querySelectorAll()` is not relevant.

#### 5) Attribute selector

To select all elements that have a given attribute, you use one of the following attribute selector syntaxes:

```json
[attribute]
[attribute=value]
[attribute~=value]
[attribute|=value]
[attribute^=value]
[attribute$=value]
[attribute*$*=value]
Code language: JSON / JSON with Comments (json)
```

The following example finds the first element with the attribute `[autoplay]` with any value:

```javascript
let autoplay = document.querySelector('[autoplay]');Code language: JavaScript (javascript)
```

And the following example finds all elements that have `[autoplay]` attribute with any value:

```javascript
let autoplays = document.querySelectorAll('[autoplay]');Code language: JavaScript (javascript)
```

### Grouping selectors

To group multiple selectors, you use the following syntax:

```
selector, selector, ...
```

The selector list will match any element with one of the selectors in the group.

The following example finds all `<div>` and `<p>` elements:

```javascript
let elements = document.querySelectorAll('div, p');Code language: JavaScript (javascript)
```

### Combinators

#### 1) descendant combinator

To find descendants of a node, you use the space ( ) descendant combinator syntax:

```
selector selector
```

For example `p a` will match all `<a>` elements inside the `p` element:

```javascript
let links = document.querySelector('p a');Code language: JavaScript (javascript)
```

#### 2) Child combinator

The `>` child combinator finds all elements that are direct children of the first element:

```
selector > selector
```

The following example finds all `li` elements that are directly inside a `<ul>` element:

```javascript
let listItems = document.querySelectorAll('ul > li');Code language: JavaScript (javascript)
```

To select all `li` elements that are directly inside a `<ul>` element with the class `nav`:

```javascript
let listItems = document.querySelectorAll('ul.nav > li');Code language: JavaScript (javascript)
```

#### 3) General sibling combinator

The `~` combinator selects siblings that share the same parent:

```
selector ~ selector
```

For example, `p ~ a` will match all `<a>` elements that follow the `p` element, immediately or not:

```javascript
let links = document.querySelectorAll('p ~ a');Code language: JavaScript (javascript)
```

#### 4) Adjacent sibling combinator

The `+` adjacent sibling combinator selects adjacent siblings:

```
selector + selector
```

For example, `h1 + a` matches all elements that directly follow an `h1`:

```javascript
let links = document.querySelectorAll('h1 + a');Code language: JavaScript (javascript)
```

And select the first `<a>` that directly follows an `h1`:

```javascript
let links = document.querySelector('h1 + a');
Code language: JavaScript (javascript)
```

### Pseudo

#### 1) Pseudo-classes

The `:` pseudo matches elements based on their states:

```css
element:stateCode language: CSS (css)
```

For example, the `li:nth-child(2)` selects the second `<li>` element in a list:

```javascript
let listItem = document.querySelectorAll('li:nth-child(2)');Code language: JavaScript (javascript)
```

#### 2) Pseudo-elements

The `::` represent entities that are not included in the document.

For example, `p::first-line` matches the first line of all `p` elements:

```javascript
let links = document.querySelector('p::first-line');    Code language: JavaScript (javascript)
```

### Summary

* The `querySelector()` finds the first element that matches a CSS selector or a group of CSS selectors.
* The `querySelectorAll()` finds all elements that match a CSS selector or a group of CSS selectors.
* A CSS selector defines elements to which a CSS rule applies.
