Вопросы и задачи на собеседовании фронтенд-разработчика в 2025 году
СОДЕРЖАНИЕ
Варианты вопросов с ответами для frontend junior во время технического собеседования
Вопросы и ответы для Middle фронтенд-разработчиков
Собеседования для программистов часто проходят в несколько этапов. Для тех, кто претендует на должность фронтенд-разработчика, испытания усложняются необходимостью продемонстрировать не только технические навыки, но и уровень креативного мышления.
Первый этап собеседования обычно сосредоточен на проверке софт-скиллов кандидата. Работодатели хотят убедиться, что кандидат обладает необходимыми коммуникативными навыками, способностью работать в команде и креативностью. Затем следует техническое интервью.
Варианты вопросов с ответами для frontend junior во время технического собеседования
Быть фронтенд-разработчиком сегодня — значит сочетать в себе дизайнерские и программные таланты, обеспечивая бесперебойную работу интерфейсов и их взаимодействие с сервером.
1. Как добавить CSS к HTML -документу?
Несколькими способами: внутренним (внутри тега <style>), внешним (ссылкой на CSS-файл) и встроенным (через атрибут style).
2. Что такое селекторы в CSS ?
Селекторы выбирают элементы HTML для применения стилей. Есть классовые, идентификаторные и универсальные селекторы, а также комбинированные селекторы.
3. Как объявить функцию в JavaScript ?
Функцию можно создать, используя ключевое слово function:
function myFunction() {
// код
}
4. Что такое событие в JavaScript и как его обработать?
Событие — это любое действие, совершенное пользователем или браузером, которое можно отследить и обработать. Примеры событий: клики, ввод текста, загрузка страницы. Для обработки событий используется метод addEventListener:
element.addEventListener('click', function() {
// код обработки события
});
5. Что такое Flexbox и как его использовать?
Flexbox — модель компоновки CSS для создания адаптивных макетов. Позволяет выравнивать и распределять пространство между элементами контейнера. Используется через свойства display: flex;.
6. Как работает сетка ( Grid ) в CSS ?
Это двухмерная система компоновки, создающая сложные макеты. Основные свойства: grid-template-columns, grid-template-rows и grid-gap.
7. Что такое медиазапросы в CSS ?
Медиазапросы создают адаптивные макеты, изменяя стили в зависимости от характеристик устройства (например, ширины экрана). Пример: @media (max-width: 600px) { /* стили */ }.
8. Как выполнять асинхронные операции в JavaScript ?
Асинхронные операции выполняются с помощью колбеков, промисов (Promise) и async/await.
9. Как обеспечить доступность ( accessibility ) веб-приложения?
Использовать семантические теги, атрибуты ARIA, обеспечить поддержку клавиатуры и создать четкие контрасты.
10. Как реализовать адаптивные изображения для различных устройств и экранов?
Применять атрибуты srcset и sizes для <img> или элементы <picture> для предоставления различных версий изображений в зависимости от размеров экрана.
Вопросы и ответы для Middle фронтенд-разработчиков
1. Какие методы оптимизации CSS вы знаете и как они применяются?
Методы включают минификацию, объединение файлов, использование критического CSS и асинхронную загрузку не критических стилей.
2. Как сделать элемент фиксированным при прокрутке страницы (например, фиксированный заголовок)?
Использовать свойство position: fixed; для элемента, чтобы он оставался на месте при прокрутке страницы.
3. В чем разница между null и undefined в JavaScript ?
null — это значение, присваиваемое переменной, чтобы указать на отсутствие значения. undefined означает, что переменная была объявлена, но не инициализирована.
4. Как работают хуки ( hooks ) в React ?
Хуки — функции для использования состояния и других возможностей React в функциональных компонентах. Примеры: `useState`, `useEffect`.
5. Что такое состояние ( state ) и пропсы ( props ) в React ?
Состояние — объект, управляющий динамическими данными компонента. Пропсы — данные, передаваемые в компонент извне.
6. Как работает роутинг в SPA ( Single Page Application )?
Роутинг управляет навигацией в SPA без перезагрузки страницы. Используются библиотеки, такие как React Router, для определения маршрутов и отображения компонентов.
7. Что такое webpack и как он используется?
webpack — модульный сборщик JavaScript, компилирующий модули и их зависимости в один или несколько пакетов для улучшения производительности.
8. Что такое компоненты высшего порядка ( HOC ) в React ?
HOC — функции, принимающие компонент и возвращающие новый компонент с дополнительной функциональностью.
9. Как управлять состоянием в больших приложениях?
Использовать библиотеки для управления состоянием, такие как Redux или Context API, для управления глобальным состоянием и разделения ответственности между компонентами.
10. Что такое CSS - in - JS и как его применять?
CSS-in-JS — метод написания внутри JavaScript. Популярные библиотеки включают styled-components и Emotion.
11. Какая технология для фронтенд-разработки будет наиболее популярна в ближайшем будущем?
В настоящее время React является одной из самых популярных технологий благодаря своей гибкости и активному сообществу. Ожидается, что она останется на вершине благодаря постоянным обновлениям и интеграции с новыми инструментами. Однако, стоит обратить внимание и на другие технологии, такие как Svelte и Vue.js, которые также набирают популярность за счет своей простоты и производительности.
Практические задачи для Junior фронтенд-разработчиков
1. Создание адаптивного навигационного меню
Описание задачи: Разработайте адаптивное навигационное меню, которое корректно работает на различных устройствах, от настольных компьютеров до мобильных телефонов. Навигационное меню должно включать несколько пунктов, которые, при уменьшении ширины экрана, сворачиваются в "гамбургер-меню".
Технические требования:
- Используйте HTML и CSS.
- Реализуйте адаптивность с помощью медиазапросов.
- Добавьте простую анимацию для открытия и закрытия «гамбургер-меню».
Пример кода:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Adaptive Navigation Menu</title>
<style>
body {
font-family: Arial, sans-serif;
}
.menu {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
background-color: #333;
}
.menu a {
color: white;
text-decoration: none;
padding: 10px;
}
.menu .hamburger {
display: none;
cursor: pointer;
}
.menu-links {
display: flex;
}
@media (max-width: 600px) {
.menu .hamburger {
display: block;
}
.menu-links {
display: none;
flex-direction: column;
width: 100%;
background-color: #333;
}
.menu-links a {
padding: 10px;
border-top: 1px solid #444;
}
}
</style>
</head>
<body>
<nav class="menu">
<div class="logo">Logo</div>
<div class="hamburger" onclick="toggleMenu()">☰</div>
<div class="menu-links" id="menuLinks">
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Services</a>
<a href="#">Contact</a>
</div>
</nav>
<script>
function toggleMenu() {
var menuLinks = document.getElementById('menuLinks');
if (menuLinks.style.display === 'flex') {
menuLinks.style.display = 'none';
} else {
menuLinks.style.display = 'flex';
}
}
</script>
</body>
</html>
2. Валидация формы регистрации
Описание задачи: Создайте форму регистрации с полями для имени пользователя, электронной почты и пароля. Реализуйте валидацию полей в реальном времени с помощью JavaScript. Убедитесь, что пользователю отображаются соответствующие сообщения об ошибках, если данные введены неправильно.
Технические требования:
- Используйте HTML и CSS для создания формы.
- Реализуйте валидацию с применением JavaScript.
- Обеспечьте валидацию на уровне фронтенда (например, проверка формата электронной почты, длины пароля и т.д.).
Пример кода:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Registration Form</title>
<style>
body {
font-family: Arial, sans-serif;
}
form {
max-width: 400px;
margin: auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 10px;
}
input {
display: block;
width: 100%;
padding: 10px;
margin-bottom: 10px;
border-radius: 5px;
border: 1px solid #ccc;
}
.error {
color: red;
font-size: 0.9em;
}
</style>
</head>
<body>
<form id="registrationForm">
<h2>Register</h2>
<input type="text" id="username" placeholder="Username" required>
<span class="error" id="usernameError"></span>
<input type="email" id="email" placeholder="Email" required>
<span class="error" id="emailError"></span>
<input type="password" id="password" placeholder="Password" required>
<span class="error" id="passwordError"></span>
<button type="submit">Register</button>
</form>
<script>
const form = document.getElementById('registrationForm');
const username = document.getElementById('username');
const email = document.getElementById('email');
const password = document.getElementById('password');
const usernameError = document.getElementById('usernameError');
const emailError = document.getElementById('emailError');
const passwordError = document.getElementById('passwordError');
form.addEventListener('submit', function(event) {
event.preventDefault();
validateUsername();
validateEmail();
validatePassword();
});
username.addEventListener('input', validateUsername);
email.addEventListener('input', validateEmail);
password.addEventListener('input', validatePassword);
function validateUsername() {
if (username.value.trim().length < 3) {
usernameError.textContent = 'Username must be at least 3 characters long';
} else {
usernameError.textContent = '';
}
}
function validateEmail() {
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailPattern.test(email.value.trim())) {
emailError.textContent = 'Enter a valid email address';
} else {
emailError.textContent = '';
}
}
function validatePassword() {
if (password.value.trim().length < 6) {
passwordError.textContent = 'Password must be at least 6 characters long';
} else {
passwordError.textContent = '';
}
}
</script>
</body>
</html>
Практические задачи для Middle фронтенд-разработчиков
1. Создание интерактивного календаря с React
Описание задачи: Разработайте интерактивный календарь с возможностью добавления и удаления событий. Календарь должен отображать текущий месяц, с возможностью навигации между месяцами, и позволять пользователям создавать, редактировать и удалять события на определенные даты.
Технические требования:
- Используйте React для создания компонентов.
- Реализуйте состояние и управление событиями с помощью хуков.
- Добавьте стилизацию для улучшения пользовательского опыта.
- Обеспечьте функциональность навигации между месяцами.
Пример кода:
import React, { useState } from 'react';
import './Calendar.css'; // Добавьте собственные стили
const daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
function Calendar() {
const [currentDate, setCurrentDate] = useState(new Date());
const [events, setEvents] = useState({});
const handleEventChange = (date, event) => {
setEvents({
...events,
[date]: event,
});
};
const renderDaysOfWeek = () => {
return daysOfWeek.map((day) => (
<div key={day} className="calendar-day-of-week">
{day}
</div>
));
};
const renderDaysInMonth = () => {
const startDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1).getDay();
const daysInMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate();
const days = [];
for (let i = 0; i < startDay; i++) {
days.push(<div key={`empty-${i}`} className="calendar-day empty"></div>);
}
for (let day = 1; day <= daysInMonth; day++) {
const date = new Date(currentDate.getFullYear(), currentDate.getMonth(), day).toDateString();
days.push(
<div key={day} className="calendar-day">
<span>{day}</span>
<input
type="text"
value={events[date] || ''}
onChange={(e) => handleEventChange(date, e.target.value)}
placeholder="Add event"
/>
</div>
);
}
return days;
};
const handlePrevMonth = () => {
setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, 1));
};
const handleNextMonth = () => {
setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1));
};
return (
<div className="calendar">
<div className="calendar-header">
<button onClick={handlePrevMonth}>Prev</button>
<h2>{currentDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}</h2>
<button onClick={handleNextMonth}>Next</button>
</div>
<div className="calendar-grid">
{renderDaysOfWeek()}
{renderDaysInMonth()}
</div>
</div>
);
}
export default Calendar;
2. Реализация поисковой системы с использованием Vue.js
import React, { useState } from 'react';
import './Calendar.css'; // Добавьте собственные стили
const daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
function Calendar() {
const [currentDate, setCurrentDate] = useState(new Date());
const [events, setEvents] = useState({});
const handleEventChange = (date, event) => {
setEvents({
...events,
[date]: event,
});
};
const renderDaysOfWeek = () => {
return daysOfWeek.map((day) => (
<div key={day} className="calendar-day-of-week">
{day}
</div>
));
};
const renderDaysInMonth = () => {
const startDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1).getDay();
const daysInMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate();
const days = [];
for (let i = 0; i < startDay; i++) {
days.push(<div key={`empty-${i}`} className="calendar-day empty"></div>);
}
for (let day = 1; day <= daysInMonth; day++) {
const date = new Date(currentDate.getFullYear(), currentDate.getMonth(), day).toDateString();
days.push(
<div key={day} className="calendar-day">
<span>{day}</span>
<input
type="text"
value={events[date] || ''}
onChange={(e) => handleEventChange(date, e.target.value)}
placeholder="Add event"
/>
</div>
);
}
return days;
};
const handlePrevMonth = () => {
setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, 1));
};
const handleNextMonth = () => {
setCurrentDate(new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1));
};
return (
<div className="calendar">
<div className="calendar-header">
<button onClick={handlePrevMonth}>Prev</button>
<h2>{currentDate.toLocaleDateString('en-US', { month: 'long', year: 'numeric' })}</h2>
<button onClick={handleNextMonth}>Next</button>
</div>
<div className="calendar-grid">
{renderDaysOfWeek()}
{renderDaysInMonth()}
</div>
</div>
);
}
export default Calendar;
Описание задачи: Создайте простую поисковую систему с использованием Vue.js.Приложение должно позволять пользователям вводить запросы и показывать результаты из заранее заданного списка элементов. Реализуйте фильтрацию результатов в реальном времени по мере ввода запроса.
Технические требования:
- Используйте Vue.jsдля создания компонентов.
- Реализуйте реактивность и управление состоянием с помощью Vuex или Composition API.
- Добавьте стилизацию для улучшения пользовательского опыта.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue.js Search System</title>
<script src="https://unpkg.com/vue@next"></script>
<style>
body {
font-family: Arial, sans-serif;
}
.search-container {
max-width: 600px;
margin: auto;
padding: 20px;
border: 1px solid #ccc;
border-radius: 10px;
}
.search-results {
margin-top: 20px;
}
.search-result {
padding: 10px;
border-bottom: 1px solid #ccc;
}
</style>
</head>
<body>
<div id="app">
<div class="search-container">
<input type="text" v-model="query" placeholder="Search..." />
<div class="search-results">
<div v-for="result in filteredResults" :key="result" class="search-result">
{{ result }}
</div>
</div>
</div>
</div>
<script>
const { createApp, computed } = Vue;
createApp({
data() {
return {
query: '',
items: ['Apple', 'Banana', 'Orange', 'Pineapple', 'Strawberry', 'Blueberry', 'Mango']
};
},
computed: {
filteredResults() {
return this.items.filter(item =>
item.toLowerCase().includes(this.query.toLowerCase())
);
}
}
}).mount('#app');
</script>
</body>
</html>
<style>
pre {
background-color: #272822;
color: #f8f8f2;
padding: 12px 16px;
border-radius: 8px;
overflow-x: auto;
font-family: Consolas, Monaco, monospace;
margin: 20px;
}
strong {
font: var(--title-h6);
color: var(--heading-color);
}
</style>