【问题标题】:CSS Fold items up & down animationCSS 上下折叠项目动画
【发布时间】:2017-03-31 19:51:46
【问题描述】:

我有一个物品清单:

其中,我想用动画效果折叠,只显示一个项目:

如您所见,目前它折叠为一项,但整个组件并未折叠。

我目前只是将项目不透明度设置为零:

css

.slide-fade-hide {
  transition: all 1.2s ease-out;
  opacity: 0;
  //height: 2em;
}

.slide-fade-show {
  transition: all 1.2s ease-in;
  opacity: 1;
  //height: 2em;
}

html

<ion-list>
  <ion-row>
    <ion-col>
      <div id="search">
        <ion-searchbar class="ion-searchtext" id="ion-searchtext" [(ngModel)]="searchQueryText" (ionFocus)="focusSearch($event)" (change)="onChangeText($event)"
          (ionClear)="onCancelText($event)" (ionInput)="onInputText($event)" placeholder="{{jobType === 0 ? favourite ? 'Market Favourites' : 'Market' : favourite ? 'Postings Favourites' : 'Postings'}}"
          debounce="1"></ion-searchbar>
      </div>
      <!--<div id="pinButton"><button ion-button (click)="presentPopover()" color="primary"><ion-icon name="funnel"></ion-icon></button></div>-->
    </ion-col>
  </ion-row>

  <!--<div *ngIf="showExtraSearch === true">-->
  <div id="extra-filter-items" class="slide-fade-hide">
    <ion-row>
      <ion-col>
        <div id="location-filter">
          <ion-searchbar id="ion-locationbar" [(ngModel)]="searchQueryLocation" (ionClear)="onCancelLocation($event)" (ionInput)="onInputLocation($event)"
            (click)="presentFilterMap()" placeholder="Location" debounce="1"></ion-searchbar>
        </div>
      </ion-col>
    </ion-row>
    <ion-row>
      <ion-col>
        <div id="categories-filter">
          <ion-searchbar id="ion-locationbar" [(ngModel)]="searchQuerySectors" (ionClear)="onCancelSectors($event)" (ionInput)="onInputSectors($event)"
            (click)="presentFilterCategories()" placeholder="Sectors" debounce="1"></ion-searchbar>
        </div>
      </ion-col>
    </ion-row>
    <ion-row>
      <ion-col>
        <div id="rating-filter">
          <ion-searchbar id="ion-locationbar" [(ngModel)]="searchQueryRating" (ionClear)="onCancelRating($event)" (ionInput)="onInputRating($event)"
            (click)="presentFilterRating()" placeholder="Star Rating" debounce="1"></ion-searchbar>
        </div>
      </ion-col>
    </ion-row>
    <ion-row>
      <ion-col>
        <div id="time-filter">
          <ion-searchbar id="ion-locationbar" [(ngModel)]="searchQueryTime" (ionClear)="onCancelTime($event)" (ionInput)="onInputTime($event)"
            (click)="presentFilterTime()" placeholder="Last Online" debounce="1"></ion-searchbar>
        </div>
      </ion-col>
    </ion-row>
  </div>
</ion-list>

javascript

  showExtraFilters(): void {
    let extraItemsElement = document.getElementById('extra-filter-items');
    if (extraItemsElement) {
      extraItemsElement.className = "slide-fade-show";
    }
  }

  hideExtraFilters(): void {
    let extraItemsElement = document.getElementById('extra-filter-items');
    if (extraItemsElement) {
      extraItemsElement.className = "slide-fade-hide";
    }
  }

问题

这些项目仍然存在,它们只是透明的。

  1. 所以如果我点击它们,它们仍然会响应。

  2. 此外,它们仍在占用空间,因此 dom 的其余部分仍在其下方。

问题

如何让项目从 1 个项目切换到 5 个项目,并带有动画效果,就好像它们在上下滑动一样?此外,它们还可以在它们启动时释放其下方的空间。

我确实看过this example(参见“Slide down & Fade”),但正如您在上面看到的,这并不能满足我的需要。

谢谢

附言我正在使用 Ionic2,所以不想使用任何其他 Javascript 框架,如 JQuery(只是普通的 javascript 和 css)。

【问题讨论】:

  • 你应该有 height: 0;当您想隐藏它以显示收缩动画时。
  • 你能做一个小提琴吗?
  • 如上所述,您需要将高度设置为 0。设置不透明度会更改其透明度,但不会影响其在 DOM 中的尺寸或位置。
  • 嗨@罗伯特,谢谢。设置 height: 0px 确实会折叠背景,但没有动画。此外,它下面还有一个项目列表,也需要向上移动。虽然取得了进展。

标签: javascript html css ionic2


【解决方案1】:

您需要在 CSS 中使用 height 属性进行过渡

$(function(){

$("li").click(function(){
$(this).addClass("vanish");

})
});
.vanish {
  height:0;
  transition: 1s all linear;
  opacity:0;
}

li {
  height:2em;
  opacity:1;
  background:green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<ul>
<li>Click me to collapse</li>
<li>Click me to collapse</li>
<li>Click me to collapse</li>
</ul>
</div>

【讨论】:

  • 这就是我想要达到的效果,但我认为因为我是在一个Ionic2框架中,加上它的标签,所以做起来并不简单。
  • @Richard 我很遗憾听到。框架应该授权而不是阻碍开发人员
【解决方案2】:

嘿,我看还没有人回答你。查看我的 codepen,下面的相关代码亮点。也很抱歉我不得不使用 jQuery,我开始用 javascript 编写它,它是如此之大,jQuery 无需手动循环两次即可完成它(我想我只是一个菜鸟)无论如何希望这可以帮助你。

CSS

.list-item {
    display: block;
    width: 200px;
    height: 50px;
    margin-bottom: 10px;
    line-height: 50px;
    text-align: center;
    background-color: #fff;
    transition: all 0.5s ease;
}

.list-item.hide {
    height: 0;
    margin: 0;
    opacity: 0;
}

jQuery

var listItem = $('.list-item');

listItem.click(function() {
    if( listItem.hasClass('hide')) {
      listItem.removeClass('hide');
    } else {
      listItem.not(this).addClass('hide');
    }
});

http://codepen.io/StefanBobrowski/pen/QpzYQj

【讨论】:

  • 谢谢。这种作品。不幸的是,不透明的项目仍然可以点击。此外,高度是即时设置的,没有动画“折叠”效果。
  • 实际上你是对的,你必须将过渡添加到元素而不是隐藏类。如果高度为 0,但您不应该点击它们,除非您没有使用 box-sizing:border-box 并且您有填充或其他东西。
  • 我没有隐藏所有项目,只是隐藏了 5 个项目中的 4 个。我认为它们被放在了彼此之上。我是否应该将可见的 z-index 设置在最前面?
  • 从这里听起来像 javascript 逻辑问题。顺便说一句,这些是如何隐藏的?是你点击了一个按钮,还是搜索框本身,而其他的消失了?它们是如何重新出现的?
  • 它们只是被上面的css隐藏了,所以它们仍然存在,它们只是不透明的。为了让它们向下折叠(出现),我单击第一个项目。汤姆让它们折叠起来(隐藏),我滚动下面的其他项目列表。所以它基本上是一个项目列表,当你点击第一个搜索项目时,其余的展开。完成后,您滚动,然后它们折叠起来。你见过Airbnb的应用程序吗?他们的搜索列表做了类似的事情。
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 2017-07-08
  • 2014-05-03
  • 2018-06-13
  • 2018-05-22
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多