Внешний css, похоже, не работает с javascript [duplicate]

Flexbox - это «одномерная» система компоновки: она может выравнивать элементы вдоль горизонтальных или вертикальных линий.

Истинная сетка «2-мерная»: она может выравнивать элементы вдоль горизонтальной и вертикальной линий. Другими словами, ячейки могут располагаться между столбцами и строками, которые невозможно выполнить с помощью flexbox.

Вот почему flexbox имеет ограниченную емкость для построения гридов. Это также является причиной того, что W3C разработал еще одну технологию CSS3, Grid Layout (см. Ниже).


В контейнере flex с flex-flow: row wrap элементы гибкости должны быть завернуты к новым строкам .

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

Обратите внимание, что div # 3 обертывается ниже div # 1 , создавая новую строку. Он не может упасть ниже div # 2 .

В результате, когда элементы не самые высокие в строке, остается пустое пространство, создавая неприглядные пробелы.

image credit: Jefree Sujit


column wrap Решение

Если вы переключитесь на flex-flow: column wrap, элементы гибки будут стекаться вертикально, а сетчатая компоновка более достижима. Однако контейнер с колоновым направлением имеет три потенциальные проблемы сразу:

  1. Он расширяет контейнер горизонтально, а не вертикально (например, макет Pinterest).
  2. Это требует, чтобы контейнер имел фиксированную высоту, поэтому элементы знают, где их можно обернуть.
  3. На момент написания этой статьи у него есть недостаток во всех основных браузерах, где контейнер не работает 't расширяться для размещения дополнительных столбцов .

В результате контейнер со столбцом может быть невозможен во многих случаях.


Другие решения

165
задан alex 8 January 2013 в 00:40
поделиться

9 ответов

В целях безопасности вы можете проверить, существует ли элемент, прежде чем пытаться его прочитать. Если он не существует, ваш код будет генерировать исключение, которое остановит выполнение на остальной части вашего JavaScript и потенциально отобразит сообщение об ошибке для пользователя - не хорошо. Вы хотите, чтобы уметь изящно терпеть неудачу.

var height, width, top, margin, item;
item = document.getElementById( "image_1" );
if( item ) {
  height = item.style.height;
  width = item.style.width;
  top = item.style.top;
  margin = item.style.margin;
} else {
  // Fail gracefully here
}
1
ответ дан BryanH 21 August 2018 в 14:28
поделиться
  • 1
    Это плохая идея, если вы действительно не ожидаете, что узел не может находиться в DOM. Слепая проверка нуля, когда нуль не ожидается, может привести к появлению ошибок, но скорее это скроет ошибку. Если вы ожидаете, что узел будет там, не указывайте, чтобы он не был там, допустим ошибку, чтобы вы могли исправить свой код. Этот ответ не имеет никакого отношения к самому вопросу, и поскольку это скорее (плохое) предложение, это должен быть комментарий. – Juan Mendes 7 June 2012 в 17:40
  • 2
    Спасибо за ваш комментарий. Я делаю это, потому что я склоняюсь к обороне. Вот вопрос: как вы увидите ошибку на машине пользователя? Помните, что то, что работает на вашем компьютере, может работать не для других (разные браузеры и ОС, плагины, которые влияют на поведение страницы, другие отключенные вещи и т. Д.). Дело было в том, чтобы он был неудачным изящно, поэтому страница все еще делала что-то близкое к тому, что было предназначено, вместо того, чтобы вызывать бесполезную ошибку пользователю. – BryanH 9 June 2012 в 04:50
  • 3
    @BryanH Там есть ошибка браузера, где он не отображает элемент с идентификатором «image_1» ?? ;) – alex 8 April 2014 в 02:56
  • 4
    @alex No. Если нет элемента с этим идентификатором, тогда код OP завершится с ошибкой. [Д0] Пример . Мое предложение заключалось в том, чтобы кодировать, чтобы этого никогда не могло случиться. – BryanH 6 February 2015 в 22:13

Свойство element.style позволяет вам знать только свойства CSS, которые были определены как встроенные в этот элемент (программно или определены в атрибуте стиля элемента), вы должны получить вычисленный стиль.

Не так просто сделать это кросс-браузерным способом, IE имеет свой собственный путь, через свойство element.currentStyle и стандартный способ DOM Level 2, реализованный другими браузерами, через метод document.defaultView.getComputedStyle.

Два способа имеют различия, например, свойство элемента IE.currentStyle ожидает, что вы получите доступ к именам свойств CSS, состоящим из двух или более слов в camelCase (например, maxHeight, fontSize, backgroundColor и т. д.), стандартный способ ожидает свойства со словами, разделенными тире (например, max-height, font-size, background-color и т. д.). ......

function getStyle(el, styleProp) {
    var value, defaultView = (el.ownerDocument || document).defaultView;
    // W3C standard way:
    if (defaultView && defaultView.getComputedStyle) {
        // sanitize property name to css notation
        // (hyphen separated words eg. font-Size)
        styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
        return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
    } else if (el.currentStyle) { // IE
        // sanitize property name to camelCase
        styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) {
            return letter.toUpperCase();
        });
        value = el.currentStyle[styleProp];
        // convert other units to pixels on IE
        if (/^\d+(em|pt|%|ex)?$/i.test(value)) { 
            return (function(value) {
                var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
                el.runtimeStyle.left = el.currentStyle.left;
                el.style.left = value || 0;
                value = el.style.pixelLeft + "px";
                el.style.left = oldLeft;
                el.runtimeStyle.left = oldRsLeft;
                return value;
            })(value);
        }
        return value;
    }
}

Основная ссылка stackoverflow

22
ответ дан Community 21 August 2018 в 14:28
поделиться

Кросс-браузерное решение без манипуляций с DOM, приведенное выше, не работает, потому что оно дает первое правило соответствия, а не последнее. Последнее правило сопоставления является тем, которое применяется. Вот рабочая версия:

function getStyleRuleValue(style, selector) {
  let value = null;
  for (let i = 0; i < document.styleSheets.length; i++) {
    const mysheet = document.styleSheets[i];
    const myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
    for (let j = 0; j < myrules.length; j++) {
      if (myrules[j].selectorText && 
          myrules[j].selectorText.toLowerCase() === selector) {
        value =  myrules[j].style[style];
      }
    }
  }
  return value;
}  

Однако этот простой поиск не будет работать в случае сложных селекторов.

0
ответ дан jcdufourd 21 August 2018 в 14:28
поделиться

Вы можете использовать getComputedStyle() .

var element = document.getElementById('image_1'),
    style = window.getComputedStyle(element),
    top = style.getPropertyValue('top');

jsFiddle .

289
ответ дан Josh Schultz 21 August 2018 в 14:28
поделиться
  • 1
    Если вы хотите изменить цвет фона для div, будьте осторожны, чтобы НЕ ИСПОЛЬЗОВАТЬ & quot; backgroundColor & quot; вместо "backgroung-color" ;) – baptx 20 May 2012 в 18:24
  • 2
    Является ли slw аббревиатурой или вы подразумеваете медленный? – David Winiecki 9 May 2014 в 21:40
  • 3
    getComputedStyle не поддерживается в IE 8 и ниже. – David Winiecki 9 May 2014 в 22:04
  • 4
    Несколько от темы: некоторые (все?) стенографические свойства css недоступны в JavaScript. Например. вы можете получить padding-left, но не padding. JSFiddle – David Winiecki 9 May 2014 в 22:10
  • 5
    @DavidWiniecki, я действительно не верю, что webdevs все равно должен рассмотреть IE8 в основном браузере. поскольку он больше не поддерживается microsoft – Kevin Kuyl 28 February 2015 в 18:24

Используйте следующее. Это помогло мне.

document.getElementById('image_1').offsetTop

См. Также Получить стили .

19
ответ дан Peter Mortensen 21 August 2018 в 14:28
поделиться

Если вы находитесь в библиотеках, почему бы не MyLibrary и getStyle .

Метод jQuery css неверен , CSS - это всего лишь один способ установки стилей и необязательно представляет фактические значения свойств стиля элемента.

2
ответ дан RobG 21 August 2018 в 14:28
поделиться

Если вы установите его программно, вы можете просто называть его как переменную (т. е. document.getElementById('image_1').style.top). В противном случае вы всегда можете использовать jQuery:

<html>
    <body>
        <div id="test" style="height: 100px;">Test</div>
        <script type="text/javascript" src="jquery.min.js"></script>
        <script type="text/javascript">
            alert($("#test").css("height"));
        </script>
    </body>
</html>
6
ответ дан T J 21 August 2018 в 14:28
поделиться
  • 1
    Я не думаю, что ваш пример jQuery очень ясен (или правильно). – alex 14 June 2011 в 03:29
  • 2
    Ты прав. Я добавил рабочий пример. – adotout 14 June 2011 в 04:18
  • 3
    style свойство return all style inline применяется к элементу, не определяемому правилами css. – Steven Koch 10 May 2018 в 11:15

Кросс-браузерное решение для проверки значений CSS без манипуляции с DOM:

function getStyleRuleValue(style, selector) {
    for (var i = 0; i < document.styleSheets.length; i++) {
        var mysheet = document.styleSheets[i];
        var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
        for (var j = 0; j < myrules.length; j++) {
            if (myrules[j].selectorText && myrules[j].selectorText.toLowerCase() === selector) {
                return myrules[j].style[style];
            }
        }

    }
};

Использование:

getStyleRuleValue('backgroundColor', '.chart-color')

дезинфицированная версия (принудительно вводит ввод в строчный регистр и позволяет использовать case без ведущего ".")

function getStyleRuleValue(style, selector) {
var selector_compare=selector.toLowerCase();
var selector_compare2= selector_compare.substr(0,1)==='.' ?  selector_compare.substr(1) : '.'+selector_compare;

for (var i = 0; i < document.styleSheets.length; i++) {
    var mysheet = document.styleSheets[i];
    var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
    for (var j = 0; j < myrules.length; j++) {
        if (myrules[j].selectorText) {
            var check = myrules[j].selectorText.toLowerCase();
            switch (check) {
                case selector_compare  :
                case selector_compare2 : return myrules[j].style[style];
            }
        }
    }

}

}

12
ответ дан unsynchronized 21 August 2018 в 14:28
поделиться
  • 1
    У меня был долгий день, и это не работало по ряду причин. pastie.org/9754599 работает намного лучше, выкинув недопустимые списки правил и опустив обе стороны финала ===. Большое спасибо, что ваше решение все еще спасло день! – Richard Fox 1 December 2014 в 20:07
  • 2
    хороший ответ, добавила в конце санированную версию, чтобы исправить несколько проблем использования края. – unsynchronized 27 June 2016 в 03:32
0
ответ дан aabiro 1 November 2018 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: