Jump to content
  • 0

window.getComputedStyle подвёл, зараза :(


psywalker
 Share

Question

Если у элемента прописана высота в % (height: 60%), то Firefox и Chrome с помощью метода window.getComputedStyle(Е,null)['height'] определяет высоту в px, а нужно принципиально в % :(

Была идея лезть в таблицы стилей через жс, но это геморно и игра не стоит свеч, но неужели придётся?((

Есть идеи, ребят? :unsure:

Link to comment
Share on other sites

20 answers to this question

Recommended Posts

  • 0

А зачем тебе проценты?

Ну и у тебя есть высота родителя, можешь их рассчитать.

К сожалению так нельзя мне. У меня задача другая. Так бы конечно я так сделал и не парился(

Link to comment
Share on other sites

  • 0

Без понимания задачи ничего не подскажу.

1) Мне надо хотя бы один раз узнать, в чём стоит высота у элемента.

2) Далее у меня по ресайзу блок должен оставаться на месте по высоте (если он фикс высоты), либо становиться больше или меньше по высоте, если %

Link to comment
Share on other sites

  • 0

Вообще то что ты описал это нормальное поведение блоков и без каких либо телодвижений.

Но если тебе надо определить в относительных или абсолютных единицах задана высота элемента — измени высоту родителя на пару пикселей и проверь изменится ли высота дочернего элемента.

Если изменится — относительные единицы.

Ну и потом вернуть все на место.

Если боишься что пользователи увидят — сделай их невидимую копию в абсолютно позиционированном враппере.

  • Like 1
Link to comment
Share on other sites

  • 0

Вообще то что ты описал это нормальное поведение блоков и без каких либо телодвижений.

Но если тебе надо определить в относительных или абсолютных единицах задана высота элемента — измени высоту родителя на пару пикселей и проверь изменится ли высота дочернего элемента.

Если изменится — относительные единицы.

Ну и потом вернуть все на место.

Если боишься что пользователи увидят — сделай их невидимую копию в абсолютно позиционированном враппере.

О, вот это конеша геморойчик, но идею принял во внимание, спасибо :)

Link to comment
Share on other sites

  • 0

Да нет там никакого гемороя. imo ты вообще фигней какой то маешься (я все еще не понимаю ЗАЧЕМ).

Смотри, после всех рассчётов мне нужно будет ставить блоку фикс высоту полюбас, а при ресайзе снова её сбрасывать и вот тут-то как раз мне и нужно знать, были ли у блока % или фикс, чтобы пересчитать всё заново.

И да, если идея полезна и принята во внимание там в уголке поста есть плюсик ;)

Не вопрос)

Link to comment
Share on other sites

  • 0

Каких расчетов? Я не понимаю что ты пытаешься получить в конечном итоге.

Сделай тесткейс … подозреваю что если ты покажешь как работает и напишеш как ты хочешь что бы работало это будет понятно.

Link to comment
Share on other sites

  • 0

Каких расчетов? Я не понимаю что ты пытаешься получить в конечном итоге.

Сделай тесткейс … подозреваю что если ты покажешь как работает и напишеш как ты хочешь что бы работало это будет понятно.

Расчётов не важно каких. Просто представь ситуацию. В начале мы получаем высоту блока, в конце дальнейших манипуляций с блоком мы ставим ему фикс высоту, а далее ресайз и снова тоже самое.

Может ещё какие есть решения? :)

Link to comment
Share on other sites

  • 0

Как временное решение — сделать тупо два блока, один в другом. Снимать высоту у внешнего, присваивать внутреннему. Но я тоже пока плохо понимаю, зачем такие манипуляции нужны...

Link to comment
Share on other sites

  • 0

Как временное решение — сделать тупо два блока, один в другом. Снимать высоту у внешнего, присваивать внутреннему. Но я тоже пока плохо понимаю, зачем такие манипуляции нужны...

А вообще, нет вариантов узнать точно, в чём высота? Может какие методы есть в жс? :unsure:

Link to comment
Share on other sites

  • 0

Мне таковые, к сожалению, неизвестны. То, что скрипт достает финальное значение ("used value") в пикселях — увы, документированный факт...

Хотя файрбаг со товарищи достают как-то. Мне приходит на ум только вариант тупо парсить все доступные cssRules и проверять (напр. через querySelectorAll), что подходит к элементу, а что не подходит. Интересно, так они делают или есть путь рациональнее...

Link to comment
Share on other sites

  • 0
Расчётов не важно каких.

Не, пасибо. Это без меня.

Ок, всё равно спасибо тебе, может всё-таки удастся решить задачу и более простым способом. И даже не нужно будет ничего считать. :)

Link to comment
Share on other sites

  • 0

Если у тебя может быть, или %, или px значит это как-то обусловлено в css, значит можно опираться на селекторы и ты просто будешь знать в какой ситуации %, а в какой px. от этого и плясать, если это записано в inline стилях, то можно прочитать значение атрибута style и распарсить. Но, что-то мне подсказывает, что можно решить задачу в лоб

Link to comment
Share on other sites

  • 0
Firefox и Chrome с помощью метода window.getComputedStyle(Е,null)['height'] определяет высоту в px

если не ошибаюсь, так и должно быть (т.е. они делают правильно)

А зачем тебе проценты?

Ну и у тебя есть высота родителя, можешь их рассчитать.

:)

К сожалению так нельзя мне. У меня задача другая. Так бы конечно я так сделал и не парился(

давай, показывай задачу )

Link to comment
Share on other sites

  • 0


#box{
width: 200px;
height: 200%;
left: 10%;
position: absolute;
background: red;
display: none;
}?


function getStyle(el, styleProp){
el = document.getElementById(el);

if (el.currentStyle) {
var s = el.currentStyle[styleProp];
} else if (window.getComputedStyle) {
var s = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
}

return s;
}


console.log(getStyle('box','height'));?
console.log(getStyle('box','left'));?

  • Like 3
Link to comment
Share on other sites

  • 0


#box{
width: 200px;
height: 200%;
left: 10%;
position: absolute;
background: red;
display: none;
}?


function getStyle(el, styleProp){
el = document.getElementById(el);

if (el.currentStyle) {
var s = el.currentStyle[styleProp];
} else if (window.getComputedStyle) {
var s = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
}

return s;
}


console.log(getStyle('box','height'));?
console.log(getStyle('box','left'));?

Ухты, здорово! Спасибо дружище :)

nerv, Даа, уже не важно, чё за задача, я там уже выкрутился по другому, а этот вариант возьму на заметку)

Link to comment
Share on other sites

  • 0

Для тех, кто не понял, в чём прикол, расскажу, что между методами window.getComputedStyle(Е,null)["property"] и document.defaultView.getComputedStyle(Е, null).getPropertyValue("property") нет никакой разницы, и даже предпочтительнее использовать первый. Вся соль именно в значении "none" у свойства display. Поэтому чтобы пример работал, нужно для начала скрывать его, для того, чтобы браузер не успел пересчитать % в px, и получив результат, уже показывать блок снова. Как показано в этом примере. :)

Спасибо Great Rash и SelenIT за расследование :boast:

  • Like 2
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy