Что такое виджет гадания на Таро?
Виджет – небольшая интерактивная часть веб‑страницы, которую пользователь может разместить в любом месте сайта. Для Таро виджет обычно включает:
- Кнопку «Тянуть карту»;
- Область, где показывается изображение вытянутой карты;
- Текстовое описание значения карты;
- Опционально – возможность задать вопрос и получить расклад из нескольких карт.
Подобный функционал уже используется в популярных приложениях, таких как talking: таро гороскоп гадание, где пользователи могут быстро получить ответы от квалифицированных тарологов. Наш виджет будет работать автономно, без обращения к серверу, используя готовый набор данных о картах.
Требования к виджету
- Кросс‑браузерность – работает в современных браузерах (Chrome, Firefox, Safari, Edge).
- Лёгкость встраивания – достаточно добавить один
<script>и один<div>на страницу. - Отсутствие внешних зависимостей – чистый JavaScript без jQuery.
- Конфиденциальность – виджет не собирает и не передаёт пользовательские данные (соответствует требованиям Apple Privacy).
- Расширяемость – возможность добавить новые расклады, изменить стили, добавить анимацию.
Для работы виджета достаточно одного контейнера с идентификатором tarot-widget. Внутри он будет заполнен скриптом.
<!-- Блок, куда будет вставлен виджет -->
<div id="tarot-widget"></div>
<!-- Подключаем скрипт виджета (можно разместить в отдельном файле) -->
<script src="tarot-widget.js"></script>
Стили CSS
Ниже минимальный набор стилей, который делает виджет визуально приятным. Вы можете скопировать их в свой style.css или оставить внутри <style>, как в примере выше.
.widget {
border: 2px solid #16a085;
padding: 15px;
border-radius: 8px;
max-width: 350px;
background: #fafafa;
}
.card {
margin: 10px 0;
font-weight: bold;
font-size: 1.2em;
}
.meaning {
font-size: 0.9em;
color: #555;
}
.btn {
background: #16a085;
color: #fff;
border: none;
padding: 8px 12px;
border-radius: 4px;
cursor: pointer;
}
.btn:hover {
background: #1abc9c;
}
Логика JavaScript
Ключевая часть – массив с данными о 78 картах Таро и функции, которые случайным образом выбирают карту, выводят её изображение и значение.
Данные о картах
Для простоты в примере используется JSON‑массив tarotDeck. В реальном проекте картинки могут храниться в CDN, а описания – в отдельном файле.
const tarotDeck = [
{
name: "Шут (The Fool)",
img: "https://example.com/tarot/fool.png",
meaning: "Новый путь, свобода, риск, беззаботность."
},
{
name: "Маг (The Magician)",
img: "https://example.com/tarot/magician.png",
meaning: "Воля, творческая энергия, умение управлять ресурсами."
},
// ... остальные 76 карт ...
];
Функция случайного выбора
function getRandomCard {
const index = Math.floor(Math.random * tarotDeck.length);
return tarotDeck[index];
}
Рендеринг виджета
function renderWidget {
const container = document.getElementById('tarot-widget');
if (!container) return;
// Базовая разметка <div class="widget">
<h3>Гадание на Таро</h3>
<button class="btn" id="drawBtn">Тянуть карту</button>
<div id="result" style="margin-top:15px;"></div>
</div>
`;
const btn = document.getElementById('drawBtn');
const resultDiv = document.getElementById('result');
btn.addEventListener('click', => {
const card = getRandomCard; <div class="card">${card.name}</div>
<img src="${card.img}" alt="${card.name}" style="max-width:100%;height:auto;">
<div class="meaning">${card.meaning}</div>
`;
});
}
// Инициализируем после загрузки страницы
document.addEventListener('DOMContentLoaded', renderWidget);
Полный пример кода (tarot-widget.js)
// tarot-widget.js
// ---------------------------------------------------------------
// Данные о колоде (для примера – только 3 карты, расширьте до 78)
// ---------------------------------------------------------------
const tarotDeck = [
{
name: "Шут (The Fool)",
img: "https://i.imgur.com/0vK6p1r.png",
meaning: "Новый путь, свобода, риск, беззаботность."
},
{
name: "Маг (The Magician)",
img: "https://i.imgur.com/1Jb4Y2N.png",
meaning: "Воля, творческая энергия, умение управлять ресурсами."
},
{
name: "Верховная Жрица (The High Priestess)",
img: "https://i.imgur.com/2Kf8s9Q.png",
meaning: "Интуиция, тайные знания, внутренний голос."
}
// Добавьте остальные карты в том же формате
];
// ---------------------------------------------------------------
// Случайный выбор карты
// ---------------------------------------------------------------
function getRandomCard {
const index = Math.floor(Math.random * tarotDeck.length);
return tarotDeck[index];
}
// ---------------------------------------------------------------// Рендеринг виджета
// ---------------------------------------------------------------
function renderWidget {
const container = document.getElementById('tarot-widget');
if (!container) {
console.warn('Контейнер #tarot-widget не найден');
return;
}
// Основная разметка виджета
`;
const btn = document.getElementById('drawBtn');
const resultDiv = document;getElementById('result');
btn.addEventListener('click', => {
const card = getRandomCard;
// Формируем вывод ${card.name}
${card.meaning}
`;
// Пример анимации (fade‑in)
resultDiv.style.opacity = 0;
setTimeout( => resultDiv.style.transition = "opacity 0.5s", 0);
setTimeout( => resultDiv.style.opacity = 1, 10);
});
}
// Инициализация после полной загрузки DOM
document.addEventListener('DOMContentLoaded', renderWidget);
Как интегрировать виджет в ваш сайт
- Создайте файл
tarot-widget.jsи вставьте в него код из раздела 6. - Разместите в корне сайта (или в подпапке
js/). - Подключите скрипт после контейнера (или в конце
<body>):<script src="js/tarot-widget.js"></script> - Если вы хотите изменить стили, добавьте свой CSS‑файл либо переопределите классы
.widget,.btnи т.д.
<div id="tarot-widget"></div> Расширения и улучшения
Базовый виджет уже готов к использованию, но в реальных проектах часто требуется более сложный функционал. Ниже несколько идей, как можно улучшить виджет.
Расклад «Три карты»
function drawThreeCards {
const shuffled = [...tarotDeck].sort( => Math.random ─ 0.5);
return shuffled.slice(0, 3);
}
// В обработчике:
btn.addEventListener('click', => {
const cards = drawThreeCards; <div class="card">${card.name}</div>
<img src="${card.img}" alt="${card.name}" style="max-width:100%;height:auto;">
<div class="meaning">${card.meaning}</div>
<hr>
`).join('');
});
Сохранение истории в localStorage
function saveToHistory(card) {
const history = JSON.parse(localStorage.getItem('tarotHistory') || '[]');
history.unshift({name: card.name, time: new Date.toISOString});
localStorage.setItem('tarotHistory', JSON.stringify(history.slice(0,20)));
}
Поддержка нескольких языков
Создайте объект i18n и подставляйте строки в зависимости от выбранного языка.
const i18n = {
ru: {title: "Гадание на Таро", btn: "Тянуть карту"},
en: {title: "Tarot Reading", btn: "Draw a card"}
};
let lang = 'ru'; // можно менять динамически
// При рендере: <div class="widget">
<h3>${i18n[lang].title}</h3>
<button class="btn" id="drawBtn">${i18n[lang].btn}</button>
…
`;
Анимация «перемешивания»
Для более плавного UX можно добавить CSS‑анимацию вращения картинки перед тем, как показать её.
.card-img {
animation: spin 0.6s ease-out;
}
@keyframes spin {
from {transform: rotateY(180deg);}
to {transform: rotateY(0deg);}
}
Интеграция с сервером
Если требуется хранить результаты гаданий (например, в приложении talking: таро гороскоп гадание), отправьте запрос POST на ваш API после выбора карты.
fetch('/api/tarot', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({card: card.name, userId: USER_ID})
})
.then(r => r.json)
.then(data => console.log('Saved', data));
Мы создали полностью автономный виджет гадания на Таро, который:
- не требует сторонних библиотек;
- не собирает пользовательские данные (соответствует политикам конфиденциальности, как у talking);
- может быть расширен до сложных раскладов, локализации и интеграции с сервером.
Скопируйте представленный код, адаптируйте стили под дизайн вашего сайта и наслаждайтесь мгновенными гаданиями для пользователей. При желании вы можете добавить собственные изображения, более детальные описания и даже систему рейтингов специалистов, как в приложении talking: таро гороскоп гадание.
Удачной разработки и мистических открытий!