Подчеркивание тега привязки не выравнивается под текстом с анимацией выделения

#html #css #css-animations

#HTML #css #css-анимации

Вопрос:

Я пытаюсь, чтобы мой тег привязки выполнял анимацию, в которой подчеркивание выделяет текст выше при наведении на него курсора. Не уверен, почему подчеркивание так далеко слева. Есть идеи о том, что может быть причиной проблемы?

Я попытался изменить класс контейнера на position: absolute, а затем установить содержимое внутри как относительное, но это тоже не сработало.

 .section-title {
  display: block;
  font-size: 2em;
  text-align: center;
  padding-bottom: 1.5%;
  font-size: 2em;
  transform: translateX(0%) translateY(-25%);
  /* z-index: -1; */
}

.section-title-highlight {
  color: black;
}

.section-title-highlight:before {
  content: '';
  display: block;
  height: 20px;
  width: 20%;
  background: #35FCCE;
  position: absolute;
  bottom: 0;
  left: 0;
  transition: height .7s;
  z-index: -1;
}

.section-title-highlight:hover:before {
  height: 85%;
}

a {
  text-decoration: none;
  cursor: defau<
  display: block;
}

.container {
  padding-top: 3%;
  padding-left: 5%;
  padding-right: 5%;
  padding-bottom: 7%;
  margin-top: 0;
  margin-left: 5%;
  margin-right: 5%;
  margin-bottom: 5%;
  display: flex;
  flex-direction: column;
  align-items: center;
  height: 100%;
  background-color: rgb(236, 236, 236);
}

.container-item {
  display: flex;
  flex-direction: column;
}

#home {
  height: 500px;
  /* margin-bottom: 0; */
  position: relative;
}

#projects {
  height: 600px;
  position: relative;
}  
 <div class="container">
  <div id="projects">
    <a href="#" class="section-title-highlight section-title">Projects</a>
    <div class="container-item">
      <p>
        asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf
      </p>
    </div>
  </div>  

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

1. Переход, похоже, тоже не работает — это что-то, что вы пропустили в приведенном выше коде, или это просто то, над чем вы все еще работаете?

2. Это .section-title-highlight:before имеет ширину 20%… Должно ли это быть 100%?

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

4. position: absolute; вероятно, это больше головной боли, чем того стоит

5. Салем, ты можешь точно подтвердить, что ты пытаешься сделать? Я просмотрел ваш код, и не совсем ясно, как должна выглядеть подсветка — должно ли это составлять 20% в качестве отправной точки для анимации? Или во всю ширину для начала? И при чем здесь анимация?

Ответ №1:

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

Ваше выделение должно быть относительно текста в section-title-highlight , поэтому вам просто нужно сделать его относительным вот так:

 .section-title-highlight {
  position:relative;
}
  

Ваш элемент выделения теперь помещается в левом нижнем углу текста:

 .section-title-highlight:before {
  height: 2px;      /* or whatever your starting height should be */
  width: 100%;
  position: absolute;
  bottom: 0;
  left: 0;
  /* rest of your css here... */ 
}
  

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

Вы можете исправить это, сделав выделение элементом inline или inline-block . В приведенном ниже примере я сделал ваш section-title элемент блочным и оставил ваш section-title-highlight встроенным:

  <div class="section-title">
     <a class="section-title-highlight">Projects</a>
 </div>
  

Рабочий пример:

 .section-title {
  display: block;
  text-align: center;
  padding-bottom: 1.5%;
  font-size: 2em;
  transform: translateX(0%) translateY(-25%);
  /* z-index: 0; */
}

.section-title-highlight {
  position: relative;
  color: black;
}

.section-title-highlight:before {
  content: '';
  display: block;
  height: 2px;  /* or whatever height you want to start */
  width: 100%;
  background: #35FCCE;
  position: absolute;
  bottom: 0;
  left: 0;
  transition: height .7s;
  z-index: -1;
}

.section-title-highlight:hover:before {
  height: 85%;
}

a {
  text-decoration: none;
  cursor: defau<
  display: block;
}

.container {
  padding-top: 3%;
  padding-left: 5%;
  padding-right: 5%;
  padding-bottom: 7%;
  margin-top: 0;
  margin-left: 5%;
  margin-right: 5%;
  margin-bottom: 5%;
  display: flex;
  flex-direction: column;
  align-items: center;
  height: 100%;
  background-color: rgb(236, 236, 236);
}

.container-item {
  display: flex;
  flex-direction: column;
}

#home {
  height: 500px;
  /* margin-bottom: 0; */
  position: relative;
}

#projects {
  height: 600px;
  position: relative;
}  
 <div class="container">
  <div id="projects">

    <a href="#" class="section-title-highlight section-title">Projects</a>
      <p>The heading above is using a block display (as in your code), so it is appearing the full width of the container.</p>
    <div class="section-title">
      <span class="section-title-highlight">Projects</span>
    </div>
    <div class="container-item">
      <p>
        This heading is using an inline element so the highlight is only the width of the text
      </p>
    </div>
  </div>
</div>  

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

1. Большое вам спасибо. Я сходил с ума, пытаясь разобраться в этом. Приветствия!

Ответ №2:

Я получил результат, который, как я полагаю, вы ищете, просто изменив это:

 .section-title-highlight:before {
  width: 20%;
}
  

к этому:

 .section-title-highlight:before {
  width: 100%;
}
  

Обсуждение «подделки ширины текста» сводится к следующему: ваша div.projects ширина определяется шириной вашего текста. Ваша a::before ширина определяется шириной div.project . Следовательно, установка для свойства a::before width значения 100% устанавливает его в соответствии с шириной вашего текста.

Также необходимо, как вы уже догадались, абсолютно расположить a::before элемент. Если вы этого не сделаете, он будет в потоке, займет 100% своего контейнера, а затем перенесет ваш текст в следующую строку. Если вы попытаетесь удалить position: absolute из него, это станет для вас очевидным.

Изменение класса контейнера на absolute и элемента на relative только абсолютно позиционирует ваш контейнер в следующем элементе над ним в дереве DOM («иерархия контейнерства», если это имеет больше смысла), который расположен относительно. Так что нет, это не сработает.

Вот код:

     .section-title {
      display: inline-block;
      font-size: 2em;
      text-align: center;
      padding-bottom: 1.5%;
      font-size: 2em;
      transform: translateX(0%) translateY(-25%);
      /* z-index: -1; */
    }

    .section-title-highlight {
      color: black;
    }

    .section-title-highlight:before {
      content: '';
      display: inline-block;
      height: 20px;
      width: 100%;
      background: #35FCCE;
      position: absolute;
      bottom: 0;
      left: 0;
      transition: height .7s;
      z-index: -1;
    }

    .section-title-highlight:hover:before {
      height: 85%;
    }

    a {
      text-decoration: none;
      cursor: defau<
    }

    .container {
      padding: 3% 5% 7%;
      margin: 0 5% 5%;
      display: flex;
      flex-direction: column;
      align-items: center;
      background-color: rgb(236, 236, 236);
    }

    .container-item {
      display: flex;
      flex-direction: column;
    }

    #projects {
      height: 600px;
      position: relative;
    }  

    .projects-header {
      text-align: center;
    }  
   <div class="container">
    <div id="projects">
      <div class="projects-header">
        <a href="#" class="section-title-highlight section-title">Projects</a>
      </div>
      <div class="container-item">
        <p>
          Edit: the problem was that the highlight on the title would expand to be as wide as this paragraph, which was not apparent when only "asdf" was in it..
        </p>
      </div>
    </div>
  </div>  

Возможно, небольшое разъяснение position будет полезно. Значение по умолчанию для position равно static . Статически расположенные элементы размещаются везде, где они встречаются в потоке страниц, как если бы они были абзацами текста. Относительно расположенный элемент позиционируется относительно его статического положения, где top и left являются смещениями от статического положения. Итак, если, скажем, вы указали свой div.projects a top: -10px , он будет расположен на 10 пикселей выше, чем если бы у вас не было задано никакого position значения (т. Е. Тип позиции был статическим).

Элементы с абсолютным расположением располагаются внутри контейнера с относительным расположением, в top: 0 и left: 0 , если не указано иное. Таким образом, вам не обязательно иметь a top: 0 в вашем a::before стиле. У вас действительно должен быть bottom: 0 , так как в противном случае ваша строка была бы вверху текста, а не внизу.

Редактировать

Исправление (ну, мое исправление) проблемы, которую OP и FluffyKitten описывают в комментариях, потребовало двух шагов.

  1. Структура HTML была такова, что элемент привязки обрабатывался как гибкая ячейка. Таким образом, его ширина была привязана к ширине абзаца. Итак, первый шаг — обернуть тег привязки в div. (Сделано как div.project-header .)
  2. Тег привязки находился в блочном отображении, что означает, что он занимает всю ширину своего контейнера. Исправление этого состояло в том, чтобы изменить display:block стиль .section-title на display: inline-block .

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

1. Спасибо! У меня есть этот набор, но теперь ширина равна длине div, а не только ширине текста. Есть ли способ обойти это?

2. @Salem Для меня они одинаковой ширины. Возможно, у вас есть ширина, указанная для #projects , которой нет в коде, которым вы поделились? Я разместил свой код, чтобы вы могли сравнить.

3. @BobRodes Если вы добавите больше текста в контейнер, вы увидите проблему. OP описал проблему, но это не было очевидно в коде, потому что текста было недостаточно, чтобы растянуть контейнер на всю ширину. Когда в контейнер добавляется больше текста, он расширяется на всю ширину, и вы можете легче увидеть проблему

4. @FluffyKitten За что тебе спасибо. Теперь я вижу проблему. 🙂 Я посмотрю.

5. @FluffyKitten Спасибо. И исправлено. 🙂

Ответ №3:

Все, что вам нужно сделать, это не использовать своего родственника ни для чего, кроме заголовка, и все будет в порядке!

При этом используется исходный код из вопроса и изменяется ширина поля, уменьшается высота и добавляется переход от края к низу.

     .section-title {
      display: block;
      font-size: 2em;
      text-align: center;
      padding-bottom: 1.5%;
      font-size: 2em;
      transform: translateX(0%) translateY(-25%);
      /* z-index: -1; */
    }

    .section-title-highlight {
      color: black;
    }

    .section-title-highlight:before {
      content: '';
      display: block;
      height: 5px;
      width: 100%;
      background: #35FCCE;
      position: absolute;
      margin-bottom: .2em;
      bottom: 0;
      left: 0;
      transition: margin-bottom .5s , height .7s;
      z-index: -1;
    }

    .section-title-highlight:hover:before {
      height: 85%;
      margin-bottom:0;
    }

    a {
      text-decoration: none;
      cursor: defau<
      display: block;
    }

    .container {
      padding-top: 3%;
      padding-left: 5%;
      padding-right: 5%;
      padding-bottom: 7%;
      margin-top: 0;
      margin-left: 5%;
      margin-right: 5%;
      margin-bottom: 5%;
      display: flex;
      flex-direction: column;
      align-items: center;
      height: 100%;
      background-color: rgb(236, 236, 236);
    }

    .container-item {
      display: flex;
      flex-direction: column;
    }

    #home {
      height: 500px;
      /* margin-bottom: 0; */
      position: relative;
    }

    #projects {
      height: 2em;
      position: relative;
    }  
     <div class="container">
      <div id="projects">
        <a href="#" class="section-title-highlight section-title">Projects</a>
        <div class="container-item">
        </div>
      </div>
      <p>
            asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf
          </p>  

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

1. К сожалению, это не устраняет проблему, когда выделение растягивается на всю ширину контейнера — OP описал это в вопросе, но это не было очевидно в коде. Когда в контейнер добавляется больше текста, он расширяется на всю ширину, и вы можете легче увидеть проблему.

2. @FluffyKitten помогает ли это?