perspective-origin в CSS — точка сходу тривимірної сцени


автор: Svitlana

Загальний опис

автор: NagarD

Нотатка

Зверніть увагу, що ця технологія експериментальна, й може не працювати в деяких браузерах. Синтаксис і поведінка backface-visibility може змінюватися у майбутньому.

автор: Svitlana

Синтаксис

perspective-origin: x-axis y-axis|initial|inherit;

Властивість perspective-origin може отримувати 4 значень:

x-axis

Визначає, де вид знаходиться на вісі х

автор: Svitlana

y-axis

Визначає, де вид знаходиться на вісі у

автор: Svitlana

initial

Встановлює властивість у значення без задання

автор: Svitlana

inherit

Вказує на спадковість властивостей від свого батьківського елемента

автор: Svitlana

Значення без задання: 50% 50%
Наслідує: Ні
Анімується: Так
JavaScript синтаксис: object.style.perspectiveOrigin="10px 50%"

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
36 16 9 23 12 10
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 36 16 9

Приклади

+ запропонувати свій приклад у пісочниці

perspective-origin зсуває точку, з якої глядач дивиться на 3D-сцену: типово це центр, у другій сцені — лівий верхній кут, тож той самий поворот виглядає інакше.

HTML

<div class="scene one"><div class="card">центр</div></div>
<div class="scene two"><div class="card">10% 10%</div></div>

CSS

.scene {
    display: inline-block;
    margin-right: 32px;
    perspective: 300px;
}

.two {
    perspective-origin: 10% 10%;
}

.card {
    width: 100px;
    height: 100px;
    line-height: 100px;
    text-align: center;
    background: #0172ad;
    color: #fff;
    transform: rotateY(45deg);
}
автор: Svitlana

Демонстрація дії різних значень властивості

HTML

<p>Вибери потрібне значення для <code>perspective-origin</code>(у відсотках):</p>

<input type="number" value="50" step="10" max="100" min="0" id="field"></input>
<input type="number" value="50" step="10" max="100" min="0" id="field2"></input>

<div id="container">
	<div class="rotate">
    Привіт! :)
  </div>
</div>

CSS

body {
	padding: 36px;
  text-align: center;
  line-height: 1.45;
  font-size: 17px;
  font-family: sans-serif;
}

#field,
#field2{
  padding: 8px;
}

#container {
  padding: 16px;
  perspective: 100px;
}

.rotate {
  width: 100px;
  padding: 30px;
  text-align: center;
  background: gold;
  transform: rotateX(15deg);
  margin: 36px auto 0 auto;
  perspective: 100px;
}

JS

var container = document.getElementById('container');
var field = document.getElementById('field');
var field2 = document.getElementById('field2');

field.onchange = field2.onchange = function change() {
  var newVal = getNewValue();
  container.style.perspectiveOrigin = newVal[0] + '% ' + newVal[1] + '%';
};

function getNewValue() {
  var result = [];
  result[0] = field.value;
  result[1] = field2.value;
  return result;
}
//# sourceURL=pen.js
автор: Svitlana

HTML

<div class="gallery">
   <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200' viewBox='0 0 40 40' preserveAspectRatio='none'%3E%3Crect width='40' height='40' fill='%23264653'/%3E%3Cpath d='M0 40 12 18 22 30 30 22 40 40Z' fill='%232a9d8f'/%3E%3Ccircle cx='30' cy='9' r='5' fill='%23e9c46a'/%3E%3C/svg%3E" alt="" class="left block">
   <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200' viewBox='0 0 40 40' preserveAspectRatio='none'%3E%3Crect width='40' height='40' fill='%23264653'/%3E%3Cpath d='M0 40 12 18 22 30 30 22 40 40Z' fill='%232a9d8f'/%3E%3Ccircle cx='30' cy='9' r='5' fill='%23e9c46a'/%3E%3C/svg%3E" alt="" class="block">
   <img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200' viewBox='0 0 40 40' preserveAspectRatio='none'%3E%3Crect width='40' height='40' fill='%23264653'/%3E%3Cpath d='M0 40 12 18 22 30 30 22 40 40Z' fill='%232a9d8f'/%3E%3Ccircle cx='30' cy='9' r='5' fill='%23e9c46a'/%3E%3C/svg%3E" alt="" class="right block">
  </div>

CSS

.gallery {
    text-align: center;
    perspective: 800px;
   }
   .left {
    transform: rotateY(-30deg); 
    transform-origin: right center; 
   }
   .right {
    transform: rotateY(30deg); 
    transform-origin: left center;
   }
.block{
  width: 200px;
}
автор: Svitlana

Шість однакових сцен, у кожній та сама картка з rotateY(45deg). Міняється лише perspective-origin — і схил картки щоразу інший: центр, лівий верхній кут, правий край, низ. П'ята сцена показує, що без perspective властивість не діє, шоста — що функція perspective() у самій картці слухається transform-origin, а не ока батька.

HTML

<div class="grid">
    <figure><div class="scene s1"><div class="card"></div></div><figcaption>50% 50% — типове</figcaption></figure>
    <figure><div class="scene s2"><div class="card"></div></div><figcaption>left top</figcaption></figure>
    <figure><div class="scene s3"><div class="card"></div></div><figcaption>100% 50%</figcaption></figure>
    <figure><div class="scene s4"><div class="card"></div></div><figcaption>50% 100%</figcaption></figure>
    <figure><div class="scene s5"><div class="card"></div></div><figcaption>perspective: none — дії немає</figcaption></figure>
    <figure><div class="scene s6"><div class="card fn"></div></div><figcaption>perspective() у картці — око батька не враховано</figcaption></figure>
</div>

CSS

.grid {
    display: flex;
    flex-wrap: wrap;
    gap: 18px;
}

figure {
    margin: 0;
}

figcaption {
    margin-top: 6px;
    max-width: 170px;
    font: .8em/1.35 system-ui, sans-serif;
    color: #5a6472;
}

.scene {
    width: 170px;
    height: 170px;
    background: #eef1f5;
    border: 1px dashed #b9c6d8;
    perspective: 260px;
}

.card {
    width: 110px;
    height: 110px;
    margin: 30px;
    background: linear-gradient(135deg, #2f6fd0, #72b043);
    transform: rotateY(45deg);
}

.s1 { perspective-origin: 50% 50%; }
.s2 { perspective-origin: left top; }
.s3 { perspective-origin: 100% 50%; }
.s4 { perspective-origin: 50% 100%; }

.s5 {
    perspective: none;
    perspective-origin: left top;
}

.s6 {
    perspective: none;
    perspective-origin: left top;
}

.fn {
    transform: perspective(260px) rotateY(45deg);
}
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід