/
oks14
/
cdg_practice
Обзор
Документация
Войти
/
oks14
/
cdg_practice
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Lab_rework
Lab4.html
447 строк
11 KB
Андрей Таратайцев
upload JavaScript-file for code
30 ноя 2025, 19:17
30 ноя 2025, 19:17
2bb3ea2
Код
Авторство
О чём код?
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Персональный сайт</title> <link rel="stylesheet" href="styles.css"> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: Arial, sans-serif; } body { background: #f5f5f5; color: #222; scroll-behavior: smooth; } .container { width: 90%; max-width: 1200px; margin: auto; } .header { background: white; padding: 20px 0; box-shadow: 0 2px 10px rgba(0,0,0,0.1); position: fixed; width: 100%; top: 0; z-index: 1000; transition: all 0.3s ease; } .header.scrolled { padding: 10px 0; background: rgba(255, 255, 255, 0.95); } .header-content { display: flex; justify-content: space-between; align-items: center; } .nav a { margin-left: 20px; text-decoration: none; color: #333; font-weight: bold; position: relative; transition: color 0.3s; } .nav a:hover { color: #007bff; } .nav a::after { content: ''; position: absolute; width: 0; height: 2px; bottom: -5px; left: 0; background-color: #007bff; transition: width 0.3s; } .nav a:hover::after { width: 100%; } .hero { padding: 120px 0 80px; display: flex; align-items: center; background: #ffffff; opacity: 0; transform: translateY(20px); transition: opacity 1s, transform 1s; } .hero.visible { opacity: 1; transform: translateY(0); } .hero-content { display: flex; justify-content: space-between; align-items: center; gap: 40px; } .hero-photo { width: 300px; border-radius: 20px; box-shadow: 0 5px 20px rgba(0,0,0,0.2); transition: transform 0.5s, box-shadow 0.5s; } .hero-photo:hover { transform: scale(1.05); box-shadow: 0 10px 30px rgba(0,0,0,0.3); } .btn { display: inline-block; margin-top: 20px; background: #007bff; color: white; padding: 12px 24px; border-radius: 8px; text-decoration: none; transition: all 0.3s; border: none; cursor: pointer; position: relative; overflow: hidden; } .btn:hover { background: #005ad1; transform: translateY(-3px); box-shadow: 0 5px 15px rgba(0, 123, 255, 0.4); } .btn:active { transform: translateY(-1px); } .btn::after { content: ''; position: absolute; top: 50%; left: 50%; width: 5px; height: 5px; background: rgba(255, 255, 255, 0.5); opacity: 0; border-radius: 100%; transform: scale(1, 1) translate(-50%); transform-origin: 50% 50%; } .btn:focus:not(:active)::after { animation: ripple 1s ease-out; } @keyframes ripple { 0% { transform: scale(0, 0); opacity: 0.5; } 20% { transform: scale(25, 25); opacity: 0.3; } 100% { opacity: 0; transform: scale(40, 40); } } section { padding: 60px 0; opacity: 0; transform: translateY(30px); transition: opacity 0.8s, transform 0.8s; } section.visible { opacity: 1; transform: translateY(0); } .skills-grid, .projects-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; } .skill-card, .project-card { padding: 30px; background: white; border-radius: 12px; text-align: center; box-shadow: 0 3px 12px rgba(0,0,0,0.1); transition: all 0.3s; cursor: pointer; } .skill-card:hover, .project-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0,0,0,0.15); } .footer { background: #111; color: white; padding: 40px 0; } .contact-form { display: flex; flex-direction: column; gap: 15px; max-width: 500px; } .contact-form input, .contact-form textarea { padding: 12px; border-radius: 8px; border: none; transition: all 0.3s; } .contact-form input:focus, .contact-form textarea:focus { outline: none; box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.3); } /* Модальное окно */ .modal { display: none; position: fixed; z-index: 2000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); animation: fadeIn 0.3s; } .modal-content { background-color: white; margin: 10% auto; padding: 30px; border-radius: 12px; width: 80%; max-width: 500px; box-shadow: 0 5px 25px rgba(0, 0, 0, 0.2); animation: slideIn 0.3s; position: relative; } .close-btn { position: absolute; top: 15px; right: 15px; font-size: 24px; cursor: pointer; color: #777; transition: color 0.3s; } .close-btn:hover { color: #333; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideIn { from { transform: translateY(-50px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @media (max-width: 768px) { .hero-content { flex-direction: column; text-align: center; } .hero-photo { width: 200px; } } </style> </head> <body> <header class="header"> <div class="container header-content"> <h1 class="logo">Таратайцев Андрей</h1> <nav class="nav"> <a href="#about">О себе</a> <a href="#skills">Увлечения</a> <a href="#contact">Контакты</a> </nav> </div> </header> <section class="hero"> <div class="container hero-content"> <div> <h2>Привет!</h2> <p>Создаю современные адаптивные сайты и веб‑интерфейсы.</p> <a class="btn" href="#contact">Связаться со мной</a> </div> <img src="img/profile.jpg" alt="Фото" class="hero-photo" /> </div> </section> <section id="about" class="about container"> <h2>О себе</h2> <p> Таратайцев Андрей — создаю сайты и веб-приложения. Люблю превращать макеты в работающие и удобные интерфейсы. Использую современные технологии чтобы сайты хорошо выглядели на всех устройствах. </p> </section> <section id="skills" class="skills container"> <h2>Увлечения</h2> <div class="skills-grid"> <div class="skill-card">Спорт</div> <div class="skill-card">Программирование</div> <div class="skill-card">Рисование</div> </div> </section> <footer id="contact" class="footer"> <div class="container"> <h2>Связаться со мной</h2> <form class="contact-form"> <input type="text" placeholder="Имя" /> <input type="email" placeholder="Email" /> <textarea placeholder="Сообщение"></textarea> <button class="btn" type="submit">Отправить</button> </form> </div> </footer> <!-- Модальное окно --> <div id="modal" class="modal"> <div class="modal-content"> <span class="close-btn">×</span> <h3>Спасибо за интерес!</h3> <p>Я свяжусь с вами в ближайшее время.</p> </div> </div> <script> // Эффект появления элементов при прокрутке function isElementInViewport(el) { const rect = el.getBoundingClientRect(); return ( rect.top <= (window.innerHeight || document.documentElement.clientHeight) * 0.8 && rect.bottom >= 0 ); } function handleScrollAnimation() { const elements = document.querySelectorAll('.hero, section'); elements.forEach(el => { if (isElementInViewport(el)) { el.classList.add('visible'); } }); } // Изменение шапки при прокрутке function handleHeaderScroll() { const header = document.querySelector('.header'); if (window.scrollY > 50) { header.classList.add('scrolled'); } else { header.classList.remove('scrolled'); } } // Плавная прокрутка к якорям document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function(e) { e.preventDefault(); const targetId = this.getAttribute('href'); if (targetId === '#') return; const targetElement = document.querySelector(targetId); if (targetElement) { window.scrollTo({ top: targetElement.offsetTop - 80, behavior: 'smooth' }); } }); }); // Модальное окно const modal = document.getElementById('modal'); const closeBtn = document.querySelector('.close-btn'); // Открытие модального окна при отправке формы document.querySelector('.contact-form').addEventListener('submit', function(e) { e.preventDefault(); modal.style.display = 'block'; this.reset(); }); // Закрытие модального окна closeBtn.addEventListener('click', function() { modal.style.display = 'none'; }); // Закрытие модального окна при клике вне его window.addEventListener('click', function(e) { if (e.target === modal) { modal.style.display = 'none'; } }); // Эффекты при наведении на карточки навыков document.querySelectorAll('.skill-card').forEach(card => { card.addEventListener('mouseenter', function() { this.style.transform = 'translateY(-5px) scale(1.02)'; }); card.addEventListener('mouseleave', function() { this.style.transform = 'translateY(0) scale(1)'; }); }); // Инициализация при загрузке страницы window.addEventListener('DOMContentLoaded', () => { handleScrollAnimation(); handleHeaderScroll(); }); // Обработчики событий прокрутки window.addEventListener('scroll', () => { handleScrollAnimation(); handleHeaderScroll(); }); </script> </body> </html>