проблема при попытке отобразить результаты поиска YouTube с разной высотой

Я занят базовым приложением для YouTube-плеера, использующим angular4.x. Я использую компонент мгновенного поиска с использованием rxjs, который делает запрос, когда поле ввода изменяется после 400 мс без изменения ...

Сначала я попытался отобразить результаты поиска в div col-md-4, чтобы в каждой строке было по три результата. Затем у меня возникла проблема, когда некоторые эскизы или текст некоторых результатов поиска имели разную высоту, а затем переносились на следующую строку ...

Затем я применил стиль flexbox к результатам поиска, и это кажется лучше, однако некоторые эскизы всегда отсутствуют, и теперь у меня есть только два результата поиска на строку, где определенно есть место для 3-4.

Любая идея, как я могу заставить это работать / почему некоторые эскизы видео не отображаются (даже если они были возвращены API YouTube)?

мой шаблон результатов поиска:

<div class="eqrow">
    <div class="col-md-4">
        <div class="thumbnail">
            <img src="{{result.thumbnailUrl}}">
            <button class="btn btn-default" (click)="play(result.id, result.title)">
                <span class="glyphicon glyphicon-play"></span><span class="sr-only">
                    Play</span>
            </button>    
            <div class="caption">
                <h6>{{result.title}}</h6>
            </div>
        </div>
    </div>
</div>

мой стиль eqrow:

.eqrow {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  flex-wrap: wrap;
}
.eqrow > [class*='col-'] {
  display: flex;
  flex-direction: column;
}

мой поисковый компонент:

import {  Component, OnInit, Output, EventEmitter, ElementRef } from '@angular/core';    
import { FormControl } from '@angular/forms';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/debounceTime';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/distinctUntilChanged';

import { RestService } from '../../services/rest.service';
import { SearchResult } from '../../models/search-result.model';

@Component({
  selector: 'app-search-box',
  template: `
    <input type="text" class="form-control" placeholder="Search" [formControl]="term">
  `
})
export class SearchBoxComponent implements OnInit {
  term = new FormControl(); 
  @Output() loading: EventEmitter<boolean> = new EventEmitter<boolean>();
  @Output() results: EventEmitter<SearchResult[]> = new EventEmitter<SearchResult[]>();

  constructor(private restService: RestService) { }

  ngOnInit(): void {
        this.term.valueChanges.debounceTime(400)
        .distinctUntilChanged()
        .do(() => this.loading.emit(true))         // enable loading
        .switchMap(term => this.restService.search(term))
        .subscribe(
        (results: SearchResult[]) => {
            this.loading.emit(false);
            this.results.emit(results);
        },
        (err) => { 
          console.log(err);
          this.loading.emit(false);
        },
        () => { 
          this.loading.emit(false);
        });
  }
}

person user2094257    schedule 24.08.2017    source источник
comment
"col-md-4" исходит из Bootstrap? ... если да, то какая версия? ... также, скорее всего, класс "col-md-4" будет мешать свойствам гибкости, поэтому я рекомендую удалить один или другой.   -  person Ason    schedule 24.08.2017
comment
@LGSon Я исправил этот тег (его не было в моем фактическом коде только в stackOverflow) ... Да, это bootstrap 3.x   -  person user2094257    schedule 24.08.2017
comment
Затем попробуйте изменить их на собственное имя и использовать как классы гибкости. Сочетание Bootstrap 3.x с Flexbox может быть не такой уж хорошей идеей. Другой вариант - использовать Boostrap 4, основанный на Flexbox.   -  person Ason    schedule 24.08.2017
comment
Когда я удаляю col-md-4 из начальной загрузки, промежуток между двумя столбцами исчезает, но это все еще только два столбца, где я бы предпочел три меньших эскиза в строке. И все же некоторые эскизы отсутствуют ...   -  person user2094257    schedule 24.08.2017
comment
Если вы можете предоставить образец рабочего кода, демонстрирующий именно это, я смогу предложить решение. ... если не фрагмент стека, то скрипка или код подойдут   -  person Ason    schedule 24.08.2017
comment
Образец кода чего? Вам нужно увидеть больше, чем указано выше?   -  person user2094257    schedule 24.08.2017
comment
Какую именно версию Bootstrap 3.x вы используете? ... дай мне ссылку   -  person Ason    schedule 24.08.2017
comment
бутстрап: 3.3.7,   -  person user2094257    schedule 24.08.2017
comment
Написал ответ. Дайте мне знать, если это будет полезно, и я добавлю объяснение, как это работает   -  person Ason    schedule 24.08.2017
comment
Поскольку я не получил ответа, я удалил свой ответ.   -  person Ason    schedule 30.08.2017
comment
@LGSon Я прокомментировал ваш ответ. Странно интересно, что случилось, не могли бы вы добавить это еще раз? Извините за это и еще раз спасибо за все ваши усилия.   -  person user2094257    schedule 31.08.2017
comment
Я восстановил ответ. Вы сделали комментарий, а затем я добавил комментарий, который, как я имел в виду, вы не ответили, и, поскольку вы не ответили, и у меня был ответ, который, как мне показалось, был неполным, я удалил его. Итак, если бы вы могли ответить на мой последний комментарий, мы могли бы обновить и принять ответ, а также сказать больше, чем Будет ли это началом, чему я не очень доволен :)   -  person Ason    schedule 31.08.2017


Ответы (1)


Я заменил класс col-md-4, который является классом Bootstrap, который может мешать свойствам Flexbox, на my-col.

Вместе с добавленными justify-content: space-between (до eqrow) и flex-basis: 30% в my-col мы создаем промежуток между элементами, и по умолчанию они будут иметь одинаковую высоту для каждой строки, поскольку _7 _ / _ 8_ по умолчанию stretch.

Затем, также сделав, то есть гибкие элементы my-col гибкие контейнеры (вложенные Flexbox), можно дополнительно управлять их дочерними элементами, используя свойства Flexbox, которые снова могут быть как гибкими элементами, так и гибкими контейнерами.

Демонстрация скрипта

.eqrow {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}
.eqrow .my-col {
  flex-basis: 30%;
  margin-bottom: 10px;
  display: flex;
  flex-direction: column;
  border: 1px dotted gray;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<div class="eqrow">
    <div class="my-col">
        <div class="thumbnail">
            <img src="{{result.thumbnailUrl}}">
            <button class="btn btn-default" (click)="play(result.id, result.title)">
                <span class="glyphicon glyphicon-play"></span><span class="sr-only">
                    Play</span>
            </button>    
            <div class="caption">
                <h6>{{result.title}}</h6>
            </div>
        </div>
    </div>
    <div class="my-col">
        <div class="thumbnail">
            <img src="{{result.thumbnailUrl}}">
            <button class="btn btn-default" (click)="play(result.id, result.title)">
                <span class="glyphicon glyphicon-play"></span><span class="sr-only">
                    Play</span>
            </button>    
            <div class="caption">
                <h6>{{result.title}}</h6>
            </div>
        </div>
    </div>
    <div class="my-col">
        <div class="thumbnail">
            <img src="{{result.thumbnailUrl}}">
            <button class="btn btn-default" (click)="play(result.id, result.title)">
                <span class="glyphicon glyphicon-play"></span><span class="sr-only">
                    Play</span>
            </button>    
            <div class="caption">
                <h6>{{result.title}}</h6>
            </div>
        </div>
    </div>
    <div class="my-col">
        <div class="thumbnail">
            <img src="{{result.thumbnailUrl}}">
            <button class="btn btn-default" (click)="play(result.id, result.title)">
                <span class="glyphicon glyphicon-play"></span><span class="sr-only">
                    Play</span>
            </button>    
            <div class="caption">
                <h6>{{result.title}}</h6>
            </div>
        </div>
    </div>
    <div class="my-col">
        <div class="thumbnail">
            <img src="{{result.thumbnailUrl}}">
            <button class="btn btn-default" (click)="play(result.id, result.title)">
                <span class="glyphicon glyphicon-play"></span><span class="sr-only">
                    Play</span>
            </button>    
            <div class="caption">
                <h6>{{result.title}}</h6>
            </div>
        </div>
    </div>
    <div class="my-col">
        <div class="thumbnail">
            <img src="{{result.thumbnailUrl}}">
            <button class="btn btn-default" (click)="play(result.id, result.title)">
                <span class="glyphicon glyphicon-play"></span><span class="sr-only">
                    Play</span>
            </button>    
            <div class="caption">
                <h6>{{result.title}}</h6>
            </div>
        </div>
    </div>
</div>

person Ason    schedule 24.08.2017
comment
Спасибо за все ваши усилия. По большей части это работает, однако видео с разной высотой по-прежнему являются проблемой, поскольку выравнивание все еще отключено ... Также все еще отсутствуют эскизы, но я думаю, что это может быть связано с функцией мгновенного поиска ... Любая идея, как я могу пойти о работе с видео с разной высотой миниатюр? - person user2094257; 24.08.2017
comment
@ user2094257 Если вы можете предоставить реальный результат поиска, чтобы я мог видеть то, что вы видите, я мог бы определить, что пошло не так - person Ason; 24.08.2017
comment
@LGSonSorry, я, должно быть, пропустил ваш комментарий. Что вы имеете в виду под реальным результатом поиска? например когда я ищу музыку, я получаю список результатов, но иногда замечаю, например, первая миниатюра отсутствует, но если я повторю поиск, она появится. - person user2094257; 31.08.2017
comment
@ user2094257 Что в таком случае должно означать, что предложенное мной решение действительно работает, не так ли? Кроме того, время от времени отсутствует эскиз ... и если это так, и поскольку отсутствующий эскиз не имеет ничего общего с моим решением, Буду признателен, если вы также примете ответ, и я обновлю его, добавив немного дополнительной информации о том, что я сделал. - person Ason; 31.08.2017
comment
@ user2094257 Спасибо. Я сейчас на работе и обновлю ответ, как только вернусь. Если у вас есть дополнительные вопросы, просто напишите мне здесь, и я сделаю все возможное, чтобы помочь вам. - person Ason; 31.08.2017