Astro calendar_today 23 апр. 2026 г. schedule 2 мин

Landing Page на Astro: Создаём конверсионный лендинг

Как создать высококонверсионный лендинг на Astro.js: Hero-секция, CTA, анимации, A/B тесты, форма сбора лидов и PageSpeed 100. Пошаговый гайд с кодом.

person
Журналист
Автор
Лендинг на Astro — гайд по созданию посадочных страниц

Лендинг — это страница, где каждая миллисекунда загрузки стоит реальных денег. Исследования Amazon и Google показывают: +100 мс к загрузке = -1% конверсии. Astro — единственный фреймворк, который даёт PageSpeed 100 без компромиссов. Разбираем, как строить лендинги правильно.

Почему скорость = конверсия

Скорость загрузкиВлияние на конверсию
0-1 секБазовая конверсия
1-2 сек-7%
2-3 сек-24%
3-4 сек-42%
4+ сек-60%+

Astro лендинг с CDN загружается за 0.5-1.0 секунды. Это прямо влияет на ваши деньги.

Структура типового лендинга

code
---
// src/pages/index.astro
import BaseLayout from '../layouts/BaseLayout.astro';
import Hero from '../sections/Hero.astro';
import Features from '../sections/Features.astro';
import HowItWorks from '../sections/HowItWorks.astro';
import Testimonials from '../sections/Testimonials.astro';
import Pricing from '../sections/Pricing.astro';
import FAQ from '../sections/FAQ.astro';
import CTA from '../sections/CTA.astro';
---

<BaseLayout title="..." description="...">
  <Hero />
  <!-- Заголовок + подзаголовок + CTA -->
  <Features />
  <!-- Преимущества продукта -->
  <HowItWorks />
  <!-- Как это работает: 3 шага -->
  <Testimonials />
  <!-- Отзывы/социальные доказательства -->
  <Pricing />
  <!-- Тарифные планы -->
  <FAQ />
  <!-- Частые вопросы -->
  <CTA />
  <!-- Финальный призыв к действию -->
</BaseLayout>

Hero-секция: Первое впечатление

code
---
// src/sections/Hero.astro
// Форма захвата лидов — Preact-остров
import LeadForm from '../components/LeadForm.tsx';
---

<section class="hero">
  <!-- Бейдж-якорь доверия -->
  <div class="hero__badge">✅ 2 000+ клиентов уже используют</div>

  <!-- H1 — главный заголовок с выгодой -->
  <h1 class="hero__headline">
    Создайте сайт за 30 минут<br />
    <span class="gradient-text">без разработчиков</span>
  </h1>

  <!-- Подзаголовок — конкретика -->
  <p class="hero__subheadline">
    Astro-конструктор для малого бизнеса. PageSpeed 100, домен в подарок, деплой одной
    кнопкой. Без ежемесячной платы.
  </p>

  <!-- CTA — конкретное действие -->
  <div class="hero__cta">
    <LeadForm client:load />
    <p class="hero__social-proof">Бесплатно 14 дней · Без карты · Отмена в 1 клик</p>
  </div>

  <!-- Визуальное доказательство -->
  <img
    src="/screenshot-dashboard.webp"
    alt="Скриншот интерфейса платформы"
    width="1200"
    height="680"
    loading="eager"
    fetchpriority="high"
  />
</section>

Анимации: CSS + Intersection Observer

Плавное появление элементов при скролле — без JavaScript-библиотек:

code
---
// src/components/AnimatedSection.astro
---

<div class="animate-on-scroll">
  <slot />
</div>

<script>
  const observer = new IntersectionObserver(
    (entries) => {
      entries.forEach((el) => {
        if (el.isIntersecting) {
          el.target.classList.add('is-visible');
          observer.unobserve(el.target);
        }
      });
    },
    { threshold: 0.1 },
  );

  document.querySelectorAll('.animate-on-scroll').forEach((el) => observer.observe(el));
</script>

<style>
  .animate-on-scroll {
    opacity: 0;
    transform: translateY(24px);
    transition:
      opacity 0.6s ease,
      transform 0.6s ease;
  }
  .animate-on-scroll.is-visible {
    opacity: 1;
    transform: none;
  }
</style>

Форма захвата лидов (Preact-остров)

code
// src/components/LeadForm.tsx
import { useState } from 'preact/hooks';

interface Props {
  action?: string;
  buttonText?: string;
}

export default function LeadForm({
  action = '/api/leads',
  buttonText = 'Начать бесплатно →',
}: Props) {
  const [email, setEmail] = useState('');
  const [status, setStatus] = useState<'idle' | 'loading' | 'done'>('idle');

  async function submit(e: Event) {
    e.preventDefault();
    setStatus('loading');
    await fetch(action, {
      method: 'POST',
      body: JSON.stringify({ email }),
      headers: { 'Content-Type': 'application/json' },
    });
    setStatus('done');
  }

  if (status === 'done') {
    return <p>🎉 Отлично! Проверьте email — отправили доступ.</p>;
  }

  return (
    <form onSubmit={submit} class="lead-form">
      <input
        type="email"
        value={email}
        onInput={(e) => setEmail((e.target as HTMLInputElement).value)}
        placeholder="Ваш email"
        required
      />
      <button type="submit" disabled={status === 'loading'}>
        {status === 'loading' ? '...' : buttonText}
      </button>
    </form>
  );
}

Секция преимуществ

code
---
const features = [
  {
    icon: 'bolt',
    title: 'Скорость без компромиссов',
    description:
      'PageSpeed 100 из коробки. Время до первого байта — 20 мс с Cloudflare CDN.',
  },
  {
    icon: 'shield',
    title: 'Безопасность',
    description: 'Статические файлы — нет PHP, нет базы данных. Нечего взламывать.',
  },
  {
    icon: 'savings',
    title: 'Бесплатный хостинг',
    description: 'Cloudflare Pages — бесплатно до 100K запросов в день.',
  },
];
---

<section class="features">
  <h2>Почему выбирают нас</h2>
  <div class="features-grid">
    {
      features.map((f) => (
        <div class="feature-card">
          <span class="material-symbols-outlined">{f.icon}</span>
          <h3>{f.title}</h3>
          <p>{f.description}</p>
        </div>
      ))
    }
  </div>
</section>
science

A/B тесты

Для A/B теста заголовков используйте Astro middleware + cookie. Случайно показывайте вариант A или B и измеряйте конверсию.

push_pin

Sticky CTA

Добавьте фиксированную кнопку внизу экрана через Preact-остров. Она появляется после скролла на 30% страницы.

timer

Taimer обратного отсчёта

FOMO-механика: таймер скидки через Preact-остров с client:only. Хранить дату окончания в frontmatter или env-переменных.

SEO для лендинга

Лендинг должен ранжироваться по одному целевому запросу:

code
---
// Ключевое слово: "конструктор сайтов для бизнеса"
---

<BaseLayout
  title="Конструктор сайтов для малого бизнеса | YourProduct"
  description="Создайте профессиональный сайт за 30 минут. PageSpeed 100, домен в подарок. Бесплатный пробный период."
/>

JSON-LD для лендинга:

code
---
const schema = {
  '@context': 'https://schema.org',
  '@type': 'SoftwareApplication',
  name: 'YourProduct',
  applicationCategory: 'WebApplication',
  offers: {
    '@type': 'Offer',
    price: '0',
    priceCurrency: 'RUB',
    description: 'Бесплатный период 14 дней',
  },
  aggregateRating: {
    '@type': 'AggregateRating',
    ratingValue: '4.8',
    ratingCount: '2000',
  },
};
---

<script type="application/ld+json" set:html={JSON.stringify(schema)} />

Чеклист лендинга

  • ☑ H1 содержит главное ключевое слово
  • ☑ Форма или CTA-кнопка на первом экране
  • ☑ Социальное доказательство (счётчик клиентов, отзывы, логотипы)
  • ☑ Все изображения с loading="eager" на первом экране
  • ☑ Страница весит < 100 KB (JS)
  • ☑ PageSpeed Mobile > 90
  • ☑ Форма подключена к CRM / Email-системе
  • ☑ Настроен пиксель аналитики (GA4 / Яндекс Метрика)

Итог

Лендинг на Astro — это быстро и эффективно. Нулевой JavaScript по умолчанию, Preact-острова для форм, CSS-анимации без библиотек и PageSpeed 100 — ваш лендинг будет конвертировать лучше конкурентов просто за счёт скорости. Деплойте на Cloudflare Pages бесплатно.

Портрет автора Дмитрий Соколов

Senior Frontend Engineer / Tech Writer

Senior Frontend Engineer с 9-летним опытом. Специализируется на Astro.js и JAMstack.

Комментарии

Загрузка комментариев...

Оставить комментарий

Комментарии проходят модерацию перед публикацией. Правила

Рекомендуем к прочтению