CSS: центрируем по вертикали
Рассмотрим несколько способов вертикального центрирования элемента с помощью CSS
1. Абсолютное позиционирование
2. Псевдокласс ::before
3. line-height
4. table
5. Flex
6. Grid
7. Относительно родителя
8. calc
9. align-content
#frontend #css
Рассмотрим несколько способов вертикального центрирования элемента с помощью CSS
1. Абсолютное позиционирование
<p class="center-by-absolute-margin">Centering</p>
.center-by-absolute-margin {
position: absolute;
top: 0;
bottom: 0;
margin: auto 0;
}
2. Псевдокласс ::before
<p class="center-by-pseudo-class">Centering</p>
.center-by-pseudo-class::before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
3. line-height
<p class="center-by-line-height">Centering</p>
.center-by-line-height {
height: 200px;
line-height: 200;
}
4. table
<p class="center-by-table">Centering</p>
.center-by-table {
display: table-cell;
vertical-align: middle;
}
5. Flex
<div class="center-by-flex">
<p>Centering</p>
</div>
.center-by-flex {
display: flex;
align-items: center;
}
6. Grid
<div class="center-by-grid">
<p>Centering</p>
</div>
.center-by-grid {
display: grid;
align-items: center;
}
7. Относительно родителя
<div class="center-by-absolute-parent">
<p class="center-by-absolute-child">Centering</p>
</div>
.center-by-absolute-parent {
position: relative;
}
.center-by-absolute-child {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
8. calc
<p class="center-by-calc">Centering</p>
.center-by-calc {
height: 70px;
position: relative;
top: calc(50% - 35px);
}
9. align-content
<div class="container-center-by-align-content">
<div class="child-center-by-align-content"></div>
</div>
.container-center-by-align-content {
display: flex;
align-content: center;
}
.child-center-by-align-content {
width: 100px;
height: 100px;
}
#frontend #css
dr.Brain
CSS: центрируем по вертикали
разбираемся с вертикальным центрированием с помощью CSS
🔥9👍6👏2🆒2💯1
CSS: центрируем по горизонтали
Рассмотрим несколько способов центрирования элемента по горизонтали с помощью CSS
Блок с фиксированной шириной
Текст
Блок без фиксированной ширины
table
flex
grid
Относительно родителя
calc
align-content
#frontend #css
Рассмотрим несколько способов центрирования элемента по горизонтали с помощью CSS
Блок с фиксированной шириной
<p class="center-by-fixed-width">Centering</p>
.center-by-fixed-width {
width: 70px;
margin: 0 auto;
}
Текст
<p class="center-by-text-align">Centering</p>
.center-by-text-align {
text-align: center;
}
Блок без фиксированной ширины
<div class="center-by-unfixed-width">
<span>Centering</span>
</div>
.center-by-unfixed-width {
text-align: center;
}
table
<p class="center-by-table">Centering</p>
.center-by-table {
display: table;
margin: 0 auto;
}
flex
<div class="center-by-flex">
<p>Centering</p>
</div>
.center-by-flex {
display: flex;
justify-content: center;
}
grid
<div class="center-by-grid">
<p>Centering</p>
</div>
.center-by-grid {
display: grid;
justify-content: center;
}
Относительно родителя
<div class="center-by-absolute-parent">
<p class="center-by-absolute-child">Centering</p>
</div>
.center-by-absolute-parent {
position: relative;
}
.center-by-absolute-child {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
calc
<p class="center-by-calc">Centering</p>
.center-by-calc {
width: 70px;
margin-left: calc(50% - 35px);
}
align-content
<div class="container-center-by-align-content">
<div class="child-center-by-align-content"></div>
</div>
.container-center-by-align-content {
display: flex;
align-content: center;
}
.child-center-by-align-content {
width: 100px;
height: 100px;
}
#frontend #css
dr.Brain
CSS: центрируем по горизонтали
разбираемся с центрированием элемента по горизонтали с помощью CSS
👍7🆒4🔥2👏1
JavaScript: почему parseInt(0.0000005) возвращает 5
Функция
Попробуем разобраться: сначала
Таким образом,
Функция
parseInt() довольно удобна для преобразования строк в целые числа, но иногда она дает неожиданные результаты:parseInt(0.0000005) // 5
Попробуем разобраться: сначала
parseInt() преобразует аргумент в строку. Поэтому число 0.0000005 JavaScript автоматически преобразует в строку 5e-7. Следующим шагом parseInt() читает полученную строку слева направо и останавливается на первом нечисловом символе. В 5e-7 он останавливается на цифре 5 и возвращает ее. Он не обрабатывает часть строки, начинающуюся с символа e и игнорирует десятичные знаки.Таким образом,
parseInt() обрабатывает числа как строки, считывая информацию до первого нецифрового символа, поэтому и результатом является целое число 5, находящееся до первого нецифрового символа.dr.Brain
JavaScript: почему parseInt(0.0000005) возвращает 5
разбираемся с особенностями использования parseInt() в JavaScript
👍10🔥4👏3🆒2
Tailwind: интерактивность
Tailwind предоставляет возможность работы с множеством различных псевдоклассов и псевдоэлементов, позволяющих стилизовать элементы с учетом их состояния или положения.
Вот некоторые часто используемые псевдоклассы в Tailwind:
1. hover: для состояния наведения,
2. focus: для состояния фокуса,
3. active: для активного состояния,
4. group-hover: для стилизации с учетом состояния hover родительского элемента.
Например:
Tailwind также поддерживает псевдоэлементы
Например:
#frontend #css #tailwind
Tailwind предоставляет возможность работы с множеством различных псевдоклассов и псевдоэлементов, позволяющих стилизовать элементы с учетом их состояния или положения.
Вот некоторые часто используемые псевдоклассы в Tailwind:
1. hover: для состояния наведения,
2. focus: для состояния фокуса,
3. active: для активного состояния,
4. group-hover: для стилизации с учетом состояния hover родительского элемента.
Например:
<button class="bg-blue-500 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-400 active:bg-blue-800">
Click me
</button>
Tailwind также поддерживает псевдоэлементы
before: и after:.Например:
<div class="relative before:content-[''] before:absolute before:top-0 before:left-0 before:w-full before:h-full before:bg-black before:opacity-50">
This div has a semi-transparent overlay
</div>
#frontend #css #tailwind
dr.Brain
Tailwind: интерактивность
добавляем интерактивности в пректы с Tailwind CSS
🆒6👍4🔥3
JavaScript: трюк с NaN
Почему
Логика заключается в том, что
Для проверки истинности
#frontend #js
Почему
NaN не равен NaN?NaN (Not-a-Number) — это особое значение в JavaScript, и оно никогда не равно самому себе.console.log(NaN === NaN); // false
Логика заключается в том, что
NaN не действительное число, и поэтому оно не может быть равно чему-либо, даже самому себе.Для проверки истинности
NaN можно использовать Number.isNaN():console.log(Number.isNaN(NaN)); // true
#frontend #js
dr.Brain
JavaScript: трюк с NaN
почему NaN не равно NaN JavaScript
👍8🔥6👏2😁1🆒1
Tailwind: футер у нижнего края страницы
Довольно часто, верстая страницы, можно обнаружить, что, если содержимое страницы недостаточно объемное, под футером остается ненужное пространство. Вот прием, который позволить оставлять футер внизу страницы при использовании Tailwind CSS:
Эта структура использует модель flexbox для утилит Tailwind CSS, создавая гибкую разметку на всю высоту (в том числе минимальную высоту) экрана. Содержимое блока
К тегу
1.
2.
3.
Примененный к элементу
Довольно часто, верстая страницы, можно обнаружить, что, если содержимое страницы недостаточно объемное, под футером остается ненужное пространство. Вот прием, который позволить оставлять футер внизу страницы при использовании Tailwind CSS:
<body class="flex flex-col min-h-screen">
<!-- navigation component -->
<Navigation />
<!-- main content -->
<main class="flex-grow">
<!-- site content -->
</main>
<!-- footer component -->
<Footer />
</body>
Эта структура использует модель flexbox для утилит Tailwind CSS, создавая гибкую разметку на всю высоту (в том числе минимальную высоту) экрана. Содержимое блока
main увеличивается, заполняя доступное пространство, и сдвигает футер в нижнюю часть области просмотра, когда содержимого недостаточно для заполнения страницы.К тегу
bodyприменяется class="flex flex-col min-h-screen" для создания гибкой компоновки блока.1.
flex: создает гибкую блочную flexbox модель,2.
flex-col: направляет поток элементов по вертикали,3.
min-h-screen: гарантирует, что минимальная высота элемента body будет составлять не менее 100% высоты области просмотра. Если содержимое элемента не заполняет высоту области просмотра, это правило гарантирует, что body растянется по вертикали, чтобы заполнить всю область просмотра, не давая нижнему колонтитулу всплывать.Примененный к элементу
main class="flex-grow" позволяет области основного содержимого увеличиваться и заполнять все доступное пространство. Если в области просмотра доступно больше места, чем занимает содержимое, flex-grow расширит область основного содержимого, используя свободное пространство и сдвигая футер в нижнюю часть области просмотра.dr.Brain
Tailwind: футер у нижнего края страницы
размещаем футер в нижней части страницы с помощью Tailwind CSS
👍8🔥2👏2🆒2
PHP: архив
В веб-разработке динамическое создание ZIP-файлов является распространенной задачей. Например, может потребоваться сжать несколько файлов или папку для оптимизации загрузки информации или для создания резервных копий. PHP предоставляет простой способ сжатия файлов с помощью класса
Давайте разберемся, как программно создавать ZIP-файлы с помощью PHP...
#backend #php
В веб-разработке динамическое создание ZIP-файлов является распространенной задачей. Например, может потребоваться сжать несколько файлов или папку для оптимизации загрузки информации или для создания резервных копий. PHP предоставляет простой способ сжатия файлов с помощью класса
ZipArchive.Давайте разберемся, как программно создавать ZIP-файлы с помощью PHP...
#backend #php
dr.Brain
PHP: архив
создаем zip-файл с помощью php
🔥5💯3👍2👏2
Tailwind: многоуровневый нумерованный список
Tailwind предоставляет разработчику определенное многообразие классов утилит для работ со списками. Однако, для того чтобы создать многоуровневый нумерованный список, необходимо прибегнуть к кастомизации.
Итак, допустим у нас есть следующая разметка HTML:
Нужно получить многоуровневую нумерацию вложенных элементов, соответствующую шаблону
Для создания пользовательского класса
Директива
#frontend #css #tailwind
Tailwind предоставляет разработчику определенное многообразие классов утилит для работ со списками. Однако, для того чтобы создать многоуровневый нумерованный список, необходимо прибегнуть к кастомизации.
Итак, допустим у нас есть следующая разметка HTML:
<ol>
<li>Первый уровень
<ol>
<li>Второй уровень
<ol>
<li>Третий уровень. Первый элемент</li>
<li>Третий уровень. Второй элемент</li>
</ol>
</li>
</ol>
</li>
</ol>
Нужно получить многоуровневую нумерацию вложенных элементов, соответствующую шаблону
1., 1.1., 1.1.1.Для создания пользовательского класса
list-nested добавим в файл main.css Tailwind проекта следующие строки:@tailwind base;
@tailwind components;
@tailwind utilities;
/* многоуровневый нумерованный список */
@layer {
ol.list-nested {
counter-reset: item;
}
ol.list-nested li::before {
counter-increment: item;
content: counters(item, ".") ". ";
}
}
Директива
@layer помогает контролировать порядок объявления пользовательских классов, автоматически перемещая новые стили в соответствующую директиву @tailwind, и включает необходимые функции.#frontend #css #tailwind
dr.Brain
Tailwind: многоуровневый нумерованный список
создаем многоуровневые нумерованные списки в Tailwind CSS
🔥5👍3💯3🆒3
CSS: align-content
Помните все эти мемы о центрировании div? В 2024 году они устарели. Новое свойство
#frontend #css
Помните все эти мемы о центрировании div? В 2024 году они устарели. Новое свойство
align-content работает напрямую в любой блочной разметке, не требуется flexbox или grid. Удивительно, что потребовалось 25 лет, чтобы реализовать эту фундаментальную функцию... Но лучше поздно, чем никогда..centered-content {
align-content: center; /* That's it! No flexbox or grid needed */
block-size: 100vh;
}
#frontend #css
dr.Brain
CSS: align-content
центрироуем элементы с помощью CSS по-новому
🆒6👍3🔥3💯3
Mac OS: ip сайта
Для того чтобы узнать ip-адрес веб-ресурса, необходимо открыть терминал и ввести команду
В ответе мы увидим адрес сайта:
Чтобы прервать исполнение команды
В таком случае выполнение команды прекратится после передачи количества пакетов, указанных после параметра
#dev #terminal #macos
Для того чтобы узнать ip-адрес веб-ресурса, необходимо открыть терминал и ввести команду
ping в сочетании с адресом внешнего сайта без http:// или https://. Название сайта можно вводить как с www, так и без негоping drbrain.net
В ответе мы увидим адрес сайта:
64 bytes from 35.185.44.232: icmp_seq=0 ttl=59 time=152.740 ms
64 bytes from 35.185.44.232: icmp_seq=1 ttl=59 time=153.467 ms
64 bytes from 35.185.44.232: icmp_seq=2 ttl=59 time=153.011 ms
Чтобы прервать исполнение команды
ping нужно ввести сочетание клавиш Ctrl и C. С помощью параметра -c можно ограничить количество передаваемых пакетов:ping -c 1 drbrain.net
В таком случае выполнение команды прекратится после передачи количества пакетов, указанных после параметра
-c#dev #terminal #macos
dr.Brain
Mac OS: ip сайта
как узнать ip сайта с помощью терминала Mac OS
👍4🔥3👏1💯1
JavaScript: Лучшие практики
Используйте
В ES6 предусмотрены директивы
1.
2.
Избегайте использования
#js #лучшиепрактики
Используйте
const и let вместо varВ ES6 предусмотрены директивы
conat и let, определяющие блочную область видимости. Они позволяют избежать многих ошибок, связанных с использованием var1.
const используется для неизменяемых значений2.
var используется для переменных, значения которых будут изменяться// Плохая практика
var name = "John";
var age = 21;
// Хорошая практика
const name = "John";
let age = 21;
Избегайте использования
var, так как для этой директивы не существует блочной области видимости. Ее область видимости ограничивается функцией или скриптом. Переменная, объявленная таким образом, будет доступна за пределами блока.#js #лучшиепрактики
🔥6😁2🤬2🎉1🦄1
Tailwind без Tailwind
Знаете ли вы, что можно использовать все преимущества Tailwind CSS, не прибегая к использованию самой библиотеки?
Как любая система дизайна, Tailwind имеет токены дизайна.
Токены дизайна можно извлечь как простые переменные CSS и использовать следующим образом:
Все основные токены дизайна можно найти в GitHub Gist у SidKH/tailwind-css-variables.css
#css #tailwind
Знаете ли вы, что можно использовать все преимущества Tailwind CSS, не прибегая к использованию самой библиотеки?
Как любая система дизайна, Tailwind имеет токены дизайна.
Токены дизайна (design tokens)
это жестко закодированные значения, такие как, например, цвета, интервалы, размеры границ.
Токены дизайна можно извлечь как простые переменные CSS и использовать следующим образом:
border-radius: var(--rounded-lg);
background-color: var(--white);
padding: var(--s8);
width: var(--s60);
box-shadow: var(--shadow-lg);
text-align: center;
Все основные токены дизайна можно найти в GitHub Gist у SidKH/tailwind-css-variables.css
#css #tailwind
👍4🔥4😁1💯1
CSS фигуры: глаз
Глаз - одна из базовых форм CSS, требующих небольшого поворота
Создадим квадрат, затем установим радиус границы для двух противоположных углов, оставив два других угла на нуле. Лучше начинать с верхнего левого угла, добавив поворот на 45 градусов, но можно выбрать любой другой угол и настроить поворот соответствующим образом.
Можно использовать свойство
Что касается
#frontend #css #shapes
Глаз - одна из базовых форм CSS, требующих небольшого поворота
Создадим квадрат, затем установим радиус границы для двух противоположных углов, оставив два других угла на нуле. Лучше начинать с верхнего левого угла, добавив поворот на 45 градусов, но можно выбрать любой другой угол и настроить поворот соответствующим образом.
<div class="eye"></div>
Можно использовать свойство
rotate: 45deg или transform: rotate(45deg). Оба варианта будут работать..eye {
width: 200px;
aspect-ratio: 1;
background: black;
rotate: 45deg;
border-radius: 80% 0;
}
Что касается
border-radius: чем больше значение, тем мягче будет передаваться кривизна глаза. Можно поэкспериментировать со значениями, чтобы одна сторона стала выше другой, например: border-radius: 80% 0 100% 0.#frontend #css #shapes
dr.Brain
CSS фигуры: глаз
создаем контур глаза с помощью CSS
🔥6👍2😁1🦄1
JavaScript: Лучшие практики
Следуйте правилам именования сущностей в JavaScript
1. camelCase для переменных и функций
2. PascalCase для конструкторов функций и классов
3. UPPER_SNAKE_CASE для констант
#js #лучшиепрактики
Следуйте правилам именования сущностей в JavaScript
1. camelCase для переменных и функций
2. PascalCase для конструкторов функций и классов
3. UPPER_SNAKE_CASE для констант
// Плохая практика
let firstname = "John";
function getuser() {}
const MAXUSERS = 100;
// Хорошая практика
let firstName = "John";
function getUser() {}
const MAX_USERS = 100;
#js #лучшиепрактики
🔥3😁3👍2
JavaScript: Лучшие практики
Избегайте глобальных переменных
Глобальные переменные ведут к конфликтам имен и затрудняют отладку. Вместо этого используйте модули или замыкания для инкапсуляции логики.
#js #лучшиепрактики
Избегайте глобальных переменных
Глобальные переменные ведут к конфликтам имен и затрудняют отладку. Вместо этого используйте модули или замыкания для инкапсуляции логики.
// Плохая практика: загрязняет глобальную область видимости
let counter = 0 ;
// Хорошая практика: инкапсулировано
( function(){
let counter = 0 ;
function increment(){
counter ++ ;
}
})();
#js #лучшиепрактики
🔥7😁2👍1🆒1
CSS фигуры: слеза
Забавно, но слеза является вариантом формы глаза
Достаточно просто изменить радиус контура: увеличить
#frontend #css #shapes
Забавно, но слеза является вариантом формы глаза
<div class="tear"></div>
Достаточно просто изменить радиус контура: увеличить
radius в положениях top-right, botton-right, bottom-left, чтобы получить круглую форму, и привести его к нулю для top-left, чтобы он заканчивался точкой:.tear {
width: 300px;
aspect-ratio: 1;
background: black;
rotate: 45deg;
border-radius: 0 50% 50% 50%;
}
#frontend #css #shapes
dr.Brain
CSS фигуры: слеза
создаем слезу с помощью CSS
🔥6👍1😁1🤔1🆒1
JavaScript: Лучшие практики
Используйте строгий режим
Строгий режим
1. присвоении значений необъявленным переменным,
2. использовании устаревших функций.
#js #лучшиепрактики
Используйте строгий режим
Строгий режим
use strict позволяет избегать небезопасных действий, выдавая ошибки при:1. присвоении значений необъявленным переменным,
2. использовании устаревших функций.
"use strict";
x = 10; // приводит к ошибке: x is not defined
#js #лучшиепрактики
🔥6💯2👍1😁1🆒1
JavaScript: Лучшие практики
Всегда используйте
Оператор строгого равенства
#js #лучшиепрактики
Всегда используйте
=== вместо ==Оператор строгого равенства
=== позволяет избежать приведения типов, Это делает сравнения более предсказуемыми.// Плохая практика: приведение типов
console.log(5 == "5") // true
// Хорошая практика: строгое сравнение
console.log(5 === "5") // false
#js #лучшиепрактики
🔥5💯2😁1🆒1🦄1
JavaScript: Лучшие практики
Обрабатывайте ошибки с помощью
Необработанные ошибки приводят к сбоям в работе приложения. Используйте
#js #лучшиепрактики
Обрабатывайте ошибки с помощью
try-catchНеобработанные ошибки приводят к сбоям в работе приложения. Используйте
try-catch для операций, несущих риски возникновения ошибок, таких как вызовы API.async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Fetch failed:", error)
}
}
#js #лучшиепрактики
👍6🔥5😁2
JavaScript: Лучшие практики
Избегайте ада обратных вызовов с помощью
Вложенные обратные вызовы приводят к "аду обратных вызовов" . Вместо этого используйте:
1.
2.
#js #лучшиепрактики
Избегайте ада обратных вызовов с помощью
Promises и Async / AwaitВложенные обратные вызовы приводят к "аду обратных вызовов" . Вместо этого используйте:
1.
Promises2.
Async / Await// Callback Hell. Плохая практика
getUser(userId, (user) => {
getPosts(user.id, (posts) => {
getComments(posts[0].id, (comments) => {
console.log(comments);
});
});
});
// Async/Await. Хорошая практика
async function loadData() {
const user = await getUser(userId);
const posts = await getPosts(user.id);
const comments = await getComments(posts[0].id);
console.log(comments);
}
#js #лучшиепрактики
🔥8👍3😁2🎉1
JavaScript: Лучшие практики
Оптимизируйте циклы
Избегайте тяжелых вычислений внутри циклов. Кэшируйте длины массивов и используйте эффективные циклы, такие как
#js #лучшиепрактики
Оптимизируйте циклы
Избегайте тяжелых вычислений внутри циклов. Кэшируйте длины массивов и используйте эффективные циклы, такие как
for...of или Array methodsconst items = [1, 2, 3, 4, 5];
// Плохая практика: пересчет длины при каждой итерации
for (let i = 0; i < items.length; i++) {
console.log(items[i]);
}
// Хорошая практика: кэширование длины
for (let i = 0, len = items.length; i < len; i++) {
console.log(items[i]);
}
// Лучшая практика (modern JS)
for (const item of items) {
console.log(item);
}
// Функциональный подход (map, filter, reduce)
items.map(item => console.log(item));
#js #лучшиепрактики
🔥5😁2👍1👏1🦄1