Оригинальное меню, реализованное на HTML и CSS. Логика раскрытия создана в JS.
👉 @seniorFront
Senior Front - это канал для frontend программистов, которые интересуются разработкой веб-приложений с использованием javascript, html и css. Здесь вы найдете практические задачки, проверки знаний, а также интересные статьи, которые помогут вам расширить свои профессиональные навыки. Администраторы канала всегда готовы ответить на ваши вопросы и помочь в решении возникших проблем. Если у вас есть предложения по сотрудничеству или вы хотите разместить рекламу на канале, вы можете связаться с администраторами по указанным контактам: @seniorFrontPromo, @maria_seniorfront. Также есть возможность обсудить рекламные вопросы с менеджером по рекламе: @Spiral_Yuri. Присоединяйтесь к Senior Front и вы всегда будете в курсе последних новостей и тенденций в мире frontend разработки!
11 Jan, 12:30
11 Jan, 11:30
11 Jan, 09:02
10 Jan, 09:04
09 Jan, 16:02
08 Jan, 17:02
08 Jan, 09:02
07 Jan, 16:05
07 Jan, 09:02
06 Jan, 14:40
06 Jan, 12:40
06 Jan, 09:04
05 Jan, 16:01
05 Jan, 09:07
'xcyc', 'xc', 'yc' —> // true
'xcyc', 'yc', 'xc' —> // true
'codewars', 'code', 'wars' —> // true
'codewars', 'cdwr', 'oeas' —> // true
'codewars', 'code', 'code' —> // false
04 Jan, 16:03
04 Jan, 09:02
03 Jan, 09:03
02 Jan, 16:02
02 Jan, 09:02
01 Jan, 17:02
01 Jan, 09:03
31 Dec, 16:02
31 Dec, 09:06
30 Dec, 16:03
30 Dec, 09:02
animation
вместе с параметром infinite
, который указывает, что анимация должна повторяться бесконечно.@keyframes changeColor {
0% {
background-color: lightblue;
}
50% {
background-color: lightgreen;
}
100% {
background-color: lightblue;
}
}
.animated-box {
width: 100px;
height: 100px;
background-color: lightblue;
animation: changeColor 3s infinite;
}
29 Dec, 16:03
29 Dec, 09:03
"http://google.com" // "google"
"http://google.co.jp" // "google"
"www.xakep.ru" // "xakep"
"https://youtube.com" // "youtube"
28 Dec, 16:02
28 Dec, 09:02
27 Dec, 09:04
26 Dec, 16:05
26 Dec, 09:03
25 Dec, 17:02
25 Dec, 09:02
24 Dec, 16:02
24 Dec, 12:00
24 Dec, 09:02
23 Dec, 16:02
23 Dec, 09:06
__proto__
(или скрытое свойство [[Prototype]]
), которое указывает на его прототип. Прототип — это другой объект, от которого объект наследует свойства и методы. Объекты могут быть созданы с использованием конструктора, и все объекты, созданные одним и тем же конструктором, наследуют от одного и того же прототипа.Object.prototype
). Если свойство не найдено в цепочке прототипов, результатом будет undefined
.myDog
наследует метод speak
от Animal.prototype
и метод bark
от Dog.prototype
. Когда вызывается myDog.speak()
, JavaScript сначала ищет метод speak
в myDog
. Поскольку его там нет, он переходит к Dog.prototype
, где тоже его не находит, и затем переходит к Animal.prototype
, где метод speak
найден и выполняется.// Создаем объект Animal
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} издает звук.`);
};
// Создаем объект Dog, который наследует от Animal
function Dog(name, breed) {
Animal.call(this, name); // Вызов конструктора Animal
this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype); // Наследование прототипа Animal
Dog.prototype.constructor = Dog; // Восстановление конструктора Dog
Dog.prototype.bark = function() {
console.log(`${this.name} лает.`);
};
const myDog = new Dog('Рекс', 'Лабрадор');
myDog.speak(); // Рекс издает звук.
myDog.bark(); // Рекс лает.
{}
, имеют в качестве прототипа Object.prototype
. Все функции, включая функции-конструкторы, имеют свойство prototype
, которое указывает на прототип объектов, созданных этой функцией.Object.setPrototypeOf()
, но это не рекомендуется из-за потенциальных проблем с производительностью.const cat = {
meow() {
console.log('Мяу!');
}
};
const myCat = Object.create(cat);
myCat.name = 'Мурка';
myCat.meow(); // Мурка мяукает.
Object.setPrototypeOf(myCat, {});
myCat.meow(); // Ошибка, так как метод больше не существует в цепочке прототипов
22 Dec, 16:02
22 Dec, 09:03
Mmmm => []
Super => [2,4]
Apple => [1,5]
YoMama -> [1,2,4,6]
21 Dec, 16:03
21 Dec, 09:02
20 Dec, 09:01
:checked
19 Dec, 16:05
18 Dec, 17:02
18 Dec, 09:02
17 Dec, 16:07
06 Dec, 12:00
06 Dec, 09:02
05 Dec, 16:02
05 Dec, 10:30
05 Dec, 06:30
04 Dec, 16:01
04 Dec, 12:00
04 Dec, 09:09
03 Dec, 16:07
03 Dec, 09:01
02 Dec, 16:01
02 Dec, 12:00
02 Dec, 09:02
T
необязательными.interface User {
id: number;
name: string;
email: string;
}
const updateUser = (id: number, userUpdates: Partial<User>) => {
// Обновление пользователя
};
updateUser(1, { name: 'Alice' }); // Можно передать только часть свойств
T
обязательными.interface User {
id?: number;
name?: string;
email?: string;
}
const user: Required<User> = {
id: 1,
name: 'Alice',
email: '[email protected]'
}; // Все свойства должны быть указаны
T
только для чтения.interface User {
id: number;
name: string;
email: string;
}
const user: Readonly<User> = {
id: 1,
name: 'Alice',
email: '[email protected]'
};
user.id = 2; // Ошибка: свойство id доступно только для чтения
K
из типа T
.interface User {
id: number;
name: string;
email: string;
}
const user: Pick<User, 'id' | 'name'> = {
id: 1,
name: 'Alice'
}; // Только свойства id и name
K
из типа T
.interface User {
id: number;
name: string;
email: string;
}
const user: Omit<User, 'email'> = {
id: 1,
name: 'Alice'
}; // Все свойства, кроме email
K
, а значения типа T
.type Roles = 'admin' | 'user' | 'guest';
const roles: Record<Roles, string> = {
admin: 'Admin User',
user: 'Regular User',
guest: 'Guest User'
};
T
те типы, которые находятся в U
.type T = 'a' | 'b' | 'c';
type U = 'a';
type Result = Exclude<T, U>; // 'b' | 'c'
T
, которые также находятся в U
.type T = 'a' | 'b' | 'c';
type U = 'a' | 'c';
type Result = Extract<T, U>; // 'a' | 'c'
null
и undefined
из типа T
.type T = string | number | null | undefined;
type NonNullableT = NonNullable<T>; // string | number
T
.function getUser() {
return { id: 1, name: 'Alice' };
}
type User = ReturnType<typeof getUser>; // { id: number, name: string }
01 Dec, 16:03
01 Dec, 09:02
removeParentheses("a (bc d)e") => "a e"
removeParentheses("a(b(c))") => "a"
30 Nov, 16:03
30 Nov, 09:02
29 Nov, 13:00
28 Nov, 16:02
28 Nov, 09:03
27 Nov, 17:02
27 Nov, 09:02
26 Nov, 15:00
26 Nov, 11:00
26 Nov, 06:00
25 Nov, 16:02
25 Nov, 09:04
const biggy = 9997000254740991n
const alsoBig = BigInt(9997000254999999)
const seven = 7n
const five = 5n
console.log(seven / five)
// 1
const biggy = 10n
const number = 5
console.log(biggy + number)
// Uncaught TypeError: Cannot mix BigInt and other types,
// use explicit conversions
const biggy = 10n
const number = 5
console.log(biggy + BigInt(number))
// 15n
console.log(Number(biggy) + number)
// 15
24 Nov, 16:08
24 Nov, 09:03
Ввод: 42145 —> вывод: 54421
Ввод: 145263 —> вывод: 654321
Ввод: 123456789 —> вывод: 987654321
23 Nov, 16:05
23 Nov, 09:02
22 Nov, 09:02
21 Nov, 16:05
21 Nov, 09:02
20 Nov, 17:12
20 Nov, 13:12
20 Nov, 06:07
19 Nov, 18:00
14 Nov, 17:00
14 Nov, 16:03
14 Nov, 10:00
14 Nov, 09:00
13 Nov, 17:01
13 Nov, 09:02
12 Nov, 16:02
12 Nov, 09:02
11 Nov, 16:02
11 Nov, 09:02
document.querySelector('form').addEventListener('submit', function(event) {
event.preventDefault();
console.log('Форма не отправлена!');
});
document.querySelector('a').addEventListener('click', function(event) {
event.preventDefault();
console.log('Переход по ссылке отменен!');
});
document.querySelector('.child').addEventListener('click', function(event) {
event.stopPropagation();
console.log('Клик на child');
});
document.querySelector('.parent').addEventListener('click', function() {
console.log('Клик на parent');
});
.child
элемент не вызовет обработчик клика на .parent
элементе.10 Nov, 18:07
10 Nov, 09:09
beeramid(1500, 2); // should === 12
beeramid(5000, 3); // should === 16
09 Nov, 16:02
09 Nov, 09:02
08 Nov, 15:41
08 Nov, 09:03
07 Nov, 16:02
07 Nov, 13:00
06 Nov, 14:00
06 Nov, 09:02
05 Nov, 16:03
05 Nov, 09:06
04 Nov, 16:01
04 Nov, 09:02
http://
или https://
, браузер отправляет запрос на сервер.GET /index.html HTTP/1.1
Host: example.com
example.com
) в IP-адрес с помощью DNS-сервера.https
, то устанавливает также SSL/TLS-соединение для безопасной передачи данных.GET /index.html HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
<html>
<head>
<title>Example</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
h1 {
color: blue;
}
document.querySelector('h1').textContent = 'Hello, JavaScript!';
03 Nov, 16:02
03 Nov, 09:02
'101?' -> ['1010', '1011']
'1?1?' -> ['1010', '1110', '1011', '1111']
02 Nov, 16:04
02 Nov, 09:02
01 Nov, 09:02
31 Oct, 16:03
30 Oct, 17:01
30 Oct, 13:12
29 Oct, 16:05
29 Oct, 09:01
28 Oct, 16:02
28 Oct, 09:04
componentDidMount
, componentDidUpdate
и componentWillUnmount
.useEffect(() => {
// Ваш код для побочного эффекта
return () => {
// Очистка (необязательно)
};
}, [зависимости]);
[]
), эффект выполнится один раз после первого рендеринга. Если массив не указан, эффект будет выполняться после каждого рендеринга.componentDidMount
в классовых компонентах), используйте пустой массив зависимостей:useEffect(() => {
// Код здесь будет выполнен один раз после инициализации компонента
}, []);
const [count, setCount] = useState(0);
useEffect(() => {
// Код здесь будет выполнен каждый раз, когда изменяется значение count
document.title = Вы нажали ${count} раз;
}, [count]); // Зависимости
useEffect(() => {
const timerID = setInterval(() => {
// Ваша логика здесь
}, 1000);
return () => {
clearInterval(timerID); // Очистка при размонтировании компонента
};
}, []); // Эффект выполнится один раз
27 Oct, 16:02
27 Oct, 09:02
expandedForm(12); // '10 + 2'
expandedForm(42); // '40 + 2'
expandedForm(70304); // '70000 + 300 + 4'
26 Oct, 16:02
26 Oct, 09:02
25 Oct, 09:02
24 Oct, 16:01
24 Oct, 09:02
23 Oct, 17:01
23 Oct, 09:01
22 Oct, 20:00
22 Oct, 16:00
22 Oct, 13:00
21 Oct, 16:02
21 Oct, 10:00
display
, которые определяют, как элемент будет отображаться на странице. Два из этих значений — inline
и inline-block
— имеют некоторые сходства, но и значительные отличия.display: inline;
ведут себя как часть текста. Это значит, что:width
) и высоту (height
), так как размеры определяются содержимым.margin-top
и margin-bottom
) и вертикальные внутренние отступы (padding-top
и padding-bottom
) не влияют на расстояние между инлайн-элементами вертикально, хотя могут влиять на фоновое изображение или цвет.display: inline-block;
комбинируют некоторые свойства инлайн и блочных элементов:margin
и padding
) работают как у блочных элементов, влияя на расстояние вокруг элемента во всех направлениях.21 Oct, 09:00
20 Oct, 16:02
20 Oct, 10:20
uniqueInOrder('AAAABBBCCDAABBB') // ['A', 'B', 'C', 'D', 'A', 'B']
uniqueInOrder('ABBCcAD') // ['A', 'B', 'C', 'c', 'A', 'D']
uniqueInOrder([1,2,2,3,3]) // [1,2,3]
20 Oct, 08:20
19 Oct, 16:02
19 Oct, 10:30
19 Oct, 06:30
18 Oct, 15:00
18 Oct, 09:00
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576 erid 2SDnjdBtMco
17 Oct, 17:10
17 Oct, 09:03
16 Oct, 17:02
16 Oct, 09:02
15 Oct, 16:16
15 Oct, 16:02
14 Oct, 16:12
14 Oct, 13:06
14 Oct, 09:06
14 Oct, 09:02
const booksOfSonya = [ 'Дар', 'Подвиг', 'Защита Лужина', 'Отчаяние' ]
const booksOfNadya = [ 'Подвиг', 'Защита Лужина', 'Дар' ]
const set1 = new Set(booksOfSonya)
const set2 = new Set(booksOfNadya)
console.log(set1.isSupersetOf(set2))
// true
console.log(set2.isSupersetOf(set1))
// false
13 Oct, 16:02
13 Oct, 09:02
Mmmm => []
Super => [2,4]
Apple => [1,5]
YoMama -> [1,2,4,6]
12 Oct, 16:01