"скрытое" свойство не работает с flex-box

У меня есть следующий код с использованием flex-box

  <!DOCTYPE html>

  <polymer-element name='test-flex'>
    <template>

      <style>
         .lab-flex-col-container {
           display: flex;
           flex-flow: column;
           align-content: center;
           background-color: gold;
           border-radius:5px;
           margin: 5px;
        }

        .lab-flex-col {
          display:flex;
          flex-flow:column;
          align-self:center;
          margin:5px;
        }

        .margin2 { margin: 2px; }


      </style>

      <form id='form'
        class='form'>

        <div class='lab-flex-col-container'>
           <div class='lab-flex-col' id='hidden-does-not-work' hidden>
              <input id='hidden-works' type='text'>
           </div>

           <div id='hidden-works' hidden>
              <textarea></textarea>
           </div>
           <div id='hidden-does-not-work-here-either' class='lab-flex-col' hidden>
              <button>Save</button>
           </div>

        </div>
      </form>

    </template>

    <script type="application/dart;component=1">

      import 'package:polymer/polymer.dart';
      import 'dart:html';


      @CustomTag( 'test-flex' )
      class TestFlex extends PolymerElement
      {

        TestFlex.created() : super.created();

        ready()
        {
          $['hidden-does-not-work'].hidden = true;
        }

        void syncDb ( Event e, var detail, var target )
        {

        }

        @override
        void enteredView()
        {
           super.enteredView();

           $['hidden-does-not-work-here-either'].hidden = true;

        }
      }

    </script>
  </polymer-element>

Почему присутствие класса lab-flex-col предотвращает скрытие ввода текста? Я попробовал hidden = 'hidden', и это тоже не работает.

Когда скрытый присутствует как в элементе textarea, он работает так, как ожидалось, но после добавления класса flex-box он перестает работать и элемент остается видимым.

Ответ 1

Создайте класс .hidden с display:none и добавьте его в свой div-класс.

HTML:

<div class='lab-flex-col-container'>
    <div class='lab-flex-col hidden' id='hidden-does-not-work'>
        <input id='hidden-works' type='text'>
    </div>
    <div id='hidden-works' hidden>
        <textarea></textarea>
    </div>
    <div id='hidden-does-not-work-here-either' class='lab-flex-col hidden'>
        <button>Save</button>
    </div>
</div>

CSS:

.lab-flex-col {
    display: flex;
}

.lab-flex-col.hidden {
    display: none;
}

Здесь работает скрипка: http://jsfiddle.net/2mNux/3/

Ответ 2

Самое простое исправление - переопределить все поведение с помощью селектора атрибутов. Не требуется никаких изменений документа:

[hidden]{
  display:none;
}

http://jsfiddle.net/mjxcrrve/

Я предполагаю, что логика поведения по умолчанию заключается в том, чтобы разрешить переопределять "скрытый" атрибут html с помощью CSS. "hidden" - это более или менее неявный "display: none", поэтому переопределение стиля "display" является естественным кандидатом. Но я согласен с тем, что кажется неправильным, что изменение чистого макета должно повлиять на видимость.

Ответ 3

Выполняется эта работа:

[hidden] {
    display: none !important;
}

Обратите внимание, что часть !important важна для предотвращения переопределения объявления display: none другим кодом CSS.

Дополнительная информация: https://meowni.ca/hidden.is.a.lie.html