Никита Дубко, HR Tech Яндекса
Никита Дубко, HR Tech Яндекса
На сайт нужна каруселька!
Заказчик
ChatGPT, помоги найти хорошую карусельку в npm.
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"
/>
<script
src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"
></script>
gzip_size() {
echo "Plain: $(curl -s $1 | wc -c)";
echo "Gzipped: $(curl -s $1 | gzip | wc -c)";
}
gzip_size https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js
Plain: 148159
Gzipped: 41120
gzip_size https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css
Plain: 18435
Gzipped: 4845
Карусельку хочу, чтобы карточки свайпать с товарами!
Но красиво, с прилипанием.
Заказчик
<ul class="horizontal-media-scroller">
<li>
<a href="#">
<figure>
<picture>
<img alt="..." loading="lazy" src="..." />
</picture>
<figcaption>Image Caption</figcaption>
</figure>
</a>
</li>
<li>...</li>
</ul>
.horizontal-media-scroller {
display: grid;
grid-auto-flow: column;
grid-gap: calc(var(--gap) / 2);
overflow-x: auto;
overscroll-behavior-x: contain;
scroll-snap-type: x mandatory;
scroll-padding-inline: var(--gap);
}
.horizontal-media-scroller figure {
scroll-snap-align: start;
}
overscroll-behavior-x: contain;
scroll-snap-type: x mandatory;
scroll-snap-align: start;
gzip_size http://127.0.0.1:8080/demo/style.min.css
Plain: 2855
Gzipped: 993
Нужно по клику на ссылку плавно скроллить к блоку!
Заказчик
gzip_size https://cdn.jsdelivr.net/gh/cferdinandi/smooth-scroll/dist/smooth-scroll.polyfills.min.js
Plain: 6561
Gzipped: 2709
scroll-behavior: smooth;
scroll-margin-top: 100px;
@media (prefers-reduced-motion: no-preference) {
.smooth-scroll {
scroll-behavior: smooth;
}
}
gzip_size http://127.0.0.1:8080/demo/smooth.min.css
Plain: 86
Gzipped: 93
Хочу параллакс по скроллу!
Заказчик
.pop {
view-timeline-name: --pop;
}
img {
animation: slide both;
animation-timeline: --pop;
animation-range: entry 100% cover 50%;
}
.skateboarder {
--x: 0;
--y: -45%;
}
@keyframes slide {
to { translate: var(--x) var(--y); }
}
jh3yy tweet
animation: some 2s linear infinite;
animation-name: some;
animation-duration: 2s;
animation-timing-function: linear;
animation-iteration-count: infinite;
@keyframes grow-progress {
from { transform: scaleX(0); }
to { transform: scaleX(1); }
}
#progress {
position: fixed;
left: 0; top: 0;
width: 100%; height: 1em;
background: red;
transform-origin: 0 50%;
animation: grow-progress auto linear;
animation-timeline: scroll();
}
animation-timeline: scroll();
animation-timeline: scroll(nearest block);
.container {
scroll-timeline-name: --scroll-timeline;
scroll-timeline-axis: inline; /* or block */
}
.child {
animation-timeline: --scroll-timeline;
}
.pop {
view-timeline-name: --pop;
}
img {
animation: slide both;
animation-timeline: --pop;
animation-range: entry 100% cover 50%;
}
.skateboarder {
--x: 0;
--y: -45%;
}
@keyframes slide {
to { translate: var(--x) var(--y); }
}
jh3yy tweet
gzip_size https://flackr.github.io/scroll-timeline/dist/scroll-timeline.js
Plain: 39988
Gzipped: 11512
@keyframes detect-scroll {
from, to { --can-scroll: ; }
}
.container {
animation: detect-scroll linear;
animation-timeline: scroll(self);
--bg-if-can-scroll: var(--can-scroll) lime;
--bg-if-cant-scroll: red;
background: var(--bg-if-can-scroll, var(--bg-if-cant-scroll));
}
Detect if an element can scroll or not
Ребята, тут в Safari
какой-то баг...
Заказчик
Кнопка «Корзины» не прилипает к низу!
Заказчик
.my-element {
height: calc(var(--vh, 1vh) * 100);
}
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
window.addEventListener('resize', () => {
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
});
Safari Viewport Bug
height: 100dvh;
Хочу нажимать на картинку, а она чтобы на весь экран открывалась.
Заказчик
gzip_size https://unpkg.com/focus-trap@7.5.4/dist/focus-trap.umd.min.js
Plain: 10717
Gzipped: 3555
<a href="#img1">
<img src="./small.jpg">
</a>
<a href="#" class="lightbox" id="img1">
<span style="background-image: url('./large.jpg')"></span>
</a>
.lightbox {
display: none;
position: fixed;
z-index: 999;
top: 0; left: 0;
right: 0; bottom: 0;
background: rgba(0, 0, 0, 0.8);
}
.lightbox:target {
display: block;
}
Фокус не должен выходить за пределы попапа.
ГОСТ Р 52872-2019
<article class="content" inert>
<!-- content -->
</article>
<dialog open>
Content
</dialog>
inert
<dialog>
<form method="dialog">
<button>Close</button>
</form>
</dialog>
dialog.showModal();
Хочу аккордеон в навигации!
Заказчик
import * as Accordion from '@radix-ui/react-accordion';
() => (
<Accordion.Root>
<Accordion.Item>
<Accordion.Header>
<Accordion.Trigger />
</Accordion.Header>
<Accordion.Content />
</Accordion.Item>
</Accordion.Root>
);
accordion
<details name=accordion>
<summary>Exclusive</summary>
<span>Some Text 1</span>
</details>
<details name=accordion>
<summary>Accordion</summary>
<span>Some Text 2</span>
</details>
<details name=accordion>
<summary>Pattern</summary>
<span>Some Text 3</span>
</details>
<details name="common-name">
Хочу натуральную анимацию падающего мячика!
Заказчик
animation-timing-function: linear(0, 1);
CSS.supports(
'animation-timing-function',
'linear(0, 1)'
)
Давайте ускорим сайт! Что-то слышал про Core Web Vitals.
Заказчик
<img src="photo.jpg" loading="lazy">
<iframe src="frame.html" loading="lazy">
Можем сделать панельки, которые изменяют размер?
Заказчик
.panels {
display: grid;
grid-template-columns: auto 1fr; /* 👈 */
}
.resizer {
max-width: 100cqi;
overflow: hidden;
resize: horizontal; /* 👈 */
}
Никита Дубко, HR Tech Яндекса
Никита Дубко, HR Tech Яндекса