ПОЗИЦИОНИРОВАНИЕ STICKY CSS

#html #css

#HTML #css

Вопрос:

Точно следуя приведенному ниже примеру, может ли кто-нибудь помочь мне обработать позицию: sticky

Сегодня следующая дата позиционируется выше текущей.

Таким образом, непрозрачность и тень даты достигают 100%, создавая гротескное видение, если дат много.

Я хочу предыдущую дату, прокрутите вверх и перейдите к следующей дате.

Все в CSS

скрипка

         * {
            margin: 0px;
            padding: 0px;
        }
        
        .chat {
            overflow: auto;
            border: solid 1px black;
            position: fixed;
            left: 50%;
            top: 50%;
            background-color: #e5ddd5;
            z-index: 100;
            height: 500px;
            margin-top: -200px;
            width: 500px;
            margin-left: -300px;
        }
        
        .box {
            width: 300px;
            margin: 30px auto;
            padding: 20px;
            text-align: center;
            font-weight: 400;
            color: black;
            font-family: arial;
            position: relative;
            border-radius: 20px;
        }
        
        .box.enviado {
            background: #dcf8c6;
        }
        
        .box.recebido {
            background: white;
        }
        
        .recebido:before {
            content: "";
            width: 0px;
            height: 0px;
            position: absolute;
            border-left: 10px solid white;
            border-right: 10px solid transparent;
            border-top: 10px solid white;
            border-bottom: 10px solid transparent;
            left: 19px;
            bottom: -19px;
        }
        
        .enviado:before {
            content: "";
            width: 0px;
            height: 0px;
            position: absolute;
            border-left: 10px solid transparent;
            border-right: 10px solid #dcf8c6;
            border-top: 10px solid #dcf8c6;
            border-bottom: 10px solid transparent;
            right: 19px;
            bottom: -19px;
        }
        
        .data {
            background-color: rgba(225, 245, 254, 0.92);
            color: rgba(69, 90, 100, 0.95)!important;
            padding: 5px 12px 6px 12px!important;
            border-radius: 7.5px!important;
            box-shadow: 0 1px 0.5px rgba(0, 0, 0, 0.13)!important;
            text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4)!important;
            margin-bottom: 8px!important;
            margin-top: 8px!important;
            margin-right: auto!important;
            margin-left: auto!important;
            max-width: 75px;
            opacity: 0.8;
            z-index: 2;
        }
        
        .data {
            top: 10px;
            position: sticky;
        }  
   <html> 
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title></title>
        <meta name="description" content="sticky">
        <meta name="viewport" content="width=device-width">
    </head>
    
    <body>
        <div class="chat">
            <div class="data">05/03/2019</div>
            <div class="box recebido">Olá</div>
            <div class="box enviado">Oi, tudo bem ?</div>
            <div class="data">06/03/2019</div>
            <div class="box recebido">Tudo bem!</div>
            <div class="box recebido">e voce ?</div>
            <div class="box enviado">Tudo bem tambem</div>
            <div class="box recebido">preciso de ajuda</div>
            <div class="box recebido">Voce pode me ajudar</div>
            <div class="data">07/03/2019</div>
            <div class="box enviado">Talvez sim</div>
            <div class="box enviado">O que voce precisa</div>
            <div class="box recebido">Como posso utilizar o position:sticky ?</div>
            <div class="box enviado">Deixe-me ver</div>
            <div class="box enviado">Acho que posso te ajudar</div>
            <div class="box recebido">Certo</div>
        </div>
    </body>  
    </html>  

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

1. То, что вы видите, является ожидаемым поведением, оно делает именно то, что вы ему говорите. С sticky каждым .data элементом все они будут «прилипать» к вершине при достижении границы документа и отображаться в соответствии с их z-index порядком в DOM. Причина, по которой вы видите наложение, заключается просто в прозрачности альфа-канала на background-color и opacity наборе с вашим .data классом. Удалите их, и все будет выглядеть так, как вы задумали. Если вы хотите, чтобы предыдущий файл удалялся сам по себе, это требует больше усилий с помощью javascript.

2. Я действительно хочу, чтобы предыдущий исчез. Если действительно нужен javascript, отлично. Вы можете мне помочь?

3. К вашему СВЕДЕНИЮ caniuse.com/#feat=css-sticky

4. «Если действительно нужен javascript, отлично. Не могли бы вы мне помочь» — с удовольствием обратился бы к amigo, но сначала попробуйте сами и возвращайтесь, когда застрянете. Приветствия!

Ответ №1:

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

 * {
  margin: 0px;
  padding: 0px;
}

.chat {
  overflow: auto;
  border: solid 1px black;
  left: 50%;
  background-color: #e5ddd5;
  z-index: 100;
  height: 500px;
  width: 500px;
}

.box {
  width: 300px;
  margin: 30px auto;
  padding: 20px;
  text-align: center;
  font-weight: 400;
  color: black;
  font-family: arial;
  position: relative;
  border-radius: 20px;
}

.box.enviado {
  background: #dcf8c6;
}

.box.recebido {
  background: white;
}

.recebido:before {
  content: "";
  width: 0px;
  height: 0px;
  position: absolute;
  border-left: 10px solid white;
  border-right: 10px solid transparent;
  border-top: 10px solid white;
  border-bottom: 10px solid transparent;
  left: 19px;
  bottom: -19px;
}

.enviado:before {
  content: "";
  width: 0px;
  height: 0px;
  position: absolute;
  border-left: 10px solid transparent;
  border-right: 10px solid #dcf8c6;
  border-top: 10px solid #dcf8c6;
  border-bottom: 10px solid transparent;
  right: 19px;
  bottom: -19px;
}

.data {
  background-color: rgba(225, 245, 254, 0.92);
  color: rgba(69, 90, 100, 0.95)!important;
  padding: 5px 12px 6px 12px!important;
  border-radius: 7.5px!important;
  box-shadow: 0 1px 0.5px rgba(0, 0, 0, 0.13)!important;
  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4)!important;
  margin-bottom: 8px!important;
  margin-top: 8px!important;
  margin-right: auto!important;
  margin-left: auto!important;
  max-width: 75px;
  opacity: 0.8;
  z-index: 2;
}

.data {
  top: 10px;
  position: sticky;
}  
 <div class="chat">
  <div>
    <div class="data">05/03/2019</div>
    <div class="box recebido">Olá</div>
    <div class="box enviado">Oi, tudo bem ?</div>
  </div>
  <div>
    <div class="data">06/03/2019</div>
    <div class="box recebido">Tudo bem!</div>
    <div class="box recebido">e voce ?</div>
    <div class="box enviado">Tudo bem tambem</div>
    <div class="box recebido">preciso de ajuda</div>
    <div class="box recebido">Voce pode me ajudar</div>
  </div>
  <div>
    <div class="data">07/03/2019</div>
    <div class="box enviado">Talvez sim</div>
    <div class="box enviado">O que voce precisa</div>
    <div class="box recebido">Como posso utilizar o position:sticky ?</div>
    <div class="box enviado">Deixe-me ver</div>
    <div class="box enviado">Acho que posso te ajudar</div>
    <div class="box recebido">Certo</div>
  </div>
</div>  

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

1. Я понимаю, разделите div на дату и диалоговое окно, но для этого мне придется изменить много кода javascript, поскольку я соблазняю сервер.

2. Здравствуйте, вы можете сделать это без добавления контейнера?