Исправить положение зависшего элемента в центрированном тексте

#javascript #html #css

#javascript #HTML #css

Вопрос:

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

Посмотрите, вот пример:

     body {
      font-size: 2em;
    }
    .container {
        text-align: center;
    }

    .item:hover {
      padding-left: 0.5em;
    }  
     <div class="container">
        <span class="item">Hello</span>
        <span class="item">my</span>
        <span class="item">wonderful</span>
        <span class="item">world</span>
    </div>  

При наведении курсора на элемент вы заметите, что он меняет свое положение по оси x, но вместо этого его нужно исправить, нажимая на другие элементы.

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

1. Просто используйте это вместо: padding: 0 0.5em;

2. Что вы подразумеваете под «его нужно исправить, вместо этого подталкивая другие элементы»? Вы хотите, чтобы элементы справа также были перемещены, или все должно остаться?

3. @RoboRobok, заполнение слева влияет только на элементы слева, поэтому элементы справа должны быть там, где они есть.

4. @ChrisG, сложная часть вопроса заключается в том, что мне не нужны оба отступа, только слева.

5. мой ответ не сработал для вас? Я сохраняю фиксированный элемент наведения и перемещаю все остальные. Это также универсальное решение, если вы хотите также иметь правильное движение

Ответ №1:

Вы можете попробовать, как показано ниже, чтобы иметь оба пробела

 body {
  font-size: 2em;
}

.container {
  text-align: center;
  pointer-events:none;
}
.item {
  position:relative;
  left:0;
  transition:0.5s;
  pointer-events:initial;
}

/* previous elements: move to left */
.container:hover .item{
  left:-10px;
}
/* hovered element: don't move  */
.container .item:hover {
  left:0; 
}
/* next elements: move to right 
*/
.container .item:hover ~ *{
  left:10px;
}  
 <div class="container">
  <span class="item">Hello</span>
  <span class="item">my</span>
  <span class="item">wonderful</span>
  <span class="item">world</span>
</div>  

И только с оставленным пробелом:

 body {
  font-size: 2em;
}

.container {
  text-align: center;
  pointer-events:none;
}
.item {
  position:relative;
  left:0;
  transition:0.5s;
  pointer-events:initial;
}

.container:hover .item{
  left:-10px;
}

.container .item:hover,
.container .item:hover ~ *{
  left:0; 
}  
 <div class="container">
  <span class="item">Hello</span>
  <span class="item">my</span>
  <span class="item">wonderful</span>
  <span class="item">world</span>
</div>  

Или только правый пробел:

 body {
  font-size: 2em;
}

.container {
  text-align: center;
  pointer-events:none;
}
.item {
  position:relative;
  left:0;
  transition:0.5s;
  pointer-events:initial;
}

.container .item:hover ~ *{
  left:10px;
}  
 <div class="container">
  <span class="item">Hello</span>
  <span class="item">my</span>
  <span class="item">wonderful</span>
  <span class="item">world</span>
</div>  

Ответ №2:

Я не уверен, что правильно вас понял, но попробуйте ниже и посмотрите, дает ли это эффект, который вы ищете:

Решение

 body {
  font-size: 2em;
}

.container {
  display: flex;
  justify-content: center;
}

.item {
  padding: 0 .2rem;
  transition: padding .2s;
}

.item:hover {
  padding: 0 .5em;
}
  

Объяснение

Используя flexbox, мы можем сделать все «промежутки» гибким элементом и выровнять их по центру с помощью содержимого выравнивания (используя значение «center») на родительском элементе. Единственная проблема при этом заключается в том, что мы теряем естественное пространство слева и справа от каждого текстового элемента, поэтому я добавил небольшое количество отступов в класс item .

После наведения курсора я успешно увеличил отступы влево и вправо.

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

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

1. Спасибо за ответ, но главное здесь в том, что мне нужно только левое заполнение для зависшего элемента, у вас есть как слева, так и справа. Проверьте это здесь, зависший элемент все еще перемещается, codepen.io/interlark/pen/qBNBWKZ