Властивість CSS aspect-ratio
дозволяє створювати вікна, які підтримують пропорційні розміри, де а height
і width
вікно обчислюються автоматично як співвідношення. Це трохи математика, але ідея полягає в тому, що ви можете розділити одне значення на інше за цією властивістю, і обчислене значення гарантує, що поле залишається в тій пропорції.
.element ( aspect-ratio: 2 / 1; /* ↔️ is double the ↕️ */ ) .element ( aspect-ratio: 1 / 1; /* ⏹ a perfect square */ )
aspect-ratio
визначається в специфікації модуля розміру вікна CSS рівня 4, яка наразі знаходиться у робочому проекті. Це означає, що він все ще триває і має шанс змінитися. Але Chrome і Firefox підтримують його за експериментальним прапором, а Safari Technology Preview додає підтримку для нього на початку 2021 року, є сильні сигнали, які aspect-ratio
набирають великих обертів.
Синтаксис
aspect-ratio: auto || ;
Простою англійською мовою: aspect-ratio
або вважається auto
за замовчуванням, або приймає a як значення де
.
- Початкове значення:
auto
- Застосовується до: усіх елементів, крім вбудованих коробок та внутрішніх рубінових або табличних ящиків
- Успадковано: ні
- Відсотки: н / д
- Обчислене значення: вказане ключове слово або пара чисел
- Тип анімації: дискретна
Цінності
/* Keyword values */ aspect-ratio: auto; /* default */ /* Ratio values */ aspect-ratio: 1 / 1; /* width and height are equal proportion */ aspect-ratio: 2 / 1; /* width is twice the height*/ aspect-ratio: 1 / 2; /* width is half the height */ aspect-ratio: 16 / 9 /* typical video aspect ratio */ /* Global values */ aspect-ratio: inherit; aspect-ratio: initial; aspect-ratio: unset;
Він працює на заміненому та незаміненому вмісті
Якщо ви думаєте: "Е-е, так, хіба браузер це вже не робить для нас на зображеннях?" відповідь така: абсолютно . Браузери роблять деякі фантастичні розрахунки співвідношення сторін для заміненого вмісту, як зображення. Отже, якщо зображення має, скажімо, ширину 500 пікселів, браузер вдосконалює свої алгоритми розмітки CSS, щоб підтримувати внутрішні або «природні» розміри зображення. aspect-ratio
Властивість може бути використано для ефективного перевизначити ці природні розміри.
Але незамінений вміст не має природного співвідношення. Це більша частина речей, з якими ми працюємо, наприклад div. Замість того, щоб намагатися зберегти природні пропорції елемента, aspect-ratio
встановлює бажаний розмір.
Зараз специфікація в даний час зазначає, що старі специфікації CSS, зокрема CSS 2.1, не містять чіткого розмежування між заміненим та незаміненим вмістом. Це означає, що ми могли бачити деякі додаткові особливі випадки, додані до специфікації, щоб допомогти їх пояснити. На даний момент ми бачимо, як браузери розгортають підтримку для встановлення бажаних пропорцій для замінених та незамінених окремо, де деякі браузери з ранньою підтримкою за експериментальним прапором можуть підтримувати лише aspect-ratio
незамінений вміст. Безумовно, варто стежити за підтримкою браузера в міру її розвитку.
Він працює самостійно, не вказуючи width
абоheight
Отже, так, ми можемо просто опустити його на такий елемент:
.element ( aspect-ratio: 16 / 9; )
... і елемент за замовчуванням width: auto
вмикається неявно, щоб встановити розміри елемента.
Він змінюється, коли width
або height
перебувають на одному елементі
Скажімо, у нас є елемент із шириною 300px
та aspect-ratio
з 3/1
.
.element ( aspect-ratio: 3 / 1; width: 300px; )
За своєю природою він aspect-ratio
хоче розрахувати розміри елемента самостійно і робитиме це, виходячи з контексту, де він використовується. Але з цим width
підкинутим, він повідомляє співвідношення сторін для обчислення поля пропорції елемента, використовуючи 300px
як ширину. В результаті ми ніби просто написали:
.element ( height: 100px; width: 300px; )
Це має сенс! Пам'ятайте, що коли ні width
або height
не вказано, браузер припускає, що вони є, auto
і переходить звідти. Коли ми надаємо явні значення width
та height
значення, саме вони звикають.
У деяких ситуаціях це ігнорується
Тут все стає трохи розумним, оскільки бувають випадки, коли aspect-ratio
це не враховують або на його обчислення впливають інші властивості. Це включає:
Коли обидва width
і height
оголошені на елементі
Ми щойно побачили, як декларування width
або height
елемента, і елемента вплине на обчислення aspect-ratio
. Але якщо в елементі вже є і, width
і height
, вони використовуються замість aspect-ratio
. Це вимагає заміщення обох властивостей aspect-ratio
; встановлення одного height
або width
окремо не порушить співвідношення сторін елемента.
Робить сенес, правда? Якщо використання будь-якого width
або height
примушує aspect-ratio
використовувати це значення в обчисленні, то логічно випливає, що використання обох повністю замінить aspect-ratio
взагалі, оскільки обидва значення вже надані та встановлені.
Коли вміст виривається із співвідношення
Простіше кажучи, якщо у вас є елемент зі співвідношенням сторін і вміст настільки довгий, що змушує елемент розширюватися, тоді елемент буде розширюватися. І якщо елемент розширюється, його розміри змінюються і, таким чином, більше не пропорція. Ось чому в специфікації сказано, що властивість встановлює “бажане” співвідношення сторін. Це бажано, але не призначено.
Не подобається, як це працює? Встановлення min-height: 0;
елемента дозволить вмісту переповнювати бажане співвідношення сторін, а не розширювати його.
Коли він «програє» min-*
і max-*
властивостям
Ми просто побачили, як це працює, правда? Коли вміст перевищує розміри коробки, aspect-ratio
це фактично зникає, оскільки вікно розширюється разом із вмістом. Ми можемо це замінити min-width: 0
.
Це тому, що всі властивості min-*
та max-*
властивості, як правило, ведуть битву width
і height
за перевагу у війні над розрахунками Box Model. Наприклад:
.element ( min-width: 500px; /* ? Winner! */ width: 100px; )
Але:
.element ( min-width: 500px; width: 700px; /* ? Winner! */ )
Це тому min-width
, що або заважає width
опускатися нижче певного значення, або ігнорується, оскільки width
встановив уже встановлений елемент за мінімальну ширину, якою він повинен бути. Те ж саме стосується min-height
, max-width
і max-height
.
Сенс у всьому цьому: якщо ми встановимо як a, так min-*
і max-*
властивість на той самий елемент, що aspect-ratio
і вони "переможуть" над width
або height
, тоді вони замінять aspect-ratio
. Сказав тобі, це було трохи розумово. ?
Підтримка браузера
IE | Край | Firefox | Chrome | Сафарі | Опера |
---|---|---|---|---|---|
Ні | Ні | 86 1,2,3 | 90 4 | TP 5 | Ні |
Android Chrome | Android Firefox | Браузер Android | iOS Safari | Opera Mobile |
---|---|---|---|---|
Ні | Ні | Ні | Ні | Ні |
1 Можна ввімкнути, встановивши
layout.css.aspect-ratio.enabled
на true
.2 Підтримка блоків та замінених елементів, представлена у Firefox 81.
3 Підтримка гнучких елементів, представлених у Firefox 83.
4 Можна ввімкнути, встановивши
#enable-experimental-web-platform-features
значення Enabled.5 Доступно в Safari Technology Preview 118.