N советов по кодированию для CSS

CSS

Недавно я прочитал книгу «Секрет CSS», в которой рассказывается о многих практических навыках кодирования, которые часто заставляют людей чувствовать себя в недоумении.

Центрировать по вертикали

Как вертикально центрировать элемент неизвестной высоты, обычно есть два распространенных метода:

  • 1. Используйте абсолютное позиционирование и перевод
//html
<div class="parent">
   <div class="child">center</div>
</div>

//css
.parent{
   height: 300px;
   width: 300px;
   position: relative;
   background-color: bisque;
}
.child{
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%,-50%);
   padding: 30px;
   background-color: cornflowerblue;
}
  • 2. Решения на базе Flexbox

Это, несомненно, лучшее решение, потому что Flexbox специально разработан для таких нужд, но некоторые старые версии браузеров могут быть не очень совместимы, вы можете проверить детали.caniuse, современные браузеры, как правило, в порядке.

.parent{
   height: 300px;
   width: 300px;
   background-color: bisque;
   display: flex;
   justify-content: center;
   align-items: center;
}
.child{
   padding: 30px;
   background-color: cornflowerblue;
}

Нижний колонтитул, который прилипает к низу

<body>
    <main>hello</main>
    <footer></footer>
</body>

Мы ожидаем, что на веб-сайте нижний колонтитул должен оставаться внизу независимо от длины страницы. Когда страница достаточно длинная, отображение не вызывает проблем, когда страница короткая, нижний колонтитул поднимается вверх.Интуитивно понятный способ — использовать calc для вычисления минимальной высоты main:min-height:calc(100vh - footer的高度);, предпосылкой этого является знание высоты нижнего колонтитула.Если высота нижнего колонтитула также определяется его содержимым, это не сработает.

Для решения этой проблемы все еще можно использовать Flexbox. Сначала нам нужно установить элемент bodydisplay:flexflex-direction:column, установите вертикальное направление растяжения. Затем присвойте значение больше 0 (например, 1) свойству flex файла main.

body{
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
main{
  flex: 1;
  background-color: antiquewhite;
  padding:30px;
}
footer{
  padding:50px;
  background-color: rgb(48, 46, 46);
}

Таким образом, нижний колонтитул будет прилипать к нижней части страницы независимо от основного содержимого и содержимого нижнего колонтитула.намекать:

这个 flex 属性实际上是 flex-grow、flex-shrink 和 flex-basis 的简写语法。
任何元素只要设置了一个大于 0 的 flex 值,就将获得可伸缩的特性;
flex 的值负责控制多个可伸缩元素之间的尺寸分配比例。
举例来说,在我们眼前的这个例子中,如果 <main> 是 flex:2 而 <footer> 是 flex:1,那么内容区块的高度将是页脚高度的两倍。
如果把它们的值从 2 和 1 改为 4 和 2,结果也是一样的,因为真正起作用的是它们的数值比例。

Дисплей изображений Jiugongge

Картинки, отображаемые в кругу друзей и Weibo, будут иметь разные стили в зависимости от количества, что также можно реализовать с помощью чистого CSS. В "Секрет CSS",Стиль, основанный на количестве родственных элементовУпомянутые методы могут решить эту проблему.

Мы знаем, что есть некоторые селекторы псевдоклассов, связанные с порядком дочерних элементов в CSS, например,

  • :nth-child(n) --- соответствует n-му дочернему элементу, принадлежащему его родительскому элементу
  • :nth-last-child(n) --- соответствует n-му последнему дочернему элементу, принадлежащему его родительскому элементу
  • :only-child --- соответствует единственному дочернему элементу, принадлежащему его родителю, что эквивалентно :nth-child(1):nth-last-child(1)

Эти селекторы легко понять сами по себе, но на самом деле их можно комбинировать для более точного нахождения элементов.

В приведенном ниже примереimg:nth-child(2):nth-last-child(3)Указывает, что позиционирование является вторым в прямой числовой строке и третьей строкой в ​​обратной числовой строке.img元素, то есть только элементы с суммой 4 и второй положительной строкой удовлетворяют условию. поместите этот элементmargin-rightЕсли увеличить размер, то можно «втиснуть» третью картинку в случае 4-х картинок в следующий ряд, чтобы реализовать квадратичное расположение четырех картинок.img:only-childУказывает, что имеется только одно изображение.В настоящее время оно должно отображаться в соответствии с горизонтальным и вертикальным соотношением изображения, поэтому изображение нельзя установить.heightа такжеwidth, но использоватьmax-height max-widthОграничьте максимальную высоту/ширину изображения.

<p>天气真好!</p>
<div class="album">
    <img src="./images/bg.jpg" />
    <img src="./images/cat2.jpg" />
    <img src="./images/pic1.jpg" />
    <img src="./images/pic2.jpg" />
    <img src="./images/pic3.jpg" />
    <img src="./images/pic4.jpg" />
    <img src="./images/pic5.jpg" />
    <img src="./images/pic6.jpg" />
    <img src="./images/pic9.jpg" />
</div>
.album{
    margin-left: 50px;
    width: 342px;
}
img{
    height: 110px;
    width: 110px;
}
img:only-child{
    height: initial;  /*相当于删除已设置的某一属性*/
    width: initial;
    max-width: 230px;
    max-height: 230px;
}
img:nth-child(2):nth-last-child(3){
    margin-right: 110px;
}

Гибкое позиционирование фона

Если пишешь письмо, ставь отметку в конце. Мы можем расположить этот маркер как фоновое изображение в правом нижнем углу. Свойство background-position используется для установки положения фонового изображения внутри элемента. мы устанавливаемbackground-position: right bottom, маркер привяжется к нижнему правому углу.Чтобы сделать маркер на определенном расстоянии от границы, вы можете установитьbackground-position: right 20px bottom 20px.Если вы хотите, чтобы фон находился на том же расстоянии от границы, что и отступ (даже если вы изменили значение отступа), вы также можете изменить background-origin. Каждый элемент соответствует трем прямоугольным блокам: border box (внешняя граница границы), padding box (внешняя граница заполнения) и content box (внешняя граница области содержимого).background-position: right bottom, по умолчанию это правый нижний угол поля заполнения. Если вы хотите выровнять нижний правый угол поля содержимого, вы можете изменитьbackground-origin:content-box;

Другим распространенным применением background-position является Sprite. Когда на веб-странице используется много маленьких значков, мы можем объединить эти маленькие значки в одно изображение, чтобы уменьшить сетевые запросы. При использовании находите разные значки через background-position.Например, в таком изображении спрайта известно, что размер каждой иконки равен 200px, а интервал между иконками равен 20px.Положение фона изображения спрайта представляет собой отрицательное число, что эквивалентно перемещению фонового изображения вверх или влево на определенное расстояние относительно левого верхнего угла элемента, например, если фоновое изображение перемещено в слева на 220 пикселей, верхний левый угол элемента обращен к верхнему левому углу вишни. , отображаемое фоновое изображение — это вишня.

полосатый фон

Полосатый фон основан на градиентном фоне.

<div class="bg"></div>
.bg{
  height: 100px;
  width: 200px;
  background: linear-gradient(#fb3,#58a);
}

Сблизьте эти две цветовые шкалы:

background: linear-gradient(#fb3 20%,#58a 80%);

Верхние 20% div заполнены сплошным цветом #fb3, а нижние 20% заполнены сплошным цветом #58a. Настоящий градиент появляется только в области высоты 60% контейнера.

Если оба цвета установлены на 50%, вы получите два однотонных фона div.Поскольку градиент — это изображение, сгенерированное кодом, мы можем обращаться с ним как с любым другим фоновым изображением, и мы можем настроить его размер с помощью background-size.

background: linear-gradient(#fb3 50%,#58a 50%);
background-size: 100% 20px;

Поскольку фон по умолчанию повторяется, весь контейнер уже заполнен горизонтальными полосами.Также возможно создание полос разной ширины:

background: linear-gradient(#fb3 30%,#58a 30%);

如果某个色标的位置值比整个列表中在它之前的色标的位置值都要小,
则该色标的位置值会被设置为它前面所有色标位置值的最大值。
这意味着,如果我们把第二个色标的位置值设置为 0,那它的位置就总是会被浏览器调整为前一个色标的位置值

Мы можем изменить приведенный выше код на:

background: linear-gradient(#fb3 30%,#58a 0);

Если вы хотите создать многоцветные полосы:

background:linear-gradient(#fb3 33.3%, #58a 0, #58a 66.6%, yellowgreen 0);

Муравей марширует по границе

<div class="ants-border">
   Lorem ipsum, dolor sit amet consectetur adipisicing elit. Laudantium, debitis vel quam tempora ut nisi voluptatibus rem ab. Quas, cum. Itaque, dignissimos! Quos, eos placeat eveniet quasi amet eius officiis!
</div>
.ants-border{
   width: 500px;
   padding: 1em;
   border: 1px solid transparent;
   background-image: linear-gradient(white, white), 
                     repeating-linear-gradient(
                        -45deg,
                        #000 0%, #000 25%,
                        #fff 0%, #fff 50%
                     );
  background-size: 10px 10px;
  background-clip: padding-box, border-box;
  animation: ants 10s linear infinite;
}
@keyframes ants {
  to {
     background-position: 100%;
  }
}

Шаги рисования:

1. Добавьте черно-белый полосатый фон в div.

.ants-border{
   width: 500px;
   background-image: repeating-linear-gradient(-45deg, #000 0%, #000 25%, #fff 0%, #fff 50%); 
   background-size: 10px 10px;  /*控制条纹的宽度*/
   /*默认背景图像会repeat铺满全屏*/
}

2. Добавьте слой белого фона. Когда элемент устанавливает несколько фоновых изображений, если позиции перекрываются, фон, написанный спереди, закроет фон, написанный сзади. Фон теперь белый.

.ants-border{
   ...
   background-image: linear-gradient(white, white),repeating-linear-gradient(-45deg, #000 0%, #000 25%, #fff 0%, #fff 50%); 
   background-size: 10px 10px;
}

3. Фон имеет атрибутbackground-clip, начальное значение равноborder-box, что означает, что фон будет заполнять рамку.Чтобы выставить полосатый фон для формирования границы муравья, мыbackground-clipсоответственно установлен наpadding-boxа такжеborder-box.

.ants-border{
   ...
   background-image: linear-gradient(white, white),repeating-linear-gradient(-45deg, #000 0%, #000 25%, #fff 0%, #fff 50%); 
   background-size: 10px 10px;
   background-clip: padding-box, border-box;
}

В это время белый фон покрытpadding-box, Полосатый фонborder-box, в это время все еще используется белый фон, потому что, когда граница не установлена, диапазоны двух полей перекрываются. Поэтому установите границу в 1 пиксель, и цвет станет прозрачным.

.ants-border{
   ...
   border: 1px solid transparent;
}

4. Постоянно меняйте положение фона с помощью анимации, чтобы сформировать движущегося «муравья».

@keyframes ants {
   to {
       background-position: 100%;
   }
}

клип-путь

clip-pathПозволяет нам обрезать элементы до любой формы, которую мы хотим.

<img class="pic" src="images/pic7.jpg">

алмаз:

.pic{
   clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
}

круглый:

.pic{
   clip-path: circle(50%);
}

Также можно указать svg в качестве обтравочного контура:

<img class="pic" src="images/pic7.jpg">
<svg>
    <clipPath id="myPath" clipPathUnits="objectBoundingBox">
      <path d="M0.5,1
        C 0.5,1,0,0.7,0,0.3
        A 0.25,0.25,1,1,1,0.5,0.3
        A 0.25,0.25,1,1,1,1,0.3
        C 1,0.7,0.5,1,0.5,1 Z" />
    </clipPath>
</svg>
.pic{
   clip-path: url(#myPath)
}

Обтравочные контуры CSS могут использовать как процентные значения (которые преобразуются в собственную ширину и высоту элемента в качестве базовых градусов), так и абсолютные значения длины.

псевдокласс

В "Секрете CSS" много говорится о навыках кодирования псевдоклассов. С помощью псевдоклассов многие эффекты могут быть достигнуты тонко с ясной структурой html.

фон параллелограмма

Чтобы превратить прямоугольник в параллелограмм, можно использовать команду transform: skewX(степень), если ее использовать непосредственно на элементе, текст тоже будет деформирован. Для этого можно применить все стили к псевдоэлементу, а затем морфировать псевдоэлемент. Поскольку наше содержимое не содержится в псевдоэлементах, на него не влияет деформация. Это применимо к любому другому стилю преобразования и используется, когда мы хотим преобразовать элемент, не изменяя его содержимое.

<span class="btn">click me</span>
.btn{
   margin: 50px;
   position: relative;
   padding: 10px 20px;
}
.btn:before{
   content: '';
   position: absolute;
   top: 0;
   bottom: 0;
   left: 0;
   right: 0;
   background-color: aqua;
   z-index: -1;
   transform: skewX(-20deg);
}

диалоговое окно

<div class="dialogue">你说了啥?</div>
.dialogue{
   margin-top: 50px;
   padding: 10px;
   border-radius: 2px;;
   display: inline-block;
   position: relative;
   border: 1px solid #ccc;
   max-width: 300px;
   background-color: #fff;
}
.dialogue:before{
   content: '';
   height: 8px;
   width: 8px;
   border: 1px solid;
   border-color: #ccc transparent transparent #ccc;
   background-color: #fff;
   position: absolute;
   top: 15px;
   right: -6px;
   transform: rotate(135deg);
}

Расширить кликабельную область

Для тех небольших элементов управления, на которые трудно ориентироваться, если вы не можете напрямую увеличить их визуальный размер, расширение области, на которую можно нажимать, часто может улучшить взаимодействие с пользователем.

Псевдоэлементы могут реагировать на взаимодействие с мышью от имени своего основного элемента., поэтому мы можем наложить прозрачный псевдоэлемент поверх кнопки и сделать псевдоэлемент на 10 пикселей больше основного элемента во всех четырех направлениях.

button {
  position:relative;
  /* [其余样式] */
}
button:before {
   content:'';
   position:absolute;
  top:-10px; 
   right:-10px;
  bottom:-10px; 
   left:-10px;
}

Основываясь на псевдоэлементах, мы можем в основном установить кликабельную область любого размера, положения или формы, которую мы хотим, даже вне исходного положения элемента.

настраиваемый флажок

В элементах формы, чтобы расширить диапазон нажатия флажка, мы часто используем метку, соответствующую флажку, здесь можно добавить стиль к метке, чтобы скрыть чекбокс.

<input class="switch" type="checkbox" id="connect" />
<label for="connect"></label>
.switch{   /*隐藏复选框,通过label来响应点击*/
   position: absolute; /*不能使用 display:none,那样会把它从键盘tab键切换焦点的队列中删除*/
   clip: rect(0,0,0,0)    
}
.switch + label {   /*设置未选中状态的label样式*/
   display: inline-block;
   height: 15px;
   width: 30px;
   border-radius: 10px;
   background-color: #eee;
   position: relative;
}
.switch + label:before {  /*可滑动的小按钮为label:before伪类*/
   content: '';
   display: inline-block;
   position: absolute;
   height: 15px;
   width: 15px;
   border-radius: 50%;
   background-color: #fff;
   right: 0;
   top: 0;
   box-shadow: 0 0 2px #666;
}
.switch:checked + label {  /*设置选中状态的label样式*/
   background-color: yellowgreen;
}
.switch:checked + label:before {
   left: 0;
}

Подобно :checked, вы также можете использовать селекторы псевдоклассов :hover, :focus, :disabled для стилизации различных состояний флажка.

эффект матового стекла

Эффект матового стекла - это эффект размытия, ключ в том, кого размыть? использование элементовfilter: blur(30px)будет размывать его дочерние элементы, поэтому вы не можете сделатьclass="content"Элемент размыт, ширина и высота области, где находится текст, здесь неопределенные, поэтому нет возможности использовать пустой div для эффекта размытия, а затем «дополнить» вclass="content"ниже элемента. Итак, мы подумали о псевдоклассах.

<div class="poem">
   <div class="content">
       <p>
            明月别枝惊鹊,<br>
            清风半夜鸣蝉。<br>
            稻花香里说丰年,<br>
            听取蛙声一片。<br>
            七八个星天外,<br>
            两三点雨山前。<br>
            旧时茅店社林边,<br>
            路转溪桥忽见。<br>
       </p>
   </div>
</div>

Установите псевдокласс в ту же позицию, что и элемент содержимого, используйте отрицательный z-индекс, чтобы переместить псевдокласс вclass="content"элемент ниже.Будьте осторожны при использовании отрицательного z-индекса для перемещения дочернего элемента ниже его родителя: если у родителя есть фон, дочерний элемент появится после них.Таким образом, дляclass="content"настройки элементаz-index: 1;Сделайте псевдоэлемент видимым в родительском элементе (class="poem"элемент) выше.

Набор и для псевдоэлементовclass="poem"Тот же фон тот же, чтобы сделать псевдоэлемент иclass="poem"Элементы фона перекрываются сbackground-attachment: fixed.此时对伪元素使用filter: blur(30px);Создает эффект матового стекла.

.poem{
   width: 100vw;
   height: 100vh;
   display: flex;
   justify-content: center;
   align-items: center;
}
.poem,.content::before{
   background: url('./images/pic9.jpg');
   background-size: cover;
   background-attachment: fixed;
}
.poem .content{
   box-sizing: border-box;
   color:#f9f9f9;
   font-size: 20px;
   line-height: 2.2em;
   letter-spacing: 3px;
   text-align: center;
   padding: 40px 30px 35px 40px;
   background: hsla(0, 0%, 100%, 0.3);
   position: relative;
   overflow: hidden;
   z-index: 1;
}
.poem .content::before{
   content: '';
   position: absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 0;
   filter: blur(30px);
   margin: -30px;
   z-index: -1;
}

css фильтр (фильтр)

filter mdn

hsl

Чтобы изучить фильтры css, вам все равно нужно сначала изучить цветовую модель hsl, вы можете посмотреть видео этой барышни.Курсы цветаГовори отчетливо.

  • Оттенок (HUE): Атрибут цвета, который делит оптическую передачу на длины волн. Оттенок — это сплошной цвет без черного, белого и серого, а ниже — однотонный базовый цветовой круг.

  • Насыщенность (SATURATION): Также известная как чистота, яркая глубина отображаемого цвета.
  • Яркость (LIGHTNESS): Яркость цвета, уровень определяет яркость и темноту.

В зависимости от оттенка регулировка насыщенности и яркости может привести к различным цветовым эффектам.

Проекция неправильной формы

box-shadow не может добавлять тени к неправильным формам. Например, пузырьковый диалог.Использование filter:drop-shadow может решить эту проблему.Хотя оба имеют дело с тенями, box-shadow затеняет весь блок элемента, а drop-shadow затеняет только непрозрачные части. Возьмите изображение в качестве примера, следующее изображение прозрачно, за исключением фруктовой части.

Эффект окрашивания

img{
   height: 100px;
   width: 100px;
   border-radius: 50%;
   filter: sepia() hue-rotate(70deg);
   transition: .5s filter;
}
img:hover{
  filter: none;
}

Смягчение фона с помощью размытия

Существует довольно много сценариев применения размытого фона, таких как разблокировка мобильного телефона, вход на веб-сайт и размытие изображений альбомов на страницах воспроизведения музыки QQ в качестве фона.

Простая панель воспроизведения музыки

<div class="main">
   <img src="./images/reading.webp" />
   <div>
       东区的咖啡座<br>
       时间的杯子<br>
       满满的心事<br>
       blablabla~~~~<br>
   </div>
</div>
.main{
     position: relative;
     display: flex;
     flex-direction: column;
     align-items: center;
     color: #fff;
     text-align: center;
     font-size: 20px;
     line-height: 2em;
     background: rgba(0, 0, 0, 0.1);
}
.main:before{
     z-index: -1;
     content: '';
     position: absolute;
     top: 0;
     left: 0;
     bottom: 0;
     right: 0;
     background: url("./images/reading.webp");
     background-size: 100% 100%;
     filter: blur(30px) opacity(0.6);  
     /*
     这里不能将滤镜直接加在.main元素,而是将背景和滤镜都加在伪类上。
     因为,父元素加了滤镜,它的子元素都会一起由该滤镜改变。
     */
}
.main img{
     height: 160px;
     width: 160px;
     border-radius: 50%;
     margin: 100px 0 50px;
     animation:rotate 5s linear infinite;
}

@keyframes rotate {
     to{
         transform: rotate(1turn);
     }
}

Интерактивное управление сравнением изображений

<div class="image-slider">
   <img class="gray" src="./images/cat1.jpg"/>
   <div class="upper-img">
       <img src="./images/cat1.jpg"/>  <!--比对的两张图可以是任意两张图,只是这里是滤镜对比-->
   </div>
   <input type="range" />
</div>
.image-slider {
   position: relative;
   display: inline-block;
}
.image-slider > div {
   position:absolute;
   top: 0;
   left: 0;
   right: 0;
   bottom: 0;
   width: 50%;
   overflow: hidden; 
}
.image-slider img {
   display: inline-block;
   user-select: none;
}
.image-slider .gray {
   filter: sepia();
}
.image-slider input[type="range"]{
   position: absolute;
   left: 0;
   bottom: 10px;
   width: 100%;
   margin: 0;
   filter: contrast(0.5);
   mix-blend-mode: luminosity;
}
<script>
   let range = document.querySelector('input[type="range"]'),
       upperImg = document.querySelector('.upper-img')
   range.addEventListener('input', function(ev){
      upperImg.style.width = ev.target.value + '%'
   })
</script>

Обводка текста и свечение текста

Свойство text-shadow добавляет к тексту одну или несколько теней.

<div class="hollow">css</div>
<div class="glow">glow</div>
div{
    height: 200px;
    width: 300px;
    font-size: 100px;
    text-align: center;
}
.hollow{
    background-color: deeppink;
    color: #fff;
    text-shadow: 1px 1px black, 1px -1px black, -1px 1px black, -1px -1px black;
    /*没有模糊距离值,相当于镶边效果*/
}
.glow{
    background-color: #203;
    color: #ffc;
    text-shadow: 0 0 .1em, 0 0 .3em;  /*没指定颜色,阴影就和文字一个颜色*/
}

анимация

Легкость, кадр за кадром -- функция синхронизации анимации

Мы часто используем анимационную анимацию, напримерanimation:rotate 5s linear infiniteВот третий параметр линейная функция времени анимацииanimation-timing-function, ЭтоОпределить ритм выполнения CSS-анимации в каждом цикле анимации, то есть скорость анимации. Быстрый и медленный (ease-in-out) — это удобные способы написания, но они недостаточно настраиваемы. Например, если мы хотим анимация, фронт очень быстрый, и 90% анимации завершается за 10% времени.Используются только эти ключевые слова.Не могу этого сделать.

Чтобы увеличить скорость анимации своими руками, вы можете использоватьcubic-bezier, это такжеanimation-timing-functionтипа,animation: rotate 1.5s cubic-bezier(.27,1.07,.75,.96) infinite;. Кубическая кривая Безье называется кубической кривой Безье, которая в основном является функцией построения кривой скорости. Его вывод и расчет будут рассмотрены в отдельной статье позже, здесь мы в основном рассмотрим его использование.cubic-bezier(.27,1.07,.75,.96)Параметр принимает четыре значения, которые на самом деле являются координатами двух контрольных точек (красная и зеленая ручки на изображении ниже).

Регулируя эти две контрольные точки, можно регулировать наклон черной кривой Безье. Этот наклон представляет скорость. Наклон кривой Безье на приведенном выше рисунке сначала увеличивается, затем уменьшается, а затем увеличивается, и соответствующая скорость анимации также быстрее.Затем медленно и быстро.

Веб-сайт, который корректирует кривые Безье,cube-whitemoth.com/#.17,.67,.8…

Скорость анимации, соответствующая этой временной функции Безье, сначала высокая, а затем медленная.Мы используем ее для записи циклической анимации загрузки.первыйcubic-bezier(.23,1.21,.81,.94); второе этоlinear; третьяsteps(n).

<span></span>
<span></span>
<span></span>
span{
   display: inline-block;
   height: 30px;
   width: 30px;
   border: 2px solid;
   border-color: transparent lightcoral lightcoral lightcoral;
   border-radius: 50%;
   animation: rotate 1.5s cubic-bezier(.23,1.21,.81,.94) infinite;
}
span:nth-child(2){
   animation-timing-function: linear;
}
span:nth-child(3){
   animation-timing-function: steps(2);
}
@keyframes rotate {
   to{
       transform: rotate(360deg)
   }
}

В дополнение к плавному переходу, описанному выше, анимация также выполняет переходы шагов (n) кадр за кадром. В отличие от плавного перехода, steps(n) разделит всю анимацию на n кадров в соответствии с указанным вами числом шагов (n), и вся анимация будет жестко разделена между кадрами без каких-либо действий.Обработка интерполяции.

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

<span class="bird"></span>
.bird{
    display: inline-block;
    height: 45px;
    width: 52px;
    background: url('./images/birds.png') no-repeat;
    background-position: -1px;
    animation: fly .5s steps(3) infinite;
}
@keyframes fly {
   100%{
       background-position: -156px;
   }
}

Анимации с возможностью паузы -- animation-play-state

Если вы хотите добиться такого эффекта: отображать очень длинную картинку, при остановке мышки на картинке картинка начинает двигаться, при убирании мышки картинка перестает двигаться, а мышка снова движется вверх, а картинка начинает двигаться с того места, где остановился в прошлый раз.

<div class="window"></div>
.window{
    height: 150px;
    width: 150px;
    background: url(./images/bg.jpg) no-repeat;
    background-size: auto 100%; 
    animation: move-pic 10s linear infinite alternate;
    animation-play-state: paused;  /*非hover状态,动画暂停*/
}
.window:hover{
    animation-play-state: running;  /*hover状态,动画继续*/
}
@keyframes move-pic {
   to {
       background-position: 100% 0;
   }
}

Задержка анимации -- анимация-задержка

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

<div class="wave">
  <img src="./images/cat1.jpg" />
  <span></span>
  <span></span>
</div>
.wave{      
   position: relative;
}
.wave img{
   height: 50px;
   width: 50px;
   border-radius: 50%;
}
.wave span{
   position: absolute;
   z-index: -1;
   top: -1px;
   left: -1px;
   height: 50px;
   width: 50px;
   border-radius: 50%;
   border: 1px solid orange;
   animation: 2s wave linear 4;
   opacity: 0;
}
.wave span:nth-of-type(2){
   animation-delay: 1s; 
    /*用animation-delay将两个span的动画错开,形成水波纹*/
}
@keyframes wave {
   50%{
       transform: scale(1.2);
       opacity: 1; 
   }
   100%{
       transform: scale(1.4);
       opacity: 0;
   }
}