Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавляет доку про @starting-style #5548

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions css/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ groups:
- media
- supports
- layer
- starting-style
- name: 'Глобальные ключевые слова'
items:
- global-keywords
Expand Down
109 changes: 109 additions & 0 deletions css/starting-style/demos/dialog-animation/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Анимация появления диалога — @starting-style — Дока</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap">
<style>
body {
min-height: 100vh;
padding: 50px;
display: flex;
align-items: center;
justify-content: center;
background-color: #18191C;
color: #FFFFFF;
font-family: "Roboto", sans-serif;
font-size: 24px;
}

*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}

.button {
display: block;
border: 2px solid transparent;
border-radius: 6px;
padding: 9px 15px;
color: #000000;
font-size: 1.12rem;
font-weight: 300;
font-family: inherit;
transition: background-color 0.15s ease-in;
cursor: pointer;
background-color: #2E9AFF;
}

.button:hover {
background-color: #FFFFFF;
}

.dialog-button {
border-color: #000000;
width: 100%;
}

.mb-20 {
margin-bottom: 20px;
}

dialog {
padding: 20px;
border: none;
border-radius: 16px;
margin: auto;
}

/* стили для открытого диалога */
dialog {
opacity: 1;
scale: 1;
transition:
opacity 0.4s ease-in,
scale 0.4s ease-in,
display 0.4s ease-in allow-discrete;
}

/* стили для открывающегося диалога */
@starting-style {
dialog {
opacity: 0;
scale: 1.1;
}
}

/* стили для закрывающегося диалога */
dialog:not([open]) {
opacity: 0;
scale: 0.8;
}
</style>
</head>
<body>
<button id="open-dialog" class="button">Открыть диалог</button>
<dialog id="animated-dialog">
<h3 class="mb-20">Анимированный диалог</h3>
<p class="mb-20">Плавно появляюсь и плавно исчезаю</p>
<button id="close-dialog" class="button dialog-button">Закрыть диалог</button>
</dialog>
<script>
const dialog = document.querySelector('#animated-dialog')
const openDialogButton = document.querySelector('#open-dialog')
const closeDialogButton = document.querySelector('#close-dialog')

openDialogButton?.addEventListener('click', () => {
dialog?.showModal()
})

closeDialogButton?.addEventListener('click', () => {
dialog?.close()
})
</script>
</body>
</html>
96 changes: 96 additions & 0 deletions css/starting-style/demos/popover-animation/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Анимация появления поповера — @starting-style — Дока</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap">
<style>
body {
min-height: 100vh;
padding: 50px;
display: flex;
align-items: center;
justify-content: center;
background-color: #18191C;
color: #FFFFFF;
font-family: "Roboto", sans-serif;
font-size: 24px;
}

*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}

.button {
display: block;
border: 2px solid transparent;
border-radius: 6px;
padding: 9px 15px;
color: #000000;
font-size: 1.12rem;
font-weight: 300;
font-family: inherit;
transition: background-color 0.15s ease-in;
cursor: pointer;
background-color: #FF8630;;
}

.button:hover {
background-color: #FFFFFF;
}

.mb-150 {
margin-bottom: 150px;
}

[popover] {
padding: 20px;
border: none;
border-radius: 16px;
margin: auto;
}

[popover] {
transition:
opacity 0.4s ease-in,
scale 0.4s ease-in,
translate 0.4s ease-in,
display 0.4s ease-in allow-discrete;
}

/* стили для открытого поповера */
[popover]:popover-open {
opacity: 1;
scale: 1;
translate: 0;
}

/* стили для открывающегося поповера */
@starting-style {
[popover]:popover-open {
opacity: 0;
scale: 0.5;
translate: 0 70px;
}
}

/* стили для закрывающегося поповера */
[popover]:not(:popover-open) {
opacity: 0;
scale: 0.5;
translate: 0 50px;
}
</style>
</head>
<body>
<button popovertarget="animated-popover" class="button mb-150">Показать поповер</button>
<div popover id="animated-popover">
<p>Анимированный поповер</p>
</div>
</body>
</html>
150 changes: 150 additions & 0 deletions css/starting-style/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
---
title: "`@starting-style`"
description: "Директива для описания начальных стилей элемента в момент его появления на экране."
authors:
- akhmadullin
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Пожалуйста, создай свой профиль на Доке. Для этого нужно добавить в папку people/ папку со своим ником. Внутри рассказать немного о себе.
Подробнее можно почитать по ссылке → https://github.com/doka-guide/content/blob/main/docs/people.md

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

добавил

related:
- html/dialog
- html/popover
- css/opacity
tags:
- doka
---


## Кратко

Директива `@starting-style` позволяет задать начальные стили для элемента в момент его _появления_ на странице.

## Пример

```css
.element {
background-color: tomato;
}

@starting-style {
.element {
background-color: orange;
}
}
```

## Как понять

При верстке сайтов бывает нужно привлечь внимание пользователя к появлению некоторых элементов на странице. Например, плавно сменить цвет фона блока в момент загрузки сайта. Или сделать открытие диалога плавным и аккуратным. То есть нам необходимо осуществить переход из начального состояния элемента в основное. При этом сделать это нужно один раз и именно в момент появления элемента на экране.

Чтобы сообщить браузеру, какие должны быть стили у элемента в его начальном состоянии, используется директива `@starting-style`.

## Как пишется

В общем виде синтаксис выглядит так:

```css
.element {
/*
Стили для основного состояния элемента.
Будут применены после появления элемента на странице.
*/
}

@starting-style {
.element {
/*
Стили для начального состояния элемента.
Будут применены в момент появления элемента на странице.
*/
}
}
```

Например:

```css
.promo-block {
opacity: 1;
}

@starting-style {
.promo-block {
opacity: 0;
}
}
```

В момент загрузки страницы `.promo-block` будет не виден, так как в начальном состоянии [`opacity`](/css/opacity/) равен нулю. После загрузки страницы применятся стили из основного состояния: `opacity` будет равен единице и `.promo-block` отобразится на экране.

## Использование

`@starting-style` классно подходит для добавления анимации на открытие диалога или поповера.

Например, с помощью `@starting-style` мы можем сделать появление диалога более плавным:

```css
/* стили для открытого диалога */
dialog {
opacity: 1;
scale: 1;
transition:
opacity 0.4s ease-in,
scale 0.4s ease-in,
display 0.4s ease-in allow-discrete;
}

/* стили для открывающегося диалога */
@starting-style {
dialog {
opacity: 0;
scale: 1.1;
}
}

/* стили для закрывающегося диалога */
dialog:not([open]) {
opacity: 0;
scale: 0.8;
}
```

<iframe title="Анимация появления диалога" src="demos/dialog-animation" height="360"></iframe>

Такой же подход можно применить и для анимации поповера:

```css
[popover] {
transition:
opacity 0.4s ease-in,
scale 0.4s ease-in,
translate 0.4s ease-in,
display 0.4s ease-in allow-discrete;
}

/* стили для открытого поповера */
[popover]:popover-open {
opacity: 1;
scale: 1;
translate: 0;
}

/* стили для открывающегося поповера */
@starting-style {
[popover]:popover-open {
opacity: 0;
scale: 0.5;
translate: 0 70px;
}
}

/* стили для закрывающегося поповера */
[popover]:not(:popover-open) {
opacity: 0;
scale: 0.5;
translate: 0 50px;
}
```

<iframe title="Анимация появления поповера" src="demos/popover-animation" height="360"></iframe>

## Подсказки

💡 CSS-правила внутри `@starting-style` не вводят нового порядка в каскад стилей. Это означает, что стили внутри `@starting-style` не обязательно будут «важней» стилей, описанных снаружи. Чтобы гарантировать, что стили начального состояния не будут перезаписаны стилями основного состояния, помещайте `@starting-style` после объявлений основных стилей элемента.
7 changes: 7 additions & 0 deletions people/akhmadullin/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
name: 'Рома Ахмадуллин'
url: https://github.com/akhmadullin
photo: photo.jpg
---

Фронтенд-разработчик. Люблю веб-стандарты и Open Source. Нравится изучать новое и делиться находками с другими.
Binary file added people/akhmadullin/photo.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading