1644897120
Вы хотите отчеканить тысячи NFT? Если да, то это пошаговое руководство для вас! Узнайте, как легко создать 10 000 NFT с помощью Moralis за считанные минуты!
В этой статье мы разберем процесс создания 10 000 NFT. Чтобы сделать руководство более доступным, мы будем использовать уже готовый шаблон Moralis для механизма разработки NFT. Итак, если вы предпочитаете пропустить учебник и сразу же внимательно изучить репозиторий GitHub, перейдите по следующей ссылке:
Полная документация по движку NFT — https://morioh.com/p/50f79d2c67aa
NFT (невзаимозаменяемые токены) являются одними из самых интересных особенностей разработки Web3 , и в результате использования этих токенов были созданы новые инновационные идеи. Одна из самых горячих тенденций в мире криптографии — цифровые предметы коллекционирования. Это NFT, генерируемые массово для создания коллекций, состоящих из тысяч токенов. Двумя наиболее яркими примерами являются яхт-клуб Bored Ape и CryptoPunks . Эти коллекции содержат около 10 000 совершенно уникальных NFT, некоторые из которых продаются за астрономические суммы. Из-за невероятного успеха этого сектора мы более подробно рассмотрим, как отчеканить 10 000 NFT и создать собственную серию токенов с помощью Moralis .
В следующем руководстве мы будем использовать операционную систему Moralis для создания коллекции NFT. Как пользователи Moralis, мы можем подключиться к серверной инфраструктуре платформы и в кратчайшие сроки создать собственную коллекцию!
Более того, наряду с уже развитой серверной инфраструктурой Moralis, платформа также предоставляет ценные инструменты разработки, такие как Moralis Speedy Nodes , встроенную поддержку IPFS , NFT API , Price API и многое другое.
Итак, если вы хотите стать разработчиком блокчейна, следующим шагом на вашем пути будет регистрация в Moralis. Присоединение к платформе позволит вам значительно сократить время разработки всех ваших будущих блокчейн-проектов!
В этом руководстве мы разберем процесс создания коллекции из 10 000 NFT. Итак, если вы еще этого не сделали, мы рекомендуем вам ознакомиться с NFT, прежде чем продолжить. Вы можете получить полную информацию об этих токенах из следующей статьи: « Что такое NFT? ». Однако, если вы чувствуете себя комфортно в своих знаниях NFT, следуйте инструкциям, пока мы проведем вас через весь процесс!
Чтобы сделать этот урок более понятным, мы разобьем процесс на следующие три шага:
Мы будем использовать уже готовый шаблон Moralis с уже разработанным механизмом генерации NFT, чтобы сэкономить время и ресурсы. Итак, без лишних слов, давайте сразу приступим к процессу и начнем с создания художественных слоев, которые мы можем загрузить прямо в движок NFT!
Искусство в этих коллекциях NFT представляет собой компьютерные произведения, состоящие из комбинации различных художественных слоев. В зависимости от того, что вы планируете для своей коллекции, эти слои могут различаться; однако, если назвать несколько, это могут быть фоны, одежда, глаза, носы, аксессуары и т. д. Таким образом, первым шагом в нашем процессе является создание этих слоев, которые мы можем использовать позже для создания уникальных цифровых произведений искусства.
Чтобы начать процесс, нам сначала нужно посетить страницу GitHub и клонировать все файлы в наш локальный каталог. На этом этапе мы сосредоточимся на файле Moralis Mutants.psd , который содержит шаблон того, как мы должны структурировать слои. Таким образом, вы можете продолжить, открыв файл в предпочитаемом вами программном обеспечении для редактирования. В нашем случае мы будем использовать Photoshop.
Файл уже содержит несколько слоев, таких как аксессуары, глаза, руки и т. д. Однако нас на самом деле не интересуют существующие слои; нам нужна структура файлов. Это потому, что слои должны полностью зависеть от вашего видения конечного продукта. Таким образом, крайне важно, чтобы у вас была четкая картина и окончательная тема для NFT, прежде чем разрабатывать слои.
Кроме того, при создании слоев вы должны учитывать количество уникальных NFT, которые вы хотели бы иметь в виду. Например, если вы хотите создать 10 000 произведений искусства, вам потребуется значительно большее количество уникальных слоев, чем если бы вы намеревались создать только десять.
После того, как вы спроектировали все свои слои, следующей частью этого начального шага будет экспорт каждого слоя в отдельные файлы. Нам нужны все слои отдельно и в отдельных файлах, так как это позволит нашему движку объединять их и создавать уникальные произведения искусства.
Экспорт файлов относительно прост, и если вы также работаете с Photoshop, все, что вам нужно сделать, это нажать кнопку «Файлы» в верхней части интерфейса. После этого перейдите в «Экспорт» и нажмите «Слои в файлы».
Это экспортирует все ваши отдельные слои в отдельные файлы. Теперь все, что осталось для первого шага, — это рассортировать их по отдельным папкам. У нас будет по одному для каждой из различных категорий слоев. Так, например, один для «Носов», один для «Аксессуаров» и т. д.
Папки, в свою очередь, тоже должны иметь определенную структуру. Каждая папка должна содержать три дополнительные папки: «original», «rare» и «super_rare». Затем вам нужно отсортировать каждый слой в зависимости от того, насколько редкими вы хотите, чтобы они были.
На втором этапе мы фактически создадим искусство, которое на третьем этапе будет использовано для создания 10 000 NFT. Однако, прежде чем приступить к созданию арта, нам нужно заранее сделать две вещи. Во-первых, нам нужно создать сервер Moralis. Сервер предоставит все необходимые инструменты для создания произведений искусства и загрузки файлов в IPFS . Во-вторых, мы также должны внести несколько конфигураций в движок NFT, который будет генерировать искусство.
Первое, что вам нужно сделать, это зарегистрироваться в Moralis. Это совершенно бесплатно, и как только вы войдете в свою учетную запись, мы готовы приступить к работе.
Чтобы запустить экземпляр, вы можете нажать кнопку «+ Создать новый сервер» в верхней части интерфейса Moralis. Нажатие этой кнопки откроет раскрывающееся меню с тремя различными вариантами. В этом случае, а также поскольку это учебник, мы выберем сервер тестовой сети. Это выгодно, поскольку позволяет нам создавать NFT без каких-либо сборов за газ, что дает нам роскошь сделать все правильно, прежде чем переходить к основной сети.
После выбора нужного типа сервера откроется дополнительное окно, в котором вам нужно будет сделать несколько выборов. В нашем случае мы выбрали тестовую сеть Polygons Mumbai, и если вы хотите продолжить, мы предлагаем вам сделать то же самое.
Когда вся информация введена надлежащим образом, остается только нажать кнопку «Добавить экземпляр», чтобы запустить сервер.
Теперь, когда в нашем распоряжении есть сервер, мы можем перейти к настройке движка, который будет генерировать произведения искусства. Прежде всего, если вы еще этого не сделали, вы можете клонировать код с GitHub и добавить его в свою IDE (интегрированную среду разработки).
С локальной копией кода следующим шагом будет переход к файлу « config.js », который вы можете найти в папке «вход». Как только вы окажетесь в этом файле, вы можете прокрутить вниз до части «НАЧАТЬ НАСТРОЙКУ КОЛЛЕКЦИИ».
Вы должны просмотреть каждый из этих элементов и убедиться, что они соответствуют вашим потребностям в разработке. Однако три наиболее важные части, на которых нам нужно сосредоточиться, — это изменение констант «baseImageUri», «editionSize» и «layers».
«baseImageUri» должен совпадать с URL-адресом вашего сервера Moralis. Чтобы найти эту информацию, все, что вам нужно сделать, это нажать кнопку «Просмотреть подробности» для соответствующего сервера и скопировать и вставить ее в код. Кроме того, вы также хотите изменить «editionSize». Если вы хотите создать 10 000 NFT, эта константа должна быть установлена на эту сумму.
Наконец, вам также необходимо убедиться, что константа «слои» структурирована правильно. Изначально вот так выглядят «слои»:
постоянные слои = [
addLayer("Фон", {x: 0, y: 0}, {ширина: ширина, высота: высота}),
addLayer("База туловища"),
addLayer("Базовый заголовок"),
addLayer("Торс"),
addLayer("Руки"),
addLayer("Рты"),
addLayer("Глаза"),
addLayer("Аксессуары"),
addLayer("Нос"),
];
Элементы этой константы должны соответствовать слоям, которые вы создали на первом этапе этого урока. Кроме того, самый дальний «задний» слой ваших произведений искусства должен быть вверху списка. Как видно из приведенного выше примера, мы начинаем с «Фон», а затем добавляем дополнительные слои поверх него. Если бы «Фон» был внизу кода, он покрыл бы остальные слои.
Когда все необходимые настройки файла «config.js» завершены, мы можем перейти к внесению последних изменений в механизм NFT. Для этого вам нужно перейти к файлу « index.js », где находится центральная часть кода. Эта часть компилирует все, включая слои, и создает файлы JSON . Наряду с этим он также загрузил все в IPFS и на ваш сервер Moralis. Однако мы не будем углубляться в то, как работает реальный движок, а скорее рассмотрим необходимые конфигурации, о которых нам нужно позаботиться.
Мы можем пойти дальше и прокрутить вниз до раздела «// Moralis Creds»:
// Moralis creds
const serverUrl = process.env.SERVER_URL;
const appId = process.env.APP_ID;
const masterKey = process.env.MASTER_KEY;
const apiUrl = process.env.API_URL;
// xAPIKey available here: https://deep-index.moralis.io/api-docs/#/storage/uploadFolder
const apiKey = process.env.API_KEY;
Здесь нам нужно внести несколько изменений. Во-первых, вы можете добавить URL-адрес сервера, идентификатор приложения и главный ключ. Еще раз, эту информацию можно найти, вернувшись к Moralis и нажав кнопку «Просмотреть подробности» для рассматриваемого сервера:
Наконец, вам также необходимо добавить URL-адрес и ключ API, и их можно получить по адресу в коде, который мы представили ранее в этом разделе.
После внесения всех изменений в файлы «config.js» и «index.js» мы можем просто продолжить и начать создавать произведения искусства. Это относительно просто, и все, что вам нужно сделать, это ввести в терминал следующее:
node index.js
Как только вы нажмете Enter, код запустится и сгенерирует указанное количество произведений искусства. Однако, если вы создаете 10 000 произведений искусства, их загрузка в IPFS может занять некоторое время. Но не волнуйтесь; они будут завершены на мгновение. Как только все будет завершено, мы можем перейти к созданию настоящих NFT.
С созданным нашим искусством третья и последняя часть этого урока состоит в том, чтобы отчеканить настоящие NFT. Однако, чтобы чеканить NFT, нам нужно несколько вещей. Первое, что мы собираемся сделать, это создать учетную запись MetaMask, изменить сеть и добавить в кошелек немного «игрового» MATIC. Итак, начнем с более подробного изучения MetaMask .
Если у вас его нет, то первое, что вам нужно сделать, это создать учетную запись MetaMask. Это довольно просто, и все, что вам нужно сделать, это выполнить шаги, представленные расширением. После того, как у вас есть учетная запись, следующим шагом будет изменение сети MetaMask. В нашем случае мы хотим переключиться на тестовую сеть Мумбаи, поскольку именно эту сеть мы выбрали при создании сервера.
Однако Мумбаи не будет одной из сетей MetaMask по умолчанию, а это означает, что нам нужно добавить это в наши кошельки. При работе с Moralis это становится невероятно легко. Все, что вам нужно сделать, это перейти на вкладку «Speedy Nodes» в административной панели Moralis, нажать кнопку «Конечные точки» для сети Polygon и, наконец, нажать кнопку «Добавить в MetaMask» для тестовой сети. Затем остается только убедиться, что это выбрано в MetaMask.
Итак, с выбранной текущей сетью нам также нужно добавить немного MATIC в кошелек. Поскольку мы работаем с тестовой сетью, это можно сделать через сборщик Polygon . Все, что вам нужно сделать, это ввести адрес своего кошелька, чтобы получить взамен «поддельный» MATIC. Однако важно отметить, что они работают только для тестовой сети и не являются настоящими MATIC.
Далее нам нужен смарт-контракт, который мы можем использовать для создания NFT. В этом случае мы будем использовать уже разработанный контракт: « NFTcontract.sol ». Мы собираемся использовать Remix для создания этого контракта, так как это делает компиляцию и развертывание контракта более доступными. Вот как выглядит полный контракт:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
//import 1155 token contract from Openzeppelin
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";
// Example contract to be deployed via https://remix.ethereum.org/ for testing purposes.
contract NFTContract is ERC1155, Ownable {
using SafeMath for uint256;
constructor()
ERC1155(
"ipfs://INSERT_YOUR_CID_METAHASH/metadata/{id}.json" // You can get this saved in dashboard of your Moralis server instance.
)
{
// account, token_id, number
_mint(msg.sender, 1, 1, "");
_mint(msg.sender, 2, 1, "");
_mint(msg.sender, 3, 1, "");
}
Однако перед компиляцией и развертыванием контракта мы должны внести несколько корректировок. Как видите, первое, что нам нужно, это «CID» для наших файлов. Вы можете найти этот CID, посетив панель управления вашего сервера Moralis. Чтобы попасть на панель инструментов, все, что вам нужно сделать, это нажать кнопку «Панель инструментов» для сервера. Отсюда вы можете просто скопировать CID и заменить «INSERT_YOUR_CID_METAHASH» на CID.
Затем, наконец, как вы можете видеть из приведенного выше кода, это подходит только для создания трех NFT. Таким образом, вам нужно создать цикл, охватывающий все ваши файлы PNG и JSON. Итак, если у вас есть 10 000 уникальных произведений искусства, ваш цикл должен включать их все.
С изменениями, внесенными в смарт-контракт , мы должны его скомпилировать и развернуть. Итак, приступим к составлению договора. Мы можем легко составить контракт в несколько простых кликов, так как мы работаем с Remix. Во-первых, давайте перейдем на вкладку «Solidity Compiler» в крайнем левом углу интерфейса Remix. Все, что вам нужно сделать, это выбрать правильную версию Solidity, правильный контракт и нажать кнопку «Скомпилировать».
После составления контракта следующим шагом будет его развертывание в блокчейне. Для этого щелкните вкладку «Развернуть» чуть ниже «Компилятор Solidity». Затем выберите «Injected Web3», правильный контракт и нажмите «Развернуть».
После развертывания вы получите адрес контракта, который можно использовать для просмотра NFT в тестовой версии OpenSea .
Вот и все для этого урока о том, как отчеканить 10 000 NFT! Это касалось того, как чеканить NFT в тестовой сети; однако процесс остается полностью таким же для основной сети. Таким образом, когда вы удовлетворены результатами, у вас есть все знания, чтобы перейти на следующий уровень!
В этой статье мы рассмотрели процесс создания 10 000 NFT всего за три простых шага:
Мы смогли создать слои, а затем использовать эти слои для создания тысяч уникальных произведений искусства, которые мы позже использовали для создания 10 000 NFT. Более того, мы смогли сделать это с легкостью, поскольку использовали операционную систему Moralis.
Оригинальный источник статьи на https://moralis.io
1627843083
NFTs are becoming more popular in the gaming sector as the demand for unique in-game development increases. Professional NFT Game Development Services deliver a thrilling experience with crypto collectibles. As a professional NFT development company, TokyoTechie is the backbone behind various NFT projects. For more details visit us at TokyoTechie - https://bit.ly/3yglPQG
#NFT game development services #NFT gaming development solution #NFT Gaming Platform Solutions #NFT game development company
#NFT gaming software development #NFT gaming platform development services
1642484580
Si tiene un sitio web, es útil tener un cargador para que los usuarios puedan saber que algo está sucediendo una vez que hayan hecho clic en un enlace o botón.
Puede usar este componente del cargador en muchos lugares y debería ser lo más simple posible.
En esta publicación, veremos cómo construir dos tipos de cargadores con solo una <div>
y unas pocas líneas de código CSS. No solo esto, sino que los haremos personalizables para que pueda crear fácilmente diferentes variaciones del mismo código.
Esto es lo que construiremos:
Spinner y Progress Loader solo para CSS
A continuación se muestra una demostración de lo que estamos construyendo:
https://codepen.io/t_afif/pen/PoJyaNy
<div class="loader"></div>
<div class="loader" style="--b: 15px;--c: blue;width: 120px;--n: 8"></div>
<div class="loader" style="--b: 5px;--c: green;width: 80px;--n: 6;--g: 20deg"></div>
<div class="loader" style="--b: 20px;--c: #000;width: 80px;--n: 15;--g: 7deg"></div>
.loader {
--b: 10px; /* border thickness */
--n: 10; /* number of dashes*/
--g: 10deg; /* gap between dashes*/
--c: red; /* the color */
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
padding: 1px;
background: conic-gradient(#0000,var(--c)) content-box;
-webkit-mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
animation: load 1s infinite steps(var(--n));
}
@keyframes load {to{transform: rotate(1turn)}}
Tenemos 4 cargadores diferentes usando el mismo código. Con solo cambiar algunas variables, podemos generar un nuevo cargador sin necesidad de tocar el código CSS.
Las variables se definen como sigue:
--b
define el grosor del borde.--n
define el número de guiones.--g
define el espacio entre guiones. Como estamos tratando con un elemento circular, este es un valor de ángulo.--c
define el color.Aquí hay una ilustración para ver las diferentes variables.
Variables CSS del cargador Spinner
Abordemos el código CSS. Usaremos otra figura para ilustrar una construcción paso a paso del cargador.
Ilustración paso a paso del cargador giratorio
Primero comenzamos creando un círculo como este:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
}
Nada complejo hasta ahora. Tenga en cuenta que su uso aspect-ratio
nos permite modificar solo un valor (el width
) para controlar el tamaño.
Luego agregamos una coloración de degradado cónico de transparente al color definido (la variable --c
):
.loader {
width:100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
}
En este paso, introducimos la mask
propiedad para ocultar algunas partes del círculo de forma repetitiva. Esto dependerá de las variables --n
y . --d
Si observa detenidamente la figura, notaremos el siguiente patrón:
visible part
invisible part
visible part
invisible part
etc
Para hacer esto, usamos repeating-conic-gradient(#000 0 X, #0000 0 Y)
. De 0
a X
tenemos un color opaco (parte visible) y de X
a Y
tenemos uno transparente (parte invisible).
Introducimos nuestras variables:
g
entre cada parte visible por lo que la fórmula entre X
y Y
será X = Y - g
.n
la parte visible, por lo que la fórmula de Y
debería ser Y = 360deg/n
. Un círculo completo es 360deg
así que simplemente lo dividimos porn
Nuestro código hasta ahora es:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask: repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n))
}
El siguiente paso es el más complicado, porque necesitamos aplicar otra máscara para crear una especie de agujero para obtener la forma final. Para ello usaremos lógicamente a radial-gradient()
con nuestra variable b
:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0)
Un círculo completo del que quitamos un espesor igual a b
.
Añadimos esto a la máscara anterior:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0),
repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n))
}
Tenemos dos capas de máscara, pero el resultado no es el que queremos. Obtenemos lo siguiente:
Puede parecer extraño pero es lógico. La parte visible "final" no es más que la suma de cada parte visible de cada capa de máscara. Podemos cambiar este comportamiento usando mask-composite
. Necesitaría un artículo completo para explicar esta propiedad, así que simplemente daré el valor.
En nuestro caso, debemos considerar intersect
(y destination-out
para la propiedad prefijada). Nuestro código se convertirá en:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0),
repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
}
¡Hemos terminado con la forma! Solo nos falta la animación. Esta última es una rotación infinita.
Lo único a tener en cuenta es que estoy usando una steps
animación para crear la ilusión de guiones fijos y colores en movimiento.
Aquí hay una ilustración para ver la diferencia.
Una animación lineal frente a una animación de pasos
La primera es una rotación lineal y continua de la forma (no la que queremos) y la segunda es una animación discreta (la que queremos).
Aquí está el código completo, incluida la animación:
<div class="loader"></div>
<div class="loader" style="--b: 15px;--c: blue;width: 120px;--n: 8"></div>
<div class="loader" style="--b: 5px;--c: green;width: 80px;--n: 6;--g: 20deg"></div>
<div class="loader" style="--b: 20px;--c: #000;width: 80px;--n: 15;--g: 7deg"></div>
.loader {
--b: 10px; /* border thickness */
--n: 10; /* number of dashes*/
--g: 10deg; /* gap between dashes*/
--c: red; /* the color */
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
padding: 1px;
background: conic-gradient(#0000,var(--c)) content-box;
-webkit-mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
animation: load 1s infinite steps(var(--n));
}
@keyframes load {to{transform: rotate(1turn)}}
Notarás algunas diferencias con el código que usé en la explicación:
padding: 1px
y configurando el fondo paracontent-box
+/1deg
entre los colores de larepeating-conic-gradient()
radial-gradient()
Esas son algunas correcciones para evitar fallas visuales. Se sabe que los degradados producen resultados "extraños" en algunos casos, por lo que debemos ajustar algunos valores manualmente para evitarlos.
Al igual que el cargador anterior, comencemos con una descripción general:
https://codepen.io/t_afif/pen/bGoNddg
<div class="loader"></div>
<div class="loader" style="--s:10px;--n:10;color:red"></div>
<div class="loader" style="--g:0px;color:darkblue"></div>
<div class="loader" style="--s:25px;--g:8px;border-radius:50px;color:green"></div>
.loader {
--n:5; /* control the number of stripes */
--s:30px; /* control the width of stripes */
--g:5px; /* control the gap between stripes */
width:calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height:30px;
padding:var(--g);
margin:5px auto;
border:1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / calc((var(--n) + 1)*(var(--s) + var(--g))) 100%
no-repeat content-box;
animation: load 1.5s steps(calc(var(--n) + 1)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
Tenemos la misma configuración que el cargador anterior. Variables CSS que controlan el cargador:
--n
define el número de guiones/rayas.--s
define el ancho de cada franja.--g
define el espacio entre las rayas.Ilustración de las variables CSS
De la figura anterior podemos ver que el ancho del elemento dependerá de las 3 variables. El CSS será el siguiente:
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px; /* use any value you want here */
padding: var(--g);
border: 1px solid;
}
Usamos padding
para establecer el espacio en cada lado. Entonces el ancho será igual al número de rayas multiplicado por su ancho y el espacio. Eliminamos un espacio porque para N
las rayas tenemos N-1
espacios.
Para crear las rayas usaremos el siguiente degradado.
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
)
De 0
a s
es el color definido y de s
a s + g
un color transparente (la brecha).
Estoy usando currentColor
cuál es el valor de la color
propiedad. Tenga en cuenta que no definí ningún color dentro border
, por lo que también se usará para el valor de color
. Si queremos cambiar el color del cargador, solo necesitamos establecer la color
propiedad.
Nuestro código hasta ahora:
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px;
padding: var(--g);
border: 1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / 100% 100% content-box no-repeat;
}
Estoy usando content-box
para asegurarme de que el degradado no cubra el área de relleno. Luego defino un tamaño igual a 100% 100%
y una posición izquierda.
Es hora de la animación. Para este cargador, animaremos el background-size
de 0% 100%
a 100% 100%
lo que significa el ancho de nuestro degradado de 0%
a100%
Al igual que el cargador anterior, confiaremos en steps()
tener una animación discreta en lugar de una continua.
Una animación lineal frente a una animación de pasos
El segundo es el que queremos crear, y lo podemos lograr agregando el siguiente código:
.loader {
animation: load 1.5s steps(var(--n)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
Si observa detenidamente la última figura, notará que la animación no está completa. Nos falta una raya al final, incluso si hemos usado N
. Esto no es un error, sino cómo steps()
se supone que funciona.
Para superar esto, necesitamos agregar un paso adicional. Aumentamos el background-size
de nuestro degradado para contener N+1
rayas y usar steps(N+1)
. Esto nos llevará al código final:
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px;
padding: var(--g);
margin: 5px auto;
border: 1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / calc((var(--n) + 1)*(var(--s) + var(--g))) 100%
content-box no-repeat;
animation: load 1.5s steps(calc(var(--n) + 1)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
Tenga en cuenta que el ancho del degradado es igual a N+1
multiplicado por el ancho de una franja y un espacio (en lugar de ser 100%
)
Espero que disfrutes este tutorial. Si está interesado, he creado más de 500 cargadores div únicos solo para CSS . También escribí otro tutorial para explicar cómo crear el cargador de puntos usando solo propiedades de fondo .
Encuentre a continuación enlaces útiles para obtener más detalles sobre algunas propiedades que he usado y que no expliqué a fondo debido a su complejidad:
mask-composite
: https://css-tricks.com/mask-compositing-the-crash-course/steps()
: https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function#the_steps_class_of_easing_functions¡Gracias por leer!
Enlace: https://www.freecodecamp.org/news/how-to-create-a-css-only-loader/
1642923600
Webサイトがある場合は、ローダーを使用すると、ユーザーがリンクまたはボタンをクリックすると何かが起こっていることを知ることができるので便利です。
このローダーコンポーネントは多くの場所で使用でき、可能な限りシンプルにする必要があります。
<div>
この投稿では、1行と数行のCSSコードで2種類のローダーを構築する方法を説明します。これだけでなく、同じコードからさまざまなバリエーションを簡単に作成できるようにカスタマイズできるようにします。
これが私たちが構築するものです:
CSSのみのスピナーとプログレスローダー
以下は、私たちが構築しているもののデモです。
https://codepen.io/t_afif/pen/PoJyaNy
<div class="loader"></div>
<div class="loader" style="--b: 15px;--c: blue;width: 120px;--n: 8"></div>
<div class="loader" style="--b: 5px;--c: green;width: 80px;--n: 6;--g: 20deg"></div>
<div class="loader" style="--b: 20px;--c: #000;width: 80px;--n: 15;--g: 7deg"></div>
.loader {
--b: 10px; /* border thickness */
--n: 10; /* number of dashes*/
--g: 10deg; /* gap between dashes*/
--c: red; /* the color */
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
padding: 1px;
background: conic-gradient(#0000,var(--c)) content-box;
-webkit-mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
animation: load 1s infinite steps(var(--n));
}
@keyframes load {to{transform: rotate(1turn)}}
同じコードを使用する4つの異なるローダーがあります。いくつかの変数を変更するだけで、CSSコードに触れることなく新しいローダーを生成できます。
変数は次のように定義されます。
--b
境界線の太さを定義します。--n
ダッシュの数を定義します。--g
ダッシュ間のギャップを定義します。円形の要素を扱っているので、これは角度の値です。--c
色を定義します。これは、さまざまな変数を確認するための図です。
スピナーローダーのCSS変数
CSSコードに取り組みましょう。別の図を使用して、ローダーの段階的な構成を説明します。
スピナーローダーのステップバイステップの図
まず、次のような円を作成します。
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
}
これまでのところ複雑なことはありません。これを使用すると、サイズを制御するためにaspect-ratio
1つの値()のみを変更できることに注意してください。width
次に、透明から定義された色(変数--c
)に円錐曲線の色を追加します。
.loader {
width:100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
}
このステップでmask
は、円の一部を繰り返し非表示にするプロパティを紹介します。--n
これはと--d
変数に依存します。図をよく見ると、次のパターンに気付くでしょう。
visible part
invisible part
visible part
invisible part
etc
これを行うには、を使用しますrepeating-conic-gradient(#000 0 X, #0000 0 Y)
。から0
までX
は不透明な色(可視部分)があり、からX
までY
は透明な色(不可視部分)があります。
変数を紹介します。
g
ように、各可視部分の間に等しいギャップが必要です。XYX = Y - g
n
目に見える部分が必要なので、の式Y
はY = 360deg/n
です。完全な円は360deg
、単純にで割ったものです。n
これまでのコードは次のとおりです。
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask: repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n))
}
この次のステップは最も難しいステップです。最終的な形状を取得するために、別のマスクを適用して一種の穴を作成する必要があるためです。これを行うにはradial-gradient()
、変数で論理的にaを使用しますb
。
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0)
に等しい厚さを削除するところから完全な円b
。
これを前のマスクに追加します。
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0),
repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n))
}
2つのマスクレイヤーがありますが、結果は私たちが望むものではありません。次のようになります。
奇妙に見えるかもしれませんが、それは論理的です。「最終的な」可視部分は、各マスクレイヤーの各可視部分の合計に他なりません。この動作は、を使用して変更できますmask-composite
。このプロパティを説明するために記事全体が必要になるので、単純に値を示します。
intersect
私たちの場合、 (そしてdestination-out
接頭辞付きのプロパティについて)考慮する必要があります。コードは次のようになります。
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0),
repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
}
形が出来上がりました!アニメーションが欠けているだけです。後者は無限回転です。
注意すべき唯一のことは、steps
アニメーションを使用して、固定されたダッシュと動く色の錯覚を作成しているということです。
これが違いを見るためのイラストです
線形アニメーションとステップアニメーション
最初のものは形状の線形で連続的な回転であり(私たちが望むものではありません)、2番目のものは離散アニメーション(私たちが望むもの)です。
アニメーションを含む完全なコードは次のとおりです。
<div class="loader"></div>
<div class="loader" style="--b: 15px;--c: blue;width: 120px;--n: 8"></div>
<div class="loader" style="--b: 5px;--c: green;width: 80px;--n: 6;--g: 20deg"></div>
<div class="loader" style="--b: 20px;--c: #000;width: 80px;--n: 15;--g: 7deg"></div>
.loader {
--b: 10px; /* border thickness */
--n: 10; /* number of dashes*/
--g: 10deg; /* gap between dashes*/
--c: red; /* the color */
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
padding: 1px;
background: conic-gradient(#0000,var(--c)) content-box;
-webkit-mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
animation: load 1s infinite steps(var(--n));
}
@keyframes load {to{transform: rotate(1turn)}}
説明で使用したコードとの違いに気付くでしょう。
padding: 1px
背景を追加して設定していますcontent-box
+/1deg
の色の間にありますrepeating-conic-gradient()
radial-gradient()
これらは、視覚的な不具合を回避するためのいくつかの修正です。グラデーションは「奇妙な」結果を生成することが知られているため、それらを回避するためにいくつかの値を手動で調整する必要があります。
前のローダーと同様に、概要から始めましょう。
https://codepen.io/t_afif/pen/bGoNddg
<div class="loader"></div>
<div class="loader" style="--s:10px;--n:10;color:red"></div>
<div class="loader" style="--g:0px;color:darkblue"></div>
<div class="loader" style="--s:25px;--g:8px;border-radius:50px;color:green"></div>
.loader {
--n:5; /* control the number of stripes */
--s:30px; /* control the width of stripes */
--g:5px; /* control the gap between stripes */
width:calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height:30px;
padding:var(--g);
margin:5px auto;
border:1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / calc((var(--n) + 1)*(var(--s) + var(--g))) 100%
no-repeat content-box;
animation: load 1.5s steps(calc(var(--n) + 1)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
以前のローダーと同じ構成になっています。ローダーを制御するCSS変数:
--n
ダッシュ/ストライプの数を定義します。--s
各ストライプの幅を定義します。--g
ストライプ間のギャップを定義します。CSS変数の図
上の図から、要素の幅が3つの変数に依存することがわかります。CSSは次のようになります。
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px; /* use any value you want here */
padding: var(--g);
border: 1px solid;
}
padding
両側にギャップを設定するために使用します。その場合、幅はストライプの数に幅とギャップを掛けたものに等しくなります。N
ストライプにはギャップがあるため、1つのギャップを削除しN-1
ます。
ストライプを作成するには、以下のグラデーションを使用します。
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
)
From 0
tos
は定義された色であり、from s
tos + g
は透明色(ギャップ)です。
currentColor
プロパティの値であるwhichを使用していcolor
ます。内部に色を定義しなかったためborder
、の値にも使用されることに注意してくださいcolor
。ローダーの色を変更したい場合は、color
プロパティを設定するだけです。
これまでのコード:
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px;
padding: var(--g);
border: 1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / 100% 100% content-box no-repeat;
}
content-box
グラデーションがパディング領域をカバーしないようにするために使用しています。100% 100%
次に、左の位置に等しいサイズを定義します。
アニメーションの時間です。このローダーでは、background-size
from 0% 100%
toをアニメーション化します。これは、fromから toへ100% 100%
のグラデーションの幅を意味します。0%100%
steps()
以前のローダーと同様に、連続的なアニメーションではなく、個別のアニメーションを使用することに依存します。
線形アニメーションとステップアニメーション
2つ目は作成したいもので、次のコードを追加することで実現できます。
.loader {
animation: load 1.5s steps(var(--n)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
最後の図をよく見ると、アニメーションが完全ではないことがわかります。を使用したとしても、最後に1つのストライプがありませんN
。これはバグではありませんが、どのように機能するsteps()
はずです。
これを克服するには、追加のステップを追加する必要があります。background-size
グラデーションを増やしてN+1
ストライプを含め、を使用しますsteps(N+1)
。これにより、最終的なコードが表示されます。
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px;
padding: var(--g);
margin: 5px auto;
border: 1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / calc((var(--n) + 1)*(var(--s) + var(--g))) 100%
content-box no-repeat;
animation: load 1.5s steps(calc(var(--n) + 1)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
グラデーションの幅は、N+1
(ではなく100%
) 1つのストライプとギャップの幅を掛けたものに等しいことに注意してください。
このチュートリアルを楽しんでいただけたでしょうか。興味があれば、私は500以上のCSSのみのシングルdivローダーを作成しました。また、バックグラウンドプロパティのみを使用してドットローダーを作成する方法を説明する別のチュートリアルを作成しました。
以下の便利なリンクを見つけて、複雑さのために完全には説明しなかった、私が使用したいくつかのプロパティの詳細を確認してください。
mask-composite
:https ://css-tricks.com/mask-compositing-the-crash-course/steps()
:https ://developer.mozilla.org/en-US/docs/Web/CSS/easing-function#the_steps_class_of_easing_functions読んでくれてありがとう!
リンク:https ://www.freecodecamp.org/news/how-to-create-a-css-only-loader/
1643336880
If you have a website, it's helpful to have a loader so users can tell something is happening once they've clicked a link or button.
You can use this loader component in a lot of places, and it should be as simple as possible.
In this post, we will see how to build two types of loaders with only one <div>
and a few lines of CSS code. Not only this but we will make them customizable so you can easily create different variations from the same code.
Here's what we'll build:
CSS-only Spinner and Progress Loader
Below is a demo of what we are building:
https://codepen.io/t_afif/pen/PoJyaNy
<div class="loader"></div>
<div class="loader" style="--b: 15px;--c: blue;width: 120px;--n: 8"></div>
<div class="loader" style="--b: 5px;--c: green;width: 80px;--n: 6;--g: 20deg"></div>
<div class="loader" style="--b: 20px;--c: #000;width: 80px;--n: 15;--g: 7deg"></div>
.loader {
--b: 10px; /* border thickness */
--n: 10; /* number of dashes*/
--g: 10deg; /* gap between dashes*/
--c: red; /* the color */
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
padding: 1px;
background: conic-gradient(#0000,var(--c)) content-box;
-webkit-mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
animation: load 1s infinite steps(var(--n));
}
@keyframes load {to{transform: rotate(1turn)}}
We have 4 different loaders using the same code. By only changing a few variables, we can generate a new loader without needing to touch the CSS code.
The variables are defined like below:
--b
defines the border thickness.--n
defines the number of dashes.--g
defines the gap between dashes. Since we're dealing with a circular element, this one is an angle value.--c
defines the color.Here is an illustration to see the different variables.
CSS Variables of the Spinner loader
Let's tackle the CSS code. We will use another figure to illustrate a step-by-step construction of the loader.
Step-by-Step illustration of the Spinner Loader
We first start by creating a circle like this:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
}
Nothing complex so far. Note the use of aspect-ratio
which allows us to only modify one value (the width
) in order to control the size.
Then we add a conic gradient coloration from transparent to the defined color (the variable --c
):
.loader {
width:100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
}
In this step, we introduce the mask
property to hide some parts of the circle in a repetitive manner. This will depend on the --n
and --d
variables. If you look closely at the figure, we will notice the following pattern:
visible part
invisible part
visible part
invisible part
etc
To do this, we use repeating-conic-gradient(#000 0 X, #0000 0 Y)
. From 0
to X
we have an opaque color (visible part) and from X
to Y
we have a transparent one (invisible part).
We introduce our variables:
g
between each visible part so the formula between X
and Y
will be X = Y - g
.n
visible part so the formula of Y
should be Y = 360deg/n
. A full circle is 360deg
so we simply divide it by n
Our code so far is:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask: repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n))
}
This next step is the trickiest one, because we need to apply another mask to create a kind of hole in order to get the final shape. To do this we will logically use a radial-gradient()
with our variable b
:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0)
A full circle from where we remove a thickness equal to b
.
We add this to the previous mask:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0),
repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n))
}
We have two mask layers, but the result is not what we want. We get the following:
It may look strange but it's logical. The "final" visible part is nothing but the sum of each visible part of each mask layer. We can change this behavior using mask-composite
. I would need a whole article to explain this property so I will simply give the value.
In our case, we need to consider intersect
(and destination-out
for the prefixed property). Our code will become:
.loader {
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
background: conic-gradient(#0000,var(--c));
mask:
radial-gradient(farthest-side,#0000 calc(100% - var(--b)),#000 0),
repeating-conic-gradient(#000 0 calc(360deg/var(--n) - var(--g)) , #0000 0 calc(360deg/var(--n));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
}
We are done with the shape! We are only missing the animation. The latter is an infinite rotation.
The only thing to note is that I am using a steps
animation to create the illusion of fixed dashes and moving colors.
Here is an illustration to see the difference
A Linear Animation vs a Steps Animation
The first one is a linear and continuous rotation of the shape (not what we want) and the second one is a discrete animation (the one we want).
Here is the full code including the animation:
<div class="loader"></div>
<div class="loader" style="--b: 15px;--c: blue;width: 120px;--n: 8"></div>
<div class="loader" style="--b: 5px;--c: green;width: 80px;--n: 6;--g: 20deg"></div>
<div class="loader" style="--b: 20px;--c: #000;width: 80px;--n: 15;--g: 7deg"></div>
.loader {
--b: 10px; /* border thickness */
--n: 10; /* number of dashes*/
--g: 10deg; /* gap between dashes*/
--c: red; /* the color */
width: 100px; /* size */
aspect-ratio: 1;
border-radius: 50%;
padding: 1px;
background: conic-gradient(#0000,var(--c)) content-box;
-webkit-mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
mask:
repeating-conic-gradient(#0000 0deg,
#000 1deg calc(360deg/var(--n) - var(--g) - 1deg),
#0000 calc(360deg/var(--n) - var(--g)) calc(360deg/var(--n))),
radial-gradient(farthest-side,#0000 calc(98% - var(--b)),#000 calc(100% - var(--b)));
-webkit-mask-composite: destination-in;
mask-composite: intersect;
animation: load 1s infinite steps(var(--n));
}
@keyframes load {to{transform: rotate(1turn)}}
You will notice a few differences with the code I used in the explanation:
padding: 1px
and setting the background to content-box
+/1deg
between the colors of the repeating-conic-gradient()
radial-gradient()
Those are some corrections to avoid visual glitches. Gradients are known to produce "strange" results in some cases so we have to adjust some values manually to avoid them.
Like the previous one loader, let's start with an overview:
https://codepen.io/t_afif/pen/bGoNddg
<div class="loader"></div>
<div class="loader" style="--s:10px;--n:10;color:red"></div>
<div class="loader" style="--g:0px;color:darkblue"></div>
<div class="loader" style="--s:25px;--g:8px;border-radius:50px;color:green"></div>
.loader {
--n:5; /* control the number of stripes */
--s:30px; /* control the width of stripes */
--g:5px; /* control the gap between stripes */
width:calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height:30px;
padding:var(--g);
margin:5px auto;
border:1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / calc((var(--n) + 1)*(var(--s) + var(--g))) 100%
no-repeat content-box;
animation: load 1.5s steps(calc(var(--n) + 1)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
We have the same configuration as the previous loader. CSS variables that control the loader:
--n
defines the number of dashes/stripes.--s
defines the width of each stripe.--g
defines the gap between stripes.Illustration of the CSS Variables
From the above figure we can see that the width of the element will depend on the 3 variables. The CSS will be as follows:
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px; /* use any value you want here */
padding: var(--g);
border: 1px solid;
}
We use padding
to set the gap on each side. Then the width will be equal to the number of stripes multiplied by their width and the gap. We remove one gap because for N
stripes we have N-1
gaps.
To create the stripes we will use the below gradient.
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
)
From 0
to s
is the defined color and from s
to s + g
a transparent color (the gap).
I am using currentColor
which is the value of the color
property. Note that I didn't define any color inside border
so it will also use to the value of color
. If we want to change the color of the loader, we only need to set the color
property.
Our code so far:
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px;
padding: var(--g);
border: 1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / 100% 100% content-box no-repeat;
}
I am using content-box
to make sure the gradient doesn't cover the padding area. Then I define a size equal to 100% 100%
and a left position.
It's time for the animation. For this loader, we will animate the background-size
from 0% 100%
to 100% 100%
which means the width of our gradient from 0%
to 100%
Like the previous loader, we will rely on steps()
to have a discrete animation instead of a continuous one.
A Linear Animation vs a Steps Animation
The second one is what we want to create, and we can achieve it by adding the following code:
.loader {
animation: load 1.5s steps(var(--n)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
If you look closely at the last figure, you will notice that the animation is not complete. We are missing one stripe at the end, even if we have used N
. This is not a bug but how steps()
is supposed to work.
To overcome this, we need to add an extra step. We increase the background-size
of our gradient to contain N+1
stripes and use steps(N+1)
. This will get us to the final code:
.loader {
width: calc(var(--n)*(var(--s) + var(--g)) - var(--g));
height: 30px;
padding: var(--g);
margin: 5px auto;
border: 1px solid;
background:
repeating-linear-gradient(90deg,
currentColor 0 var(--s),
#0000 0 calc(var(--s) + var(--g))
) left / calc((var(--n) + 1)*(var(--s) + var(--g))) 100%
content-box no-repeat;
animation: load 1.5s steps(calc(var(--n) + 1)) infinite;
}
@keyframes load {
0% {background-size: 0% 100%}
}
Note that the width of the gradient is equal to N+1
multiplied by the width of one stripe and a gap (instead of being 100%
)
I hope you enjoyed this tutorial. If you are interested, I have made more than 500 CSS-only single div loaders. I also wrote another tutorial to explain how to create the Dots loader using only background properties.
Find below useful links to get more detail about some properties I have used that I didn't explain thoroughly due to their complexity:
mask-composite
: https://css-tricks.com/mask-compositing-the-crash-course/steps()
: https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function#the_steps_class_of_easing_functionsThank you for reading!
Link: https://www.freecodecamp.org/news/how-to-create-a-css-only-loader/
1625051351
The NFT marketplace development is the current scenerio or trendsetter in the digital world. The value of Non Fungible Tokens (NFTs) has not dropped and is still significant and stable in the marketplace. The masssive increase in NFT token value has gained lot of users attraction to adopt this marketplace platform for its efficient features. It’s perfect and best time for investors to consider this blockchain based investment platform since the crypto market for NFT marketplaces is trending in recent times.
An Opensea and rarible similar platform with all technical features and functionalities is developed and given by professional experts. Connect with a leading blockchain company to raise the business standards and compete with others in the marketplace.
NFT Marketplace like OpenSea are highly considered to be best for buy, sell and trade across the world in recent times. This OpenSea Clone Script offers a lot of unique digital items for users to trade and benefit from it.
NFT Marketplace like Rarible are highly considered to be best NFT marketplace across the world in recent times. This OpenSea Clone Script offers a lot of unique digital items for users to trade and advantage from it. The NFT marketplace platform like Rarible has legal compliance in their whole functioning process and attractive crypto user interface (UI) to attract users towards this NFT marketplace platform.
NFT marketplace platform offers comprehensive service to buyers & sellers for developing this NFT marketplace well known worldwide.
An NFT marketplace platform like Rarible provides high-level security, fast transactions , immutability and fewer crypto transaction fees.
The creation of a marketplace platform or website like Rarible built using the latest blockchain technology stack software & highly skilled professional expert’s assistance.
The NFT marketplace website like Rarible is then tested under certain stages and made ready to start or launch for investors to skyrocket their desired business.
Investment towards a marketplace like Rarible has highly potential in cryptocurrency trading and a lot to provide cryptocurrency users since the token value is high volume for competing with others in the crypto based market.
BlockchainAppsDeveloper is the top leading NFT Marketplace Development Company, We offer ready-to-launch or start NFT Marketplace Development Services that help to build your own NFT Marketplace like Rarible, Opensea, Ghost market, etc.
GhostMarket Clone Script - GhostMarket Like NFT marketplace Development
OpenSea Clone Script - OpenSea Like NFT marketplace Development
Rarible Clone Script - Rarible LIke NFT marketplace Development
gods unchained clone script
Tinyhero clone script
#nft marketplace software development #nft marketplace development #nft marketplace like rarible #nft marketplace platform like opensea #nft