Заполнение элемента-оболочки / родительского элемента работает не так, как ожидалось

#javascript #css

#javascript #css

Вопрос:

введите описание изображения здесь Я использую react, и у меня есть этот компонент piano (из внешней библиотеки), который реагирует. В моем приложении у меня есть 3 разных «уровня», которые приводят к разным диапазонам этого пианино, что означает, что горизонтальная длина пианино изменяется в зависимости от уровня (сложнее означает более широкий диапазон).

Я обернул отзывчивое пианино с помощью piano-div.

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

Я хочу, чтобы высота piano-div была одинаковой, поэтому кнопки уровня не будут перемещаться при переключении между ними. Но я также хочу, чтобы пианино как можно больше покрывало страницу по горизонтали (с небольшим пробелом по бокам).Я подошел к этому, добавив дополнение:

 .piano-div {
  position: relative;
  padding: 8% 30%;
}

.responsive-piano{
  position: absolute;
  top: 45%;
  -ms-transform: translateY(-45%);
  transform: translateY(-45%);
}
 

Проблема в том, что он пропорционален для «простого» уровня, но остальные 2 слишком малы, и они действительно могут идти дольше по горизонтали. Я пытался играть с заполнением / полями нескольких задействованных элементов, но ничего не получалось (отзывчивое пианино действительно портится, если вы его касаетесь).

Я также попытался выполнить манипуляции с DOM и изменить заполнение в соответствии с выбранным уровнем на основе этого css:

 .piano-div {
  position: relative;
}

.piano-div.easy {
  padding: 8% 30%;
}

.piano-div.hard {
  padding: 8% 5%;
}

.piano-div.crazy {
  padding: 8% 5%;
}
 

К сожалению, это работает не гладко, при переключении с простого на жесткий, пианино перемещается влево:
введите описание изображения здесь
Если я перемещаю всю страницу, она немного «обновляется», а затем выглядит нормально:
введите описание изображения здесь
Но, очевидно, я хочу, чтобы это работало без перемещения страницы 🙂

Есть идеи, как это исправить? Или, может быть, идея для другого подхода?

Обновить:

Это соответствующий HTML-код:

App.js:

 <div className={"piano-div "   currGame.level}>
                  <ResponsivePiano className='responsive-piano' noteRange={LevelConf[currGame.level].noteRanges}
                  handleGuess={this.handleGuess} activeNotes={winningChord.activeNotes} audioContext={audioContext}/>
                </div>
 

ResponsivePiano.js:

 function ResponsivePiano(props) {
  const { noteRange, handleGuess, activeNotes, audioContext } = props;
  return (
    <DimensionsProvider>
      {({ containerWidth, containerHeight }) => (
        <SoundfontProvider
          instrumentName="acoustic_grand_piano"
          audioContext={audioContext}
          hostname={soundfontHostname}
          handleGuess={handleGuess}
          render={({ isLoading, playNote, stopNote }) => (
            <Piano
              noteRange={noteRange}
              width={containerWidth}
              playNote={playNote}
              stopNote={stopNote}
              disabled={isLoading}
              activeNotes={activeNotes}
              {...props}
            />
          )}
        />
      )}
    </DimensionsProvider>
  );
}
 

Комментарии:

1. К вашему сведению, полезно, что вы включили много изображений, но для кода (HTML) лучше предоставлять текст, а не изображение, чтобы другие могли копировать текст при ссылке на него, а не вводить его. Что произойдет, если вы попытаетесь изменить width значение в style атрибуте ReactPiano div?

2. @vasia спасибо за ответ! Я не думал, что HTML-код имеет такое большое значение, но я добавил его сейчас к вопросу. Что касается ширины, я тоже пытался поиграть с этим, но это влияет на высоту, поэтому кнопки уровней перемещаются… Вот почему я подумал, что должен обернуть его в piano-div и внести в него изменения. Вы имели в виду что-то еще?

3. В контексте CSS «отзывчивый» означает не то, что вы думаете. Где ваши медиа-запросы? «Отзывчивый» не означает «изменения в зависимости от сложности игрового уровня».

4. @Dai на самом деле это из демо-версии react-piano, они используют пакет react-dimensions, который делает его отзывчивым в стиле css, насколько я понимаю. Но в этой демонстрации они используют все пианино как ширину 100%, а высота изменяется соответствующим образом (диапазон фортепиано не меняется). Я бы хотел, чтобы он был одинаковой высоты (при переключении между разными диапазонами фортепиано) и с небольшим пробелом по бокам… Я использовал адаптивную опцию, чтобы, если я останусь с тем же диапазоном фортепиано и укорачиваю страницу по горизонтали, пианино тоже реагировало

Ответ №1:

Вместо этого я бы выбрал flexbox.

 .piano-div {
  display: flex,
  justify-content: center,
  align-items: center
}
 

Таким образом, ваш компонент piano всегда будет центрирован по вертикали и горизонтали.

Комментарии:

1. Это отлично подходит для центрирования, но высота все равно меняется, поэтому кнопки уровня продолжают перемещаться вверх и вниз при переключении между ними

2. Похоже, что кнопки должны быть в родительском компоненте, а клавиатура — в дочернем. Таким образом, вам не придется повторно отображать кнопки, и вы можете установить для них абсолютную позицию.