Перекласти значення відсотків X та Y на основі висоти та ширини елементів?


80

Переклад елемента Y на 50% змістить його на 50% від власної висоти, а не на 50% від батьківської висоти, як я очікував. Як я можу сказати, що елемент перекладу базує відсоток перекладу на батьківському елементі? Або я чогось не розумію?

http://jsfiddle.net/4wqEm/2/


6
Гаразд, схоже, це ніяк не обійти. Переклад CSS у відсотках приймає% елемента, який перекладається, щоб визначити відстань для переміщення. Він не діє як ваша типова декларація css, як top, margin-top або padding-top, які засновані на батьківському контейнері.
Ендрю Тіббеттс,

1
Дякую, мені не одразу стало очевидним, відсотковим значенням якого є відсоток.
Філіп Уолтон,

3
Наступне, що ви знаєте, вони також зроблять середні відсотки у відсотках від розміру шрифту! (о ...)
Кевін Пено

Відповіді:


41

Коли використовується відсоток у перекладі, це стосується ширини або висоти самого себе. Погляньте на https://davidwalsh.name/css-vertical-center ( демо ):

Одна цікава річ про перетворення CSS полягає в тому, що, застосовуючи їх із відсотковими значеннями, вони базують це значення на розмірах елемента, на якому вони реалізовані, на відміну від властивостей, таких як верхній, правий, нижній, лівий, поля та відступи , які використовують лише батьківські розміри (або у випадку абсолютного позиціонування, що використовує найближчого родича).


2
Але при анімації SVG, transform: translate(50%)схоже, використовує ширину та висоту батьківського елемента
Atav32

27

Ви можете використовувати vw та vh для перекладу залежно від розміру області перегляду

@keyframes bubbleup {
  0% {
    transform: translateY(100vh);
  }

  100% {
    transform: translateY(0vh);
  }
}

У мене це не працює ... vh ~ 40 - це як внизу сторінки ?!
AturSams

Це було моє погано ... елемент не був всередині абсолютного елемента ... :)
AturSams

11
@AxeEffect Це не повинна бути прийнятою відповіддю. Це відносно області перегляду, а не батьківського елемента. Що робити, якщо батьківський елемент має не повний розмір області перегляду?
trusktr

@wolfdawn, якщо ви використовуєте масштабування, порядок має значення. Отже, "масштаб (1.5) translateY (40vw)" я не те саме, що "translateY (40vw) масштаб (1.5)".
Кардов,

1
Ви повинні знати, що Apple і Google зламали модуль vh у мобільних браузерах, і тому він ненадійний у такому випадку.
Kev

17

Для мене працює лише CSS :

.child {
    position: relative;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);

    /* Backward compatibility */
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    -o-transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%);
}

Як це працює:

  • розташування зверху та ліворуч переміщує дочірній віджет відповідно до батьківських координат. У верхньому лівому куті дочірнього віджета з’явиться саме в центрі батьківського (зараз це не те, що ми хочемо).
  • переклад перемістить дочірній віджет -50% зверху та вліво залежно від його розміру (не батьківського). Це означає, що центральна точка віджета буде переміщена саме туди, де була точка зверху ліворуч - яка раніше була встановлена ​​як центр батьків, і це те, що ми хочемо.

6

Щоб використовувати відсоток у властивості перекладу, потрібно використовувати Javascript: http://jsfiddle.net/4wqEm/27/

HTML-код:

<div id="parent">
    <div id="children"></div>
</div>​​​​​​​​​​​​​

CSS-код:

#parent {
    width: 200px;
    height: 200px;
    background: #ff0;
}
#children {
    width: 10%;
    height: 10%;
    background: #f00;
}

Код Javascript:

parent = document.getElementById('parent');
children = document.getElementById('children');

parent_height = parent.clientHeight;
​children_translate = parent_height * 50/100;
children.style.webkitTransform = "translateY("+children_translate+"px)";​​​​​​​​​​​​​​​​​​​​​​​​​​

Сподіваюся, я міг би вам допомогти і сказати, якщо у вас є якісь інші проблеми.


1
я не можу це зробити лише з CSS3?
Дхріс

3
Це відстало (не ваша відповідь, просто той факт, що автори специфікацій не зробили способу зробити це в CSS і що ми повинні використовувати JS).
trusktr

3

Ваше твердження є абсолютно правильним щодо відсотків, що надходять від самого перекладеного елемента. Замість використання властивості translate у вашому випадку ви повинні використовувати абсолютне позиціонування, щоб залишатися відносно батьківського div. Я абсолютно вертикально розмістив тут ваш червоний div: (не забувайте про додавання позиції щодо батьківського div. Він повинен бути розміщений за винятком статичного за замовчуванням):

js тут

 body {
    margin: 0;
    width: 100%;
    height: 100%;
    }
 body > div {
    width: 200px;
    height: 200px;
    background: #ff0;
    position: relative;
    }
 body > div > div {
    width: 10%;
    height: 10%;
    -webkit-transform: translateY(-50%);
    background: #f00;
    position: absolute;
    top: 50%;
    }

1
Але анімація зверху та зліва не апаратно прискорена, чи не так?
trusktr

1

Ви також можете використовувати один додатковий блок і використовувати перехід для нього, крім дочірнього вузла

HTML-код:

<div id="parent">
    <div id="childrenWrapper">    
        <div id="children"></div>
    </div>
</div>​​​​​​​​​​​​​

css має бути приблизно таким

#parent {
    position: relative;
    width: 200px;
    height: 200px;
    background: #ff0;
}
#childrenWrapper{
    width: 100%;
    height: 100%;
}
#children {
    width: 10%;
    height: 10%;
    background: #f00;
}

1

Ви можете зробити елемент абсолютно позиціонованим і використовувати властивість left та top, щоб взяти відсоткове значення як батьківське.


1

Розгалужується з позиціонуванням, необхідним на наступному робочому зразку URL-адреси

body {
margin: 0;
width: 100%;
height: 100%;
}

body>div {
position: relative;
width: 200px;
height: 200px;
background: #ff0;
}

body>div>div {
position: absolute;
left: 50%;
top: 50%;
width: 10%;
height: 10%;
background: #f00;
transform: translate(-50%, -50%);
}

примітки:

  1. Ви можете абсолютизувати позиціонування вашого червоного квадрата, змінивши батьківський елемент на відносне положення
  2. тоді використання 50% верху та 50% ліворуч розташує червоний квадрат відповідно до його верхнього лівого кута
  3. за допомогою перетворення: перекласти (-50%, - 50%) розташуватиме червоний квадрат відповідно до його центру

0

Рішення цієї проблеми полягає у взагалі не використанні перекладу. Коли ви перекладаєте елемент, відсоток, який ви вибираєте, залежить від його власної висоти.

Якщо ви хочете розташувати елемент на основі висоти батьків, використовуйте top: 50%;

Тож код буде виглядати так:

body {
    margin: 0;
    width: 100%;
    height: 100%;
}
body > div {
    width: 200px;
    height: 200px;
    background: #ff0;
    position: relative;
}
body > div > div {
    position: absolute;
    top: 50%;
    width: 10%;
    height: 10%;
/*     -webkit-transform: translateY(50%); */
    background: #f00;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.