Наложение при наведении на vue.js - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь реализовать отображение текста при наведении на изображение в vue.js, но я немного застрял.Я пытаюсь реализовать этот пример на массиве с несколькими изображениями: https://www.w3schools.com/howto/tryit.asp?filename=tryhow_css_image_overlay_fade

Я получил довольно большой файл VUE, но здесь важно:

шаблон:

</template>

[...]

<div v-for="item in filteredPeople" v-bind:key="item.id" class="list-complete-item">
  <router-link @mouseover.native="hovertext" :to="'/'+item.link">
    <img class="list-complete-img" :src="'http://placehold.it/400x300?text='+item.id" alt>  
  </router-link>
</div>

[...]

</template>

script

<script>
export default {
  data() {
    return {
      info: [
        {
          id: 1,
          title: "Title one",
          link: "project1",
          hovertext: "project1 hover text lorem lorem lorem",
          category_data: {
            "1": "Category 1"
          }
        },
[...]
  methods: {
    hovertext() {
      console.log("");
    },

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

Я также нашел этот пример кода ручки: https://codepen.io/oliviaisarobot/pen/xzPGvY

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

Я немного растерялся.Любая помощь, как сделать это в vue?

---------- ОБНОВЛЕНИЕ ----------

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

.list-complete {display: flex;высота: авто;flex-direction: row;flex-flow: обтекание строк;}

.list-complete-item {
  flex: 0 1 50%;
  display: inline-block;
}

.list-complete-item a {
  display: inline-block;
  position: relative;
  width: 100%;
  height: auto;
  outline: 1px solid #fff;
}

.list-complete-img {
  width: 100%;
}

.text {
  color: rgb(186, 74, 74);
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  text-align: center;
}

.list-complete-item a:hover .overlay {
  opacity: 1;
}

.overlay {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  overflow: hidden;
  height: 60%;
  width: 100%;
  opacity: 0;
  transition: 0.5s ease;
  background-color: #008cba;
}

1 Ответ

0 голосов
/ 01 марта 2019

Вам не нужно использовать js (vue) события.Сделайте это с простым CSS, как в примере, на который вы ссылались.

Перейдите с этим шаблоном:

<div v-for="item in filteredPeople" v-bind:key="item.id" class="list-complete-item">
    <router-link :to="'/'+item.link">
        <img class="list-complete-img" :src="'http://placehold.it/400x300?text='+item.id" alt>
        <div class="overlay">
            <div class="text">{{ item.hovertext }}</div>
        </div>
    </router-link>
</div>

И стиль его оформления:

.list-complete-item {
    width: 400px;
    height: 300px;
    display: inline-block;
}
.list-complete-item a {
    display: inline-block;
    position: relative;
    width: 400px;
    height: 300px;
}
.list-complete-item a .image {
    display: block;
    width: 100%;
    height: auto;
}
.list-complete-item a .overlay {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    height: 100%;
    width: 100%;
    opacity: 0;
    transition: .5s ease;
    background-color: #008CBA;
}
.list-complete-item a:hover .overlay {
    opacity: 1;
}
.list-complete-item a .text {
    color: white;
    font-size: 20px;
    position: absolute;
    top: 50%;
    left: 50%;
    -webkit-transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
    text-align: center;
}

И последнийрезультат:

enter image description here

...