2 votes

Comment faire glisser une div pour remplir une autre div ?

J'aimerais créer une boîte de nouvelles qui commence par un titre sur une image de fond mais, lorsque l'utilisateur passe la souris dessus, le titre et la description de la nouvelle remplissent l'image de fond, comme les blocs de nouvelles. aquí .

Voici ce que j'ai bricolé :

$(document).ready(function() {
  $('.thumb-box').hover(function() {
    $(this).find('.news-item').removeClass('only-title')
    $(this).find('.news-item').addClass('title-and-desc');
    $(this).find('.desc-on-image').removeClass('hidden');
  }, function() {
    $(this).find('.news-item').removeClass('title-and-desc');
    $(this).find('.news-item').addClass('only-title');
    $(this).find('.desc-on-image').addClass('hidden');
  });
});

.image-container {
  position: relative;
  text-align: center;
  color: white;
}

.thumb-box {
  width: 300px;
  height: 240px;
  background-size: cover;
  background-repeat: no-repeat;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  margin-bottom: 20px;
}

.only-title {
  color: black;
  background: rgba(255, 255, 255, .9);
  margin: 0;
  padding: 1em 1em 1em 1em;
  cursor: pointer;
}

.title-and-desc {
  color: black;
  background: rgba(255, 255, 255, .9);
  margin: 0;
  padding: 1em 1em 1em 1em;
  cursor: pointer;
  animation-name: draw-up;
  animation-duration: 1s;
}

@keyframes draw-up {
  from {
    padding: 1em 1em 1em 1em;
  }
  to {
    padding: 1em 1em 8em 1em;
  }
}

.clickable {
  cursor: pointer;
}

.news-title {
  color: black;
}

.news-title a {
  color: black;
}

.news-title a:hover {
  color: black;
  text-decoration: none;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="thumb-box img-responsive" style="background-image: url(/path/to/photo">
  <div class="news-item only-title">
    <a class="news-title" href="stackoverflow.com/article/{{$a.Slug}}">
      <h4><strong> {{$a.Title}} </strong> </h4>
      <div class="desc-on-image hidden">
        {{$a.Teaser}} ...
      </div>
    </a>
  </div>
</div>

Le problème est double :

  1. Il est un peu instable. Les boîtes sautent un peu lorsque la souris arrive dessus sous certains angles.

  2. Le div superposé descend dès qu'il glisse vers le haut.

Je me demande comment je peux corriger ces problèmes, ou comment avoir une solution plus robuste pour faire la même fonction ?

4voto

Shameless Points 1531

Positionnement relatif , overflow : hidden , Positionnement absolu et transition

Cela peut être mis en œuvre sans utiliser javascript ou Jquery.

La division extérieure container est donné position : relative y overflow : hidden .

Donc, tout ce qui est à l'intérieur du container et a plus de largeur ou plus de hauteur que container ou peut-être placé à l'extérieur de la container relativement, alors il a survolé le site container et reste caché .

Maintenant, nous utilisons position : absolue pour placer le slider absolument avec une certaine distance de top c'est-à-dire 100px. Donc, maintenant, il déborde de son div parent. container . Mais il est caché à cause de overflow : hidden sur son div parent container .

Maintenant, en utilisant le css combinateur d'enfants à chaque fois que le div parent container est survolé, nous faisons glisser le slider en utilisant transition .

.container{
  position:relative;
  background-image:url(https://picsum.photos/400);
  height:200px;
  width:300px;
  cursor:pointer;
  overflow:hidden;
}
.slider{
  position:absolute;
  top:100px;
  width:100%;
  height:200px;
  background:rgba(255,255,255,0.7);
  transition: top 1s;
}
.container:hover > .slider{
  top:0;
}

<div class='container'>
  <div class='slider'>
    <h1>I will Slide</h1>
    <p>My content</p>
    <p>My content</p>
    <p>My content</p>
  </div>
</div>

2voto

Temani Afif Points 69370

Vous pouvez simplifier votre code en utilisant simplement la transition CSS.

Voici un exemple où vous pouvez facilement ajuster la propriété CSS pour obtenir l'effet désiré.

.image-container {
  position: relative;
  text-align: center;
  color: white;
}

.thumb-box {
  width: 300px;
  height: 200px;
  background-size: cover;
  background-repeat: no-repeat;
  position:relative;
  overflow:hidden;
}

.only-title {
  color: black;
  background: rgba(255, 255, 255, .9);
  margin: 0;
  padding: 1em 1em 1em 1em;
  cursor: pointer;
  position:absolute;
  transition:1s;
  top:60%;
  height:100%;
  left:0;
  right:0;
}
.thumb-box:hover .only-title {
  top:0;
}

<div class="thumb-box img-responsive" style="background-image: url(https://lorempixel.com/400/200/)">
  <div class="news-item only-title">
    <a class="news-title" href="#">
      <h4><strong> title</strong> </h4>
      <div class="desc-on-image hidden">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ornare placerat placerat. Sed id nulla odio. Morbi lacinia ultrices velit, faucibus commodo torto
      </div>
    </a>
  </div>
</div>

1voto

Tim S. Points 102

Solution css pure

.news-container{
  overflow: hidden;
  padding: 10px;
}

.news-item{
  position: relative;
  width: 220px;
  height: 240px;
  float: left;
  background-size: cover;
  overflow: hidden;
  margin: 10px;
}

.news-item:after{
  content: '';
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  background: #fff;
  z-index: 0;
  opacity: 0;
  transition: 0.7s;
}

.news-item > img{
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
}

.news-description{
  position: absolute;
  width: 100%;
  height: 100%;
  top: -60px; /* this sets the visible part's height */
  margin-top: 100%;
  z-index: 1;
  transition: 0.3s;
  background: rgba(255,255,255,0.8);
}

.news-description h5{
  display: block;
  height: 80px; /* this is the hight of the title */
  overflow: hidden;
  padding: 10px;
  margin: 0;
  font-weight: bold;
}

.news-description p{
  padding: 10px;
  font-size: 14px;
}

.news-item:hover .news-description{
  top: 0;
  margin-top: 0;
}

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="news-container">

  <div class="news-item" style="background-image: url(https://picsum.photos/200/360/?random)">
    <div class="news-description">
      <h5>News One</h5>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer iaculis laoreet sapien ac auctor.</p>
    </div>
  </div>

  <div class="news-item" style="background-image: url(https://picsum.photos/200/400/?random)">
    <div class="news-description">
      <h5>News Two With A Slightly Longer Title</h5>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer iaculis laoreet sapien ac auctor.</p>
    </div>
  </div>

  <div class="news-item">
    <img src="https://picsum.photos/220/400/?random)" alt="" />
    <div class="news-description">
      <h5>News Item With img Tag</h5>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer iaculis laoreet sapien ac auctor.</p>
    </div>
  </div>
</div>

EDITAR

Ajout d'images à .news-item comme un style css en ligne. Dans la feuille de style, j'ai également ajouté background-size: cover; para .news-item .

Ajouté img étiquette à l'intérieur .news-item et les règles css correspondantes comme autre moyen d'ajouter des images.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X