Каждый день мы наблюдаем, как люди используют Javascript для выполнения задач, которые по умолчанию поддерживаются в старых добрых HTML и CSS. Как правило, это плохая идея — это намного медленнее, может привести к тому, что контент будет прыгать по странице после загрузки, и сломает ваш сайт для людей с дрянными браузерами .
Попутно можно обнаружить, как много может предложить CSS, и хотелось бы поделиться некоторыми из них с вами сегодня. Мы знаем, что многие люди немного боятся CSS и считают его черной магией, поэтому не будем показывать вам ничего слишком сложного. Вместо этого просто сосредоточимся на простых приемах и упущенных из виду функциях — вещах, которые вы могли бы легко внедрить в свои собственные сайты.
Вы, наверное, знаете, что HTML-элементы можно анимировать с помощью CSS. Однако знаете ли вы, что точно так же можно анимировать SVG? Один из наших любимых приемов — установить для stroke-dasharray
свойства высокое значение, а затем анимировать stroke-dashoffset
. Это приводит к тому, что путь «рисуется» с течением времени или линия движется вдоль пути, как в этой анимации некоторых фейерверков:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
<svg viewBox="0 0 100 100"> <path class="flight" d="M 0 100 C 35 92 49 76 50 50" /> <path class="trail" d="M 50 50 C 41 23 26 23 1 41" style="stroke: yellowgreen" /> <path class="trail" d="M 50 50 C 30 43 14 51 0 100" style="stroke: turquoise" /> <path class="trail" d="M 50 50 C 84 46 96 63 100 85" style="stroke: goldenrod" /> <path class="trail" d="M 50 50 C 71 31 95 43 100 63" style="stroke: mediumorchid" /> <path class="trail" d="M 50 50 C 61 -6 76 3 73 100" style="stroke: firebrick" /> <circle class="explosion" cx="50" cy="50" r="20" /> </svg> <style> svg { height: 20em; width: 100%; background-color: darkslategrey; border-radius: 2em; } svg :global(*) { animation-iteration-count: infinite; animation-timing-function: linear; animation-duration: 10s; fill: transparent; stroke-linecap: round; stroke-linejoin: round; } .flight { stroke: gold; stroke-width: 2; stroke-dasharray: 10 100; stroke-dashoffset: 10; animation-name: flight; animation-timing-function: ease-in; } @keyframes flight { from { stroke-dashoffset: 10; } 21%, to { stroke-dashoffset: -80; } } .explosion { fill: orangered; opacity: 0.8; filter: blur(1px); transform-origin: center; animation-name: explosion; } @keyframes explosion { from, 19% { transform: scale(0); } 20% { transform: scale(1.5); } 22% { transform: scale(0.5); } 23% { transform: scale(0.8); } 25% { transform: scale(0.2); } 26% { transform: scale(0.4); } 35%, to { transform: scale(0); } } .trail { stroke-width: 2; stroke-dasharray: 1 10 5 10 10 5 30 150; animation-name: trail; animation-timing-function: ease-out; } @keyframes trail { from, 20% { stroke-width: 3; stroke-dashoffset: 80; } 100%, to { stroke-width: 0.5; stroke-dashoffset: -150; } } </style> |
Для другого, более сложного примера того, как вы можете создавать анимированные диаграммы с помощью CSS, посетите нашу целевую страницу! Раздел « Как это работает » содержит подробную анимацию. Если вы хотите скопировать из него, Lexoral имеет открытый исходный код на GitHub .
Создать подобную анимацию, безусловно, сложнее, чем простое видео, а очень детализированная анимация может вызвать проблемы с производительностью, которые трудно отладить. Однако есть много причин предпочесть анимированный SVG:
Если вы хотите больше узнать о CSS-анимациях, могу порекомендовать начать с руководства по MDN . Для создания SVG используйте либо визуальный редактор, такой как Inkscape , либо более ориентированный на разработчиков инструмент, такой как этот . Часто проще просто написать SVG-разметку вручную, и в этом случае на MDN есть отличная справочная страница .
Вам нужна боковая панель навигации, которая скрывается, когда она не используется. Уберите этот файл скрипта, для этого у нас есть CSS. Мы будем использовать transform
его для перемещения за пределы экрана по умолчанию, а затем переопределять его, когда пользователь наводит курсор на элемент. Важно отметить, что мы также должны отображать меню, когда вы используете Tab
клавишу для выбора одной из ссылок в меню — важный шаг к тому, чтобы наш сайт оставался доступным:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<div class="container"> <nav> <a href=".">Option 1</a> <a href=".">Option 2</a> <a href=".">Option 3</a> <a href=".">Option 4</a> </nav> <p>← Hover</p> <p>(or use tab)</p> </div> <style> .container { overflow: hidden; position: relative; height: 15em; max-width: 25em; margin: auto; border: 0.2em solid black; } nav { display: flex; flex-direction: column; position: absolute; right: 100%; padding: 1em; background-color: skyblue; transform: translateX(1em); transition: 0.2s transform; } nav:hover, nav:focus-within { transform: translateX(100%); } a { white-space: pre; color: black; } p { font-size: 2em; text-align: center; } </style> |
Этот пример — просто умное использование псевдоклассов в CSS. Вы, вероятно, пропустили эту ссылку, но вернитесь и щелкните по ней. Даже если вы думаете, что знаете о CSS все, щелкните по нему и прочитайте этот список псевдоклассов. Посмотрите, сколько их. Подумайте, как вы могли бы их использовать.
Этот пример — просто умное использование псевдоклассов в CSS. Вы, вероятно, пропустили эту ссылку, но вернитесь и щелкните по ней. Даже если вы думаете, что знаете о CSS все, щелкните по нему и прочитайте этот список псевдоклассов. Посмотрите, сколько их. Подумайте, как вы могли бы их использовать.
Это слишком легко увидеть:hover
и предположить, что это просто для стилизации гиперссылок. Мы только что видели, как его использовали для создания боковой панели, но вот еще 9 способов, которыми вы можете его использовать:
Последнее было шуткой. Пожалуйста, не делай этого.
Некоторым из этих идей потребуется задержка перед активацией эффекта наведения — было бы довольно сложно использовать Википедию, если бы всплывающее окно закрывало половину экрана каждый раз, когда вы наводите курсор мыши на ссылку. Возможно, в этом случае вам придется вернуться к использованию Javascript, но transition-delay
сначала попробуйте свойство.
PSA: position: sticky;
существует сейчас. Пожалуйста, прекратите переопределять его с помощью Javascript. Некоторые из вас не понимают, почему мы упоминаем такую базовую функцию. Если это вы, перейдите к следующему разделу.
Некоторые из вас понятия не имеют, о чем говорится, и чувствуют себя довольно застенчивыми. Если вы хотите, чтобы элемент HTML перемещался вниз по странице при прокрутке, вы можете сделать это с помощью простого CSS! Мало того, он на самом деле работает лучше, чем версия Javascript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<div class="scroller"> <p>Scroll down the page</p> <p>And watch the blue square 🡖</p> <div class="square" /> <p>The blue square follows you</p> <p>As you scroll past it</p> <p>And if you scroll back up</p> <p>It goes back where it was</p> </div> <style> .scroller { max-width: 25em; height: 10em; margin: auto; padding: 1em; border: 0.2em solid black; overflow-x: hidden; overflow-y: scroll; } p { height: 5em; } .square { height: 5em; width: 5em; background-color: lightskyblue; margin-left: auto; position: sticky; top: 2em; } </style> |
Обратите внимание, что при прокрутке вниз синий квадрат всегда находится в одном и том же месте. Легко сказать, когда кто-то пытался сделать свое Sticky Positioning своими руками, потому что элемент всегда отстает на один кадр при прокрутке. Чем быстрее вы прокручиваете вниз, тем выше будет экран. Затем, когда вы прекращаете прокрутку, он переходит в правильное положение.
Липкое позиционирование — это комбинация relative
и fixed
позиционирования. Он в основном используется для навигационных меню, которые должны следовать за вами, когда вы прокручиваете страницу вниз. Он также используется на этой странице, если вы просматриваете ее на большом альбомном экране. Панель справа с лицом использует sticky
позиционирование, что означает, что всегда смотрят на вас, когда вы читаете блоги.
Чтобы использовать фиксированное позиционирование, сначала необходимо установить position: sticky
и указать расстояния для некоторых (обычно только одного) из top
, right
, bottom
, и left
. Когда элемент прокручивается за эту позицию на экране, он переключается на fixed
позиционирование и начинает следовать за вами. Если вы прокрутите назад, он вернется в исходное положение и останется там. Однако они не следуют за вами вечно — Sticky элемент никогда не выйдет за пределы содержащего его элемента.
Это немного сложно понять, но можно порекомендовать прочитать статью MDN об атрибуте position . Используем position
все время, поэтому я думаю, что стоит хорошо понимать все возможные значения и то, что они делают.
Аккордеонные меню обычно используются для часто задаваемых вопросов, где у вас есть список заголовков, и каждый из них можно расширить, чтобы показать содержимое внутри. Это еще один случай, когда говорится о довольно простой функции HTML+CSS, но она <details>
существует:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<div class="container"> <h3>FAQ</h3> <details> <summary>Why is it called an accordion menu?</summary> <hr /> <p> Because each part of it can expand and contract, like in an accordion. If you don't know what an accordion is, just imagine a cute fluffy cat. You still won't know what it is, but at least you'll feel better about not knowing. </p> </details> <details> <summary>Huh?</summary> <hr /> <p>Huh.</p> </details> <details> <summary>If I use an accordion menu will it make me cool?</summary> <hr /> <p> No, not unless you're designing a MySpace profile. The <code >{"<details>"}</code > element is cool though, and you can use that for a lot of things. I'm using it on this page right below here, to show the code for each example! </p> </details> </div> <style> .container { padding: 1em 2em; border: 0.2em solid black; border-radius: 2em; } details { border: 0.1em solid black; padding: 1em; margin-bottom: 1em; border-radius: 1em; } summary { font-size: 1.2em; cursor: pointer; } </style> |
Не всегда хорошая идея использовать Accordion меню из-за множества проблем с удобством использования. Тем не менее, этот <details>
элемент очень полезен, когда вы хотите скрыть какой-либо контент от пользователя, особенно если он очень длинный и большинство пользователей не захотят его читать.
Если вы не уверены, следует ли использовать элемент сведений, попробуйте прочитать для него руководство по обслуживанию NHS . Они провели намного больше юзабилити-тестирования, чем вы когда-либо сделаете, и у них есть несколько приличных рекомендаций, когда это уместно использовать.
Одним из недостатков подхода на чистом CSS здесь является то, что details
сложно анимировать без Javascript. Можно анимировать открытие коробки с помощью transition
, если вы знаете высоту коробки в открытом состоянии. В настоящее время браузеры изначально не поддерживают анимацию закрывающегося элемента, поэтому вам придется вернуться к Javascript или пользовательской анимации входа/выхода .
У вас может быть полностью функциональный темный режим на вашем веб-сайте без каких-либо Javascript, файлов cookie или отдельных URL-адресов — все в браузере. В этом есть 2 компонента. Во-первых, вы должны использовать prefers-color-scheme
медиа-запрос . Это позволяет автоматически отображать версию сайта в светлом или темном режиме в зависимости от предпочтений пользователя.
Однако лучший способ сделать ваш сайт доступным — предоставить пользователю возможность выбора . Возможно, им обычно нравится темный режим, но на вашем сайте они предпочли бы светлый режим. Мы можем использовать :checked
– селектор CSS, который соответствует только отмеченным флажкам. Возможно, вы сможете увидеть, куда это идет:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
<div class="container"> <input class="lightOverride" id="lightModeCheckbox" type="checkbox" /> <label class="lightOverride" for="lightModeCheckbox">Light Mode</label> <input class="darkOverride" id="darkModeCheckbox" type="checkbox" /> <label class="darkOverride" for="darkModeCheckbox">Dark Mode</label> <div class="body"> <h3 class="title">My Website</h3> <p>This is some text</p> <p> This is my website where I put my text. I hope you like it. I have now used up my entire text budget and I have none left, goodbye. </p> </div> </div> <style> .container { position: relative; border: 0.2em solid black; max-width: 25em; margin: auto; } .body { padding: 1em; } input, label { position: absolute; top: 0.5em; right: 0.5em; height: 1.8em; } label { padding-right: 1.2em; user-select: none; } .title { margin: 0; } .darkOverride { color: black; } #darkModeCheckbox:checked { color: whitesmoke; } #darkModeCheckbox:checked ~ label { color: whitesmoke; } .lightOverride { color: whitesmoke; } #lightModeCheckbox:checked { color: black; } #lightModeCheckbox:checked ~ label { color: black; } @media (prefers-color-scheme: light) { .lightOverride { display: none; } .body { background-color: white; color: black; } #darkModeCheckbox:checked ~ .body { background-color: darkslategrey; color: whitesmoke; } } @media (prefers-color-scheme: dark) { .darkOverride { display: none; } .body { background-color: darkslategrey; color: whitesmoke; } #lightModeCheckbox:checked ~ .body { background-color: white; color: black; } } </style> |
На самом деле это более общий метод, который работает в любое время, когда вы хотите позволить пользователю переключаться между двумя разными версиями элемента или двумя разными стилями.
Хитрость заключается в том, чтобы объединить :checked
псевдокласс с ~
родственным комбинатором. Подобное правило CSS p ~ a
применяется ко всем <a>
элементам, <p>
перед которыми в HTML-документе есть родственный элемент.
Фактическое используемое правило #checkboxId:checked ~ .body
– оно применяет некоторые стили к классу body только при установленном флажке. Поскольку затронутый элемент должен быть последующим родственным элементом, мы не можем установить флажок темного режима внутри элемента body. Вместо этого мы помещаем его перед элементом body, а затем используем, position: absolute
чтобы расположить его внутри.
Это не просто игрушечный пример. Большинство браузеров автоматически запоминают состояние флажка, а это означает, что вы можете бесплатно сохранить настройки пользователя — попробуйте установить флажок и обновить эту страницу! Это не всегда будет работать, поэтому вам, вероятно, следует включить немного JavaScript, чтобы сохранить предпочтения пользователя в локальном хранилище.
Изучать все тонкости HTML/CSS сложно. Это может быть неприятно, когда вы точно знаете, что хотите, но не можете понять, как сообщить компьютеру. Тем не менее, сейчас проще, чем когда-либо, сделать веб-сайты великолепными. CSS разрабатывался 20 лет, и он полон новых функций, облегчающих жизнь. Если вы хотите продолжить чтение, проверьте:
Некоторые из вещей, которые мы упомянули, являются относительно новыми, а это означает, что если вам нужна поддержка Internet Explorer, эти методы, вероятно, не для вас. Например, position: sticky
и :focus-within
не поддерживаются ни в одной версии IE. Надеюсь, вы сможете забыть, что когда-либо существовал Internet Explorer, и в этом случае все, что здесь использовалось, почти на 100 % поддерживается в браузерах!
Несмотря на это, лучше использовать прогрессивное улучшение . Вы должны исходить из того, что ваши пользователи будут использовать самый простой браузер, какой только можно вообразить, и сделать так, чтобы ваш сайт работал как можно лучше. Затем предположим, что они используют немного лучший браузер, и добавьте вещи, которые заставят его работать еще лучше для этих людей.
Это как когда мы говорили о темном режиме. Рекомендуется вам включить небольшой фрагмент кода JavaScript для сохранения состояния флажка переопределения пользователя. Если бы они не включили JavaScript, веб-сайт по-прежнему работал бы нормально, но вы использовали этот код, чтобы сделать его немного лучше, когда доступен JS. Чисто JS-решение будет полностью сломано для любого, у кого нет JavaScript. А это очень много людей .
В любом случае, мы показали, насколько мощным инструментом может быть CSS. Цель этого поста не заключалась в том, чтобы вы просто копировали код примера, хотя вы можете свободно это делать. Ваша задача – исследовать, пробовать что-то новое.
Источник статьи: https://lexoral.com/