Подтвердить что ты не робот

Необходимо удалить и повторно применить свойство CSS, чтобы заставить его работать. Возможная ошибка с CSS?

ОБНОВЛЕНИЕ. Прежде чем читать этот пост и говорить, что вам нужно больше кода для репликации проблемы, простой вопрос, который я задаю, заключается в следующем:

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

ОБНОВЛЕНИЕ 2. Я не уверен на 100%, но это может быть проблемой только с тегом font-size и динамически изменяться с помощью Javascript. CSS для внешних и/или внутренних элементов, которые изменяются по размеру в Javascript, работает, как и следовало ожидать, эта проблема возникает, в частности, только при выборе размера шрифта. Возможно, окружающий HTML CSS не улавливает font-size при изменениях стиля, интенсивно связанных с памятью (например, наша функция изменения размера). Просто предположим.


Остальная часть этого сообщения - это способ уточнить, о чем я говорю.

Эта проблема может быть исключительной для Chrome. Чтобы уточнить, наше приложение используется внутри нашей командой продаж, и проект был разработан, чтобы сосредоточиться исключительно на Chrome, как для разработки, так и для использования на местах. Уже сейчас стилизация полностью отключена при открытии этого в других браузерах, поскольку нам нужно было только создать наш CSS для Chrome-совместимости (как мне посчастливилось приземлиться на такую ​​позицию, я не знаю, ха-ха).

Я столкнулся с этой проблемой несколько раз в своей карьере кодирования, которая, как я считаю, является ошибкой в ​​CSS, но может быть редкой ошибкой между изменениями стиля Javascript в DOM и родительском контейнере CSS, не адаптирующимся к изменению из-за возможных ограничений памяти или небольшого отставания в обработке между Javascript, применяющим стиль к HTML, и CSS, не обновляющийся для размещения. Я думаю, что это важный вопрос, поскольку, как я думаю, каждый веб-разработчик в интерфейсе имеет или будет сталкиваться с этим в какой-то момент своей карьеры.

Ситуация

Чтобы сделать это как можно короче, у нас есть контейнер внутри нашего тела, мы используем Javascript для размера с соотношением сторон 16: 9 относительно размера окна. Сделал скриншот всего окна. Как вы можете видеть, у нас есть внутренний размер контейнера пропорционально внутри нашего окна браузера (черная область, которая является телом). Внутренний контейнер - это место, где отображается весь контент для нашего приложения:

введите описание изображения здесь

Наш CSS построен, используя, по возможности, проценты. Мы построили функцию resizeUI, которая в основном используется для изменения размеров шрифтов на основе текущего соотношения ширины и высоты внутреннего экрана, хотя в этой функции есть и другие элементы, которые также имеют размер перераспределения, при изменении размера окна. Окно всегда идеально масштабируется, и все, что требуется для конкретного размера, основано на соотношении ширины и ширины внутреннего окна, как и ожидалось, с соответствующим корректированием CSS на основе дочерних элементов. Но....

Проблема

Когда окно браузера изменено, щелкнув и перетащив (инкрементное изменение размера), все на странице изменится. Однако, когда размер окна изменяется резко и мгновенно, полноэкранный режим (Максимизация) до малого (Восстановить вниз) или наоборот, размер шрифта в верхнем меню изменится, но CSS родительского li не будет регулироваться разместите новый размер шрифта, если я не уберу его атрибут padding и не перепроверяю его (добавьте обратно). Когда я это делаю, он работает нормально. Контейнер li действительно имеет только padding:1% и, таким образом, обычно правильно регулирует его размер на основе внутреннего размера диапазона, который изменяется с изменением размера шрифта.

Родительский li должен автоматически настраиваться на изменение внутреннего размера шрифта span. Я уверен в этом, потому что родительский контейнер li автоматически изменит размер самого себя, когда я изменяю размер шрифта или длину текста меню "на лету" в инспекторе.

Здесь он обычно выглядит как при загрузке, так и при изменении размера окна:

введите описание изображения здесь

И вот как это выглядит, когда я перехожу от маленького размера окна к полноэкранному, используя Maximize:

введите описание изображения здесь

Мое (хакерское) исправление

Единственный способ, с помощью которого я работал, - удалить дополнение для элементов <li> в верхней части функции повторного размера, а затем повторно применить его в нижней части функции повторного размера ПОСЛЕ линии который изменяет размер шрифта. Однако это работает в 50% случаев. Только при размещении тайм-аута 100 мсек в нижней части функции повторного размера для повторного применения отступов я получил его в 100% случаев.

Чтобы помочь, вот очень простой пример кода, с которым я работаю. Размер ul автоматически добавляет к нему внутренние элементы:

Соответствующий HTML

<ul>
  <li class="menu-items><span>Item 1</span></li>
  <li class="menu-items><span>Item 2</span></li>
  <li class="menu-items><span>Item 3</span></li>
  <li class="menu-items><span>Item 4</span></li>
  <li class="menu-items><span>Item 5</span></li>
</ul>

Соответствующий CSS

ul {
  position:absolute;
  top:0;
  right:2%;
  text-align:center;
}
.menu-items {
  padding: 1%;
}

Соответствующий Javascript

Что работает около 1/2 времени

function resizeUI(){
  $('.menu-items').css('padding','0');
  //Random other elements being re-sized
  $('.menu-items span').css('font-size', properRatio + "px");
  //More elements being resized
  $('.menu-items').css('padding','1%');
}

Работает каждый раз

function resizeUI(){
  $('.menu-items').css('padding','0');
  //Random other elements being re-sized
  $('.menu-items span').css('font-size', properRatio + "px");
  //More elements being re-sized
  setTimeout(function(){  
    $('.menu-items').css('padding','1%');
  }, 100);
}

Окончательный вопрос

Кто-нибудь еще сталкивался с подобными проблемами при работе с CSS, который должен адаптироваться к переопределению элемента? Я чувствую, что это проблема памяти или ошибка между Javascript и CSS, учитывая, что установка тайм-аута - единственный надежный способ, которым я получил его в 100% случаев, и, опять же, это ТОЛЬКО происходит на огромном, мгновенном изменении в размере окна (Максимизировать для восстановления вниз или наоборот), но не по ручному, меньшему, поэтапному изменению размера. Извините за такой подробный пост/вопрос, но я несколько раз сталкивался с этой странной ошибкой, когда мне пришлось удалить и повторно применить атрибут CSS, чтобы он работал правильно, и я не сомневаюсь, что и другие разработчики тоже.

4b9b3361

Ответ 1

Наложение действительно работает. Каждый блок (div или что-то еще, что вы используете) перекрывает одно предыдущее равномерно, потому что вы превыше 100% ширины представления в целом. Они строятся слева направо, и когда доходит до конца максимально допустимого размера, все они будут одинаково нажимать на предыдущие. Также дополнение влияет на элементы внутри div и не будет влиять на divs вне себя. Таким образом, они имеют правильный размер, но вы не установили правило, которое остановило бы divs от перекрытия. Маржа может это сделать, но если они превышают 100% от желаемого размера, вам придется иметь дело с чрезмерным потоком. Вы можете попробовать использовать auto для заполнения, но маржа может быть лучше. В противном случае вам придется играть с размерами и процентами, чтобы они соответствовали максимально допустимой ширине. Ознакомьтесь с моделью CSS Box здесь.

Ответ 2

У вас когда-либо возникала проблема удаления и повторного применения CSS свойство на элементе, чтобы этот стиль применялся, когда он был уже там и должен был работать по умолчанию?

Да: fooobar.com/info/417651/...

Каково было ваше решение?

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

Сброс и сброс сработавшего тайм-аута, но вызвали раздражающие мигания.

В моем случае решение удаляло элемент и вставляло его обратно.

window.addEventListener('resize', function() {
  // Force a rerender
  var parent = element.parentNode,
      next = element.nextSibling;
  parent.removeChild(element);
  parent.insertBefore(element, next);
});

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