Войдите или зарегистрируйтесь
Вы сможете писать комментарии и посты, ставить лайки и другое
Поиск
Тёмная тема

Посты пользователя connected2u


Почему CSS селектор по наличию во вьюпорте никогда не будет добавлен в стандарт

13 дн. назад
На работе в очередной раз потребовалось на сайте одного проекта реализовать фичу, связанной с появлением блока во вьюпорте, т.е. кое-что в дизайне должно меняться, когда блок виден на экране. Блок должен был как бы раскрываться по ширине, когда входил во вьюпорт. Обычно это реализуется через Intersection Observer, т.е. через джаваскрипт. Но я засомневался, потому что в CSS постоянно что-то новое добавляется, я просто не успеваю следить, полез гуглить, вдруг пропустил что-то новое.

Так вот, такой функционал никогда не будет добавлен в CSS. И различный другой запрашиваемый людьми функционал тоже не будет добавлен. 🙂 Оказывается, существует "Рабочая группа по CSS" (CSS Working Group) для решения проблем CSS. У них есть сайт с FAQ: https://wiki.csswg.org/faq - там есть как раз пункт "Selectors that Depend on Layout", т.е. селекторы, которые зависят от текущего layout Цитата из FAQ:

I would like an :overflowing pseudo class to select elements which overflow
I would like a :stuck pseudo class to select elements with position:sticky which are currently stuck
I would like a :on-screen pseudo class to select elements which are currently in the viewport

И их ответ:

Selectors in general, and pseudo classes in particular, cannot depend on layout, because otherwise they could be used to modify layout in a way that made them no longer match, which would modify the layout back to where it was, so they match again, and we get stuck in an infinite loop of contradictions.

Короче, в группу постоянно приходят от разработчиков запросы на добавлении селектора, выбирающего, когда контент вылазит наружу, или на селектор, что стики-элемент уперся в край, или вот на нужный мне селектор нахождения во вьюпорте. Ну и всякое такое в этом роде. И рабочая группа отвергает такие запросы. Главная причина этих отказов - это высокая вероятность бесконечного цикла, когда браузер будет перерисовывать разные состояния, потому что они будут менять друг друга. Например: элемент появился во вьюпорте - соседний элемент уменьшился по высоте и элемент... пропадает из вьюпорта! А у такого состояния срабатывает другой стиль, который удлиняет по высоте соседний вышестоящий элемент и наш элемент опять попадает во вьюпорт. И так происходит до бесконечности!

Но в CSS давным давно уже есть селектор, который может входить в бесконечный цикл - это селектор псевдокласса :hover. Я даже код придумал для этого безобразия:

<div class="funny-block">
</div>

.funny-block {
  width: 200px;
  height: 200px;
  border: 1px solid black;
  background-color: beige;
  transition: all 0.5s ease; /* гарантированно добавляет бесконечное дёргание */
}

.funny-block:hover {
  width: 100px;
  height: 200px;
  border: 1px solid black;
  background-color: beige;
}

Современные браузеры для :hover имеют встроенную защиту от бесконечной перерисовки layout. И если не двигать курсор мышки, то цикл перерисовки останавливается. Но я добавил transition и защита уже не работает! Блок бесконечно дергается, проверено на хроме и фф. Причем даже немного загружается графический процессор!

А теперь подумайте, что было бы при наличии какого-нибудь селектора :in-viewport? Можно было бы дико дергать дизайн вообще без действий пользователя. Отключение жса тут уже не поможет.

Поэтому остается нам фронтендерам юзать Intersection Observer и не жужжать. 😃
Показать полностью...
+2
5

Nuxt 3 and 4: issue with multiple navigateTo calls

20 дн. назад
At work, on one of our projects, I ran into an issue in Nuxt 4 where a page component needs to perform different redirects via navigateTo() based on various conditions during the execution of the setup function. Something like this:

<template>
  Some page
</template>

<script lang="ts" setup>
if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
}

if (2 + 2 === 4) {
  await navigateTo('/?abc=2', {
    redirectCode: 302,
  });
}

if (3 + 3 === 6) {
  await navigateTo('/?abc=3', {
    redirectCode: 302,
  });
}

if (4 + 4 === 8) {
  await navigateTo('/?abc=4', {
    redirectCode: 302,
  });
}
</script>

This is where the problem appears: in the end, the redirect always goes to the very last URL, i.e. in the example above the navigation ends up at /?abc=4. I dug into the documentation but couldn't find anything built-in to prevent subsequent navigateTo calls from being triggered. It seems this behavior is related to vue router.

You can't write it like this either:
if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
  return; // not allowed in script setup
}

In the end, the only solution that worked was introducing a boolean variable and checking it before calling navigateTo:
let isAlreadyRedirected = false;

if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 2 + 2 === 4) {
  await navigateTo('/?abc=2', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 3 + 3 === 6) {
  await navigateTo('/?abc=3', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 4 + 4 === 8) {
  await navigateTo('/?abc=4', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}
Once again: this is the only thing that solved the problem for me. If you have any other solution, please let me know.
Показать полностью...
+2
3

Nuxt 3 и 4: проблема со множественными вызовами navigateTo

22 дн. назад
На работе на одном проекте столкнулся в Nuxt 4 с проблемой, когда в page-компоненте нужно делать разные редиректы через navigateTo() по различным условиям в процессе выполнения setup функции. Примерно так:

<template>
  Some page
</template>

<script lang="ts" setup>
if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
}

if (2 + 2 === 4) {
  await navigateTo('/?abc=2', {
    redirectCode: 302,
  });
}

if (3 + 3 === 6) {
  await navigateTo('/?abc=3', {
    redirectCode: 302,
  });
}

if (4 + 4 === 8) {
  await navigateTo('/?abc=4', {
    redirectCode: 302,
  });
}
</script>

Тут возникает проблема: в конечном итоге срабатывает редирект на самый последний урл, т.е. в коде выше переход будет на /?abc=4. Я порылся в документации, не нашёл ничего встроенного, чтобы избежать срабатывания последующих вызовов navigateTo. Вроде как это поведение связано с vue router.

Вот так написать тоже нельзя:
if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
  return; // так нельзя в script setup
}

Пришлось делать единственное решение - это завести boolean-переменную и проверять уже её.

let isAlreadyRedirected = false;

if (1 + 1 === 2) {
  await navigateTo('/?abc=1', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 2 + 2 === 4) {
  await navigateTo('/?abc=2', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 3 + 3 === 6) {
  await navigateTo('/?abc=3', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}

if (!isAlreadyRedirected && 4 + 4 === 8) {
  await navigateTo('/?abc=4', {
    redirectCode: 302,
  });
  isAlreadyRedirected = true;
}
Ещё раз - это единственное, что решило проблему. Если у вас есть какое-то другое решение, напишите плиз.
Показать полностью...
+2
16

Ждем выхода GTA 6 и пока облизываемся на скриншоты

недавно
GTA 6 выходит 19 ноября 2026 года, т.е. осталось ждать меньше года. Уже известны главные действующие лица, причем одним из двух главных героев впервые будет женщина по имени Лусия Каминос.
Наконец-то с удовольствием побегаем за женщину, ведь на женщину всегда приятнее смотреть сзади, по крайней мере, если игрок мужчина 🙃

ПК-бояре пока будут в пролете 😄 Выход игры запланирован сначала только для Sony PlayStation 5 и Xbox Series X и S. Пятая ГТА на ПК вышла только через полтора года после выхода на консолях, так что можно предположить, что шестая ГТА на ПК выйдет в начале 2028 года.

Карта должна быть огромной. Туда перенесётся Вайс-Сити, но это будет только небольшая часть карты, добавятся другие локации.
Показать полностью...
+2
10

How wind turbine power depends on blade length: looking at real data

недавно
Wind turbines keep getting bigger every year. There's one main reason for that: the longer the blades, the more powerful the turbine. But couldn't you just install two smaller turbines instead of one large one? To answer this, let's take a look at real-world data.

Goldwind is a Chinese wind turbine manufacturer. Here are photos of their operating turbines from the company website:
Goldwind GW 82 / 1500 - output: 1500 kW (1.5 MW). Rotor length: 82.3 meters, meaning a blade diameter of roughly 41.15 meters.

Goldwind GW 171 / 6000 - output: 6000 kW (6.0 MW). Rotor length: 171 meters, giving a blade diameter of about 85.5 meters.

Even here you can already see that the relationship between blade length and output is nonlinear. The second turbine's blade is 2.07x longer, but the power is 4x higher!

Vestas is a wind turbine manufacturer from Denmark (their turbines are shown in the next photo):
Показать полностью...
+2
10

Зависимость мощности ветряков от длины лопастей: смотрим реальные данные

недавно
Ветрогенераторы с каждым годом строят всё больше размером. Причина там одна - чем длиннее у ветряка лопасти, тем он мощнее. Но разве нельзя поставить два маленьких ветряка вместо одного большого? Чтобы ответить на этот вопрос, даавайте посмотрим на реальные данные.

Китайский производитель ветрогенераторов Goldwind. Фото работающих установок с их сайта:
Goldwind GW 82 / 1500 - мощность 1500 КВт (1,5 МВт). Длина ротора 82,3 метра, т.е. диаметр лопасти примерно 41,15 метра.
Goldwind GW 171 / 6000 - мощность 6000 КВт (6,0 МВт). Длина ротора 171 метр, т.е. диаметр лопасти примерно 85,5 метра.

Уже здесь можно сразу заметить непрямую зависимость между длиной лопасти и мощностью.
Лопасть второго ветряка больше первого в 2,07 раза, а мощность выше в 4 раза!

Vestas - это производитель ветрогенераторов из Дании (это их ветряки на фото):
Показать полностью...
+4
16

Параллельная война Перу и Эквадора во время Второй Мировой войны

недавно
А вы знали, что пока в мире шла Вторая Мировая война, в Южной Америке началась война между Перу и Эквадором? Эта война никак не связана со Второй Мировой войной, и она из-за, так сказать, "главной большой" войны осталась практически незамеченной другими странами.

Конфликт начался из-за спорных территорий на границе двух стран в Амазонии (бассейн реки Амазонки). Споры по этому вопросу у Перу и Эквадора были долгие, а к 1941 году напряжение достигло предела. Столкновения были в основном локальными, но при этом носили интенсивный характер - обе стороны мобилизовали войска и использовали современную на тот момент технику.

Несмотря на то, что война длилась всего несколько недель (!), она значительно потрепала обе страны. Были разрушены дороги, мосты, сёла, а тысячи людей оказались вынуждены покинуть свои дома. Но самое необычное: в остальном мире всем было всё равно, т.к. всё внимание было полностью сосредоточено на событиях в Европе и Азии, где шла куда более жуткая война.

Ну и фотка с Википедии - Перу бомбит эквадорский кантон Аренильяс:
+2
45

The real altitude of spaceflight

недавно
Humans have been flying to space since 1961 - that's over 60 years now. These days, we even have tourist spaceflights. In sci-fi movies, people travel between planets, stars, and even galaxies.

But what is space from the perspective of aviation and astronautics? Technically, it starts somewhere between 100 and 122 kilometers above Earth's surface. The range exists because different organizations define the boundary of space slightly differently.

Is 120 kilometers really that high? The average diameter of our planet is 12,742 kilometers - quite a lot. Below, I drew a simple picture to show what a spaceflight looks like to scale:
See that tiny red dot? That’s our trip to "outer space". Not exactly impressive, right? For comparison, the International Space Station orbits at an altitude of about 418.2 km - on this scale, its point would only be a couple of pixels higher.

Human technology is still in its infancy. Legally, we can say we fly to space - but in reality, it looks more like what you see above. As for interplanetary travel, so far, only our robots have made the journey.
+2
43

La Estatua de la Libertad de la película La vuelta al mundo en 80 días

недавно
En la película La vuelta al mundo en 80 días (2004) hay una escena interesante de lucha junto a la Estatua de la Libertad parcialmente ensamblada. Los protagonistas entran corriendo en un almacén en los muelles, donde luego luchan contra unos bandidos chinos.
La Estatua de la Libertad se ve parcialmente ensamblada.
Показать полностью...
+1
8

Die Freiheitsstatue aus dem Film In 80 Tagen um die Welt

недавно
Im Film In 80 Tagen um die Welt (2004) gibt es eine interessante Szene, in der ein Kampf in der Nähe der halbfertigen Freiheitsstatue stattfindet. Die Hauptfiguren flüchten in ein Lagerhaus in den Docks, wo sie anschließend gegen eine Gruppe chinesischer Gangster kämpfen.
Die Freiheitsstatue ist nur teilweise zusammengesetzt.
Показать полностью...
+2
12

Статуя Свободы из фильма Вокруг света за 80 дней

недавно
В фильме Вокруг света за 80 дней (2004) имеется интересная сцена сражения возле полусобранной статуи Свободы. Главные герои забегают на склад в доках, где потом сражаются с китайскими бандитами.
Статуя Свободы выглядит частично собранной.
Показать полностью...
+3
28

Люксембург не такой уж маленький

недавно
Многие люди знают, что Люксембург - очень маленькое государство. Но его размер не настолько мал, чтобы можно было пройти пешком из одной края в другой.

Вы, наверняка, слышали про островное государство Мальта. Так вот, Мальта намного меньше Люксембурга. Ниже, наложение её территории на территорию Люксембурга:
Люксембург нельзя относить к карликовым государствам. Он делится на 12 кантонов, т.е. кроме столицы города Люксембурга там есть и другие населённые пункты.

Москва - огромный город, в пределах МКАДа её площадь 878 кв.км. А площадь Люксембурга 2586 кв. км., т.е. в 2,94 раза больше. Вот наложение Люксембурга на Москву, он помещается только в границах ЦКАДа.
Показать полностью...
+2
12

Концовка The Walking Dead: The Final Season

недавно
Финальный твист в последнем эпизоде игры The Walking Dead: The Final Season - это, конечно, крутяк. Настолько эмоционально сильный скачок, когда видишь, чем всё закончилось с Клементиной. Авторы сценария - молодцы. Пожалуй, самый психологически продуманный сезон игры. И последний.
+2
71

Обнаружен новый вид летающих рептилий возрастом 200 миллионов лет (эпоха динозавров)

недавно
Ученые из Смитсоновского института обнаружили новый вид птерозавров - крылатую рептилию, которая летала над динозаврами более 200 миллионов лет назад.

Кость челюсти столь древней рептилии была обнаружена в американском штате Аризона еще 14 лет назад - в 2011 году, но современные методы сканирования теперь выявили детали, говорящие о ее принадлежности к новому для науки виду.

Ученые назвали это животное Eotephradactylus mcintireae, что означает "пепельнокрылая богиня рассвета". Это не художественный приём, а просто отсылка к вулканическому пеплу, который помог сохранить кости птерозавра в русле реки.

Схема таксономии из их опубликованной PDF-ки.
На данный момент считается, что это самый ранний птерозавр, найденный в Северной Америке, ему примерно 209 миллионов лет. Учёный Ben T. Kligman: "Кости триасовых птерозавров маленькие, тонкие и часто полые, поэтому они разрушаются до того, как окаменеют". Но тут повезло.

Место открытия - пласт с окаменелостями в национальном парке США Петрифайд-Форест. Более 200 миллионов лет назад там было русло реки, и осадочные слои постепенно удерживали и сохраняли кости, чешую и другие свидетельства жизни того времени.

Кстати, эта древняя рептилия (её некорректно называть динозавром) была размером с современную чайку, т.е. это не был гигант.
Показать полностью...
+3
10

В Австралии есть идеи создать внутреннее море, чтобы изменить климат континента

недавно
Большая часть территории Австралии практически непригодна для жизни - там пустыни и невыносимая жара зимой (т.е. в "летний" сезон - это южное полушарие). В просмотре "улиц" на картах Гугла можно посмотреть, насколько там всё уныло и маложизненно.
Еле живая поверхность без воды.
Если посмотреть топографическую карту высот, то видно, что в Австралии много низменностей.
Показать полностью...
+2
109

Но это всего лишь теория - безграмотный ответ от обывателей на теорию эволюции

недавно
Теория эволюции основывается на экспериментальных наблюдениях. Эволюционное учение постоянно дорабатывается, появляются новые факты, уточняются разные детали таксономии видов и т.п. И тут обыватель может возразить:
- Ну, это ведь всего лишь теория!
Вот тут у научно подкованного человека может не хватить нервов.

Здесь кроется очень серьезная ошибка в понимании смысла слова "теория". Не нужно путать бытовое понятие теории и понятие теории в научном смысле.

В бытовом понимании теория - это нечто неопределённое, гипотетическое, вроде "у меня есть теория, что дождь чаще идёт в выходные". Такое использование подразумевает догадку или предположение без достаточных доказательств. Именно из-за этого многие ошибочно полагают, что теория эволюции - это просто очередное придуманное от балды мнение, а не научно обоснованная концепция.

В научном (!) же смысле теория - это всегда стройная система знаний, основанная на проверенных фактах, многочисленных наблюдениях и экспериментах. Теория эволюции, как и другие научные теории (гравитации, относительности и т.п.), - это не просто идея! Это результат многолетнего труда учёных и большого массива данных.

Научная теория объясняет и предсказывает явления, а если она не справляется с этой задачей, то теория дорабатывается или отвергается.

Так что это не "всего лишь теория".

И да, надо ещё вспомнить про опровергаемость - ключевой признак любой научной теории. Настоящая научная теория должна (!) допускать возможность быть опровергнутой при появлении новых данных. Это не значит, что она ошибочна, наоборот, её можно проверить на прочность.
+2
43

Биткоин стал стоить 111 тысяч долларов США - это рекорд

недавно
График с гугла:
Это очередной исторический рекорд для битка. Все кто купил биткоины в 2020 году и не продал, сейчас стали миллионерами.

Кстати, добыто уже 94% биткоина, поэтому остальная добыча не будет влиять на курс, так что теоретически биток можно считать цифровым золотом.
+1
46

La paradoja de las expectativas: él quería un niño, pero siempre nacían niñas

недавно
Historia: un hombre ya tiene cinco hijas. Sueña con tener un heredero, un hijo varón. Su esposa está embarazada nuevamente. Dejemos de lado por ahora el aspecto psicológico de esta situación y centrémonos en las probabilidades.

Emocionalmente, muchas personas piensan así: “¡Ya nacieron cinco niñas seguidas, ahora sí o sí tiene que ser un niño!”.
Pero esto es un error clásico conocido como la falacia del jugador. Es la falsa creencia de que, si un resultado se ha repetido muchas veces, entonces el resultado opuesto es más probable la próxima vez. Pero las matemáticas no funcionan así.

Según la teoría de probabilidades, la posibilidad de que nazcan cinco niñas seguidas y luego otra niña más es de 1 entre 64, es decir, aproximadamente 1,56%. Pero eso es la probabilidad de que ocurran todos esos nacimientos en ese orden específico. En nuestro caso, esos cinco nacimientos ya ocurrieron. Lo que importa ahora es el siguiente.

Y la probabilidad de que el próximo bebé sea niño o niña sigue siendo la misma: 50%.
Si el sexo del bebé es determinado al azar (como suele ser), entonces cada nuevo embarazo es un evento independiente.

Así que, aunque ya haya tenido cinco hijas, la probabilidad de que esta vez vuelva a tener una niña sigue siendo del 50%.
+2
62

Das Paradoxon der Erwartungen: Er wollte unbedingt einen Jungen, aber es kamen immer nur Mädchen zur Welt

недавно
Eine kleine Geschichte: Ein Mann hat bereits fünf Kinder – alles Mädchen. Er wünscht sich sehnlichst einen männlichen Nachkommen. Jetzt ist seine Frau wieder schwanger. Lassen wir mal die psychologischen Aspekte dieser Familienplanung außen vor und schauen lieber auf die Wahrscheinlichkeiten.

Gefühlsmäßig denkt man: "Fünf Mädchen in Folge – jetzt muss doch endlich ein Junge kommen!"
Aber genau hier liegt der Denkfehler – ein klassischer Gambler’s Fallacy, also der Trugschluss des Spielers. Dabei geht man fälschlicherweise davon aus, dass ein seltenes Ereignis „überfällig“ sei, nur weil das Gegenteil häufig aufgetreten ist.

Doch die Mathematik sieht das anders.

Die Wahrscheinlichkeit, dass nacheinander fünf Mädchen geboren werden und dann noch ein sechstes Mädchen folgt, liegt bei 1 zu 64 – also rund 1,56 %. Aber das betrifft diese konkrete Reihenfolge. Die fünf Mädchen sind bereits da. Jetzt zählt nur noch die neue Schwangerschaft – ein einzelnes Ereignis.

Und bei einer zufälligen Verteilung (wie bei der natürlichen Geschlechtsverteilung bei der Geburt) liegt die Wahrscheinlichkeit für einen Jungen oder ein Mädchen weiterhin bei jeweils 50 %. Frühere Ergebnisse haben keinen Einfluss auf zukünftige, wenn die Ereignisse unabhängig sind.

Also: Die Chance, dass wieder ein Mädchen zur Welt kommt – liegt erneut bei genau 50 %.
+4
56

The expectation paradox: he wanted a boy, but kept having girls

недавно
A man has five children - all girls. He dreams of a son, an heir! Now his wife is pregnant again. Let's skip the psychology behind all this and focus on the probabilities.

Emotionally, it feels like after five girls in a row, a boy is due. Surely, the odds of finally having a son are much higher now.

But this is a textbook example of the gambler's fallacy - the false belief that if something happens repeatedly, the opposite is bound to happen soon. That's not how probability works.

According to math, the chance of having exactly five girls in a row followed by another girl is 1 in 64, or about 1.6%. But those five girls are already here. The only thing that matters now is the next birth.

And the odds of having a boy? Still 50/50. Every birth is an independent event (assuming randomness), so the previous outcomes don't change the next one.

So yes, there's still a 50% chance they'll have another girl.
+3
57
1
2