Положение изменений div в зависимости от области просмотра - PullRequest
4 голосов
/ 06 марта 2019

Я пытаюсь сделать так, чтобы при нажатии на центральный круг появлялись 4 круга, очень похоже на

enter image description here.

Однако, когда я изменяю размер области просмотра, положение div меняется, как показано в коде ниже. Я пытался сделать положение относительно, но это не работает. https://codepen.io/Refath/pen/NJbEQO

Вот код, о котором идет речь:

.subOne{
    position: relative;
    top: -200px;
    left: 445px;
}

.subTwo{
    position: relative;
    top: -650px;
    left: 445px;
}

.subThree{
    position: relative;
    top: -570px;
    left: 255px;
}

.subFour{
    position: relative;
    top: -670px;
    left: 650px;
}

Одна из моих идей заключалась в том, чтобы обернуть подкруги в отдельный контейнерный блок и перевести контейнер на основе области просмотра, хотя я не уверен, насколько это возможно.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Вы можете использовать проценты вместо пикселей, чтобы получить макет.Но я бы сделал это с небольшим изменением разметки и использованием упаковочного флексбокса примерно так:

  1. Переместите ваши круги в псевдоэлемент иих hover стили.

  2. Поместите один круг в первый ряд, три во второй (включая mainCircle) и один впоследняя строка - используйте order свойство для , порядок и flex-basis для количества кружков в каждой строке.

  3. Вы можете использовать margin: 0 autoцентрировать каждый круг в их пространстве.А также добавьте align-content: space-around для равномерного выравнивания.

  4. Теперь все, что вы можете настроить относительных расстояний, изменяя height и widthsubContainer.

См. Демонстрацию ниже:

$(document).ready(function() {
  $(".subOne").hide();
  $(".subTwo").hide();
  $(".subThree").hide();
  $(".subFour").hide();
  $(".mainCircle").bind('click', function() {
    $(this).toggleClass('blue');
    $(".subOne").slideToggle('fast');
    $(".subTwo").slideToggle('fast');
    $(".subThree").slideToggle('fast');
    $(".subFour").slideToggle('fast');
  });
});
body {
  overflow-y: none;
}

.container {
  background: coral
}

.subContainer {
  display: flex;
  align-items: center;
  justify-content: center;
  align-content: space-around;
  flex-wrap: wrap;
  height: 97vh;
  height: 500px; /* ADJUST THIS */
  width: 500px;  /* ADJUST THIS */
  margin: 0 auto;
  background: coral;
}

.mainCircle,
.subOne,
.subTwo,
.subThree,
.subFour {
  flex: 0 0 auto;
}

.mainCircle:after,
.subOne:after,
.subTwo:after,
.subThree:after,
.subFour:after {
  content: '';
  display: block;
  border: 2px red solid;
  height: 100px;
  width: 100px;
  margin: 0 auto;
  border-radius: 100px;
  background: blue;
  transition: 0.3s ease all;
}

.mainCircle:hover:after {
  background: lightblue;
  transition: 0.3s ease all;
}

.blue:after {
  border: 10px black solid;
}

.subOne {
  order: 1;
  flex-basis: 100%;
}

.subTwo {
  order: 2;
  flex-basis: 33.33%;
}

.mainCircle {
  order: 3;
  flex-basis: 33.33%;
}

.subThree {
  order: 4;
  flex-basis: 33.33%;
}

.subFour {
  order: 5;
  flex-basis: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
  <div class="subContainer">
    <div class="mainCircle"></div>
    <div class="subOne"></div>
    <div class="subTwo"></div>
    <div class="subThree"></div>
    <div class="subFour"></div>
  </div>
</div>
1 голос
/ 06 марта 2019

При position: relative на окружающих элементах и ​​позиционировании в пикселях вы не получите адаптивный макет.

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

Во-вторых, позиционированный элемент с top: -670px; left: 650px; может выглядеть хорошо на более широких экранах, но далеко за пределами области просмотра на меньших экранах.Это также портит ваше выравнивание.

Вместо этого удалите окружающие элементы из обычного потока с помощью position: absolute, сделайте их относительно их контейнера (с position: relative) и используйте процентную длину для адаптивности.

пересмотренная кодовая ручка

$(document).ready(function() {

  $(".subOne").hide();
  $(".subTwo").hide();
  $(".subThree").hide();
  $(".subFour").hide();


  $(".mainCircle").bind('click', function() {
    $(this).toggleClass('blue');
    $(".subOne").slideToggle('fast');
    $(".subTwo").slideToggle('fast');
    $(".subThree").slideToggle('fast');
    $(".subFour").slideToggle('fast');

  });

});
body {
  margin: 0;
}

.container {
  position: relative;
}

.subContainer {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  background: coral;
}

.mainCircle,
.subOne,
.subTwo,
.subThree,
.subFour {
  border: 2px red solid;
  height: 100px;
  width: 100px;
  border-radius: 100px;
  background: blue;
  transition: 0.3s ease all;
}

.subOne {
  position: absolute;
  top: 20%;
  left: 50%;
  transform: translate(-50%, -50%); /* see link below for explanation */
}

.subTwo {
  position: absolute;
  bottom: 20%;
  left: 50%;
  transform: translate(-50%, 50%);
}

.subThree {
  position: absolute;
  top: 50%;
  left: 20%;
  transform: translate(-50%, -50%);
}

.subFour {
  position: absolute;
  top: 50%;
  right: 20%;
  transform: translate(50%, -50%);
}

.mainCircle:hover {
  background: lightblue;
  transition: 0.3s ease all;
}

.blue {
  border: 10px black solid;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
  <div class="subContainer">
    <div class="mainCircle"></div>
  </div>
  <div class="subOne"></div>
  <div class="subTwo"></div>
  <div class="subThree"></div>
  <div class="subFour"></div>
</div>

Подробнее: Элемент не будет оставаться в центре, особенно при изменении размера экрана

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...