创建一个在页面顶部通知横幅的 mixin

Creating a mixin that notifies a banner at the top of the page

我有一个页面,当有消息从另一个用户广播时,它会创建一个弹出通知。弹出窗口基本上是一个 div,它保存已发送消息的内容,并带有一个允许您将其关闭的按钮。

现在我已经研究了一百万种方法来创建使用伪 类 扩展属性的转换,但我的问题是:是否可以在页面顶部创建一个横幅,并随着当另一个人使用纯 CSS3 / transition mixins?

发送消息时

我的想法是转换最大高度 属性 但显然它不起作用。我假设是因为没有高度开始。

CSS:

.banner-messages {
 > div {
  background-color: #74bce7;
  color: #fff;
  top: 0; 
  left: 0;
  padding: 20px 30px;
  position: relative; 
  line-height: 100%;    
  width: 100%;
  max-height: 0;
  z-index: 1000; 
  overflow-y: hidden;

  @include drop-down;
  }
}

@mixin drop-down {
  max-height: 200px;
  -webkit-transition: all 1.5s linear;
  -moz-transition: all 1.5s linear;
  -o-transition: all 1.5s linear;
  transition: all 1.5s linear;
}

HTML:

<div id="test" class="banner-messages" data-bind="foreach: messages">
<div class="banner-message">
    <img data-bind="imgSrc: 'radio.svg'">

    <div class="banner-body">
        <p class="banner-title">{{title}}</p>
        <pre>{{message}}</pre>
    </div>

    <span class="exit-dialout-panel icon icon-closes" data-bind="visible: dismissable, click: $parent.dismissMessage.bind($parent, $data)"></span>
</div>

尝试使用 css 绑定添加 class 应用 transform: translateY:

var Viewmodel = function Viewmodel() {
  var that = this;
  
  this.messages = ko.observableArray([]);
  
  this.removeMessages = function removeMessages() {
    that.messages.removeAll();
  };
  
  this.addMessage = function addMessage() {
    that.messages.push("A new message came in");
  };
};

ko.applyBindings( new Viewmodel() );
header {
  transition: transform 0.3s;
  transform: translateY(-110%);
  background-color: lightblue;
  padding: 2rem;
  font-family: sans-serif;
}

header.active {
  transform: translateY(0);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<main>
  <header data-bind="css: { active: messages().length > 0 }">
    <ul data-bind="foreach: messages">
      <li data-bind="text: $data"></li>
    </ul>
    <button data-bind="click: removeMessages">mark all as read</button>
  </header>
</main>

<button data-bind="click: addMessage">Add message</button>