Ngăn chặn div cuộn lên khi bị va chạm bởi div bên dưới nó?


10

Tôi đã hỏi một câu hỏi tương tự ngày hôm qua nhưng giải thích nó không tốt và không chỉ rõ mong muốn của tôi về giải pháp CSS thuần túy, điều mà tôi nghĩ là có thể, vì vậy tôi đang thử lại.

Về cơ bản, tôi có một vấn đề trong đó tôi có một div các tin nhắn có thể cuộn và một trường nhập liệu bên dưới nó. Khi tôi nhấp vào nút, tôi muốn trường đầu vào được tăng lên 100 pixel, mà không cần cuộn div tin nhắn.

Dưới đây là một câu đố thể hiện toàn bộ vấn đề

Như bạn có thể thấy, khi bạn nhấp vào nút "thêm lề", các thông báo div cũng cuộn lên. Tôi muốn nó ở lại nơi nó được. Tương tự, nếu bạn hơi cuộn lên để bạn chỉ có thể thấy tin nhắn thứ hai đến tin nhắn cuối cùng, nhấp vào nút sẽ giữ nguyên vị trí đó khi nhấp.

Điều thú vị là hành vi này "đôi khi" được bảo tồn. Ví dụ: trong một số trường hợp (mà tôi không thể suy luận được), vị trí cuộn được giữ lại. Tôi chỉ muốn nó luôn cư xử như vậy.

window.onload = function(e) {
  document.querySelector(".messages").scrollTop = 10000;
};

function test() {
  document.querySelector(".send-message").classList.toggle("some-margin");
}
.container {
     width: 400px;
     height: 300px;
     border: 1px solid #333;
     display: flex;
     flex-direction: column;
}
 .messages {
     overflow-y: auto;
     height: 100%;
}
 .send-message {
     width: 100%;
     display: flex;
     flex-direction: column;
}
 .some-margin {
     margin-bottom: 100px;
}
<div class="container">
   <div class="messages">
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
   </div>
   <div class="send-message">
      <input />
   </div>
</div>
<button onclick="test()">add margin</button>

nhập mô tả hình ảnh ở đây


1
Xin chào lần nữa, tôi là người đã trả lời câu hỏi của bạn bằng cách sử dụng JS. Tôi muốn thông báo cho bạn về một điều mà bạn có thể đã giải thích sai. Bạn đã đề cập: các thông điệp div cũng cuộn lên . Trên thực tế, nó không phải divlà cuộn lên, đó là chiều cao của div đang giảm. Vậy tại sao điều này lại quan trọng? Vâng, điều đó có nghĩa là việc scrollbarkhông điều chỉnh vị trí của nó. Thanh cuộn chỉ ghi nhớ vị trí của nó so với đỉnh của thùng chứa. Khi chiều cao của div giảm xuống, có vẻ như thanh cuộn đang cuộn lên, nhưng thực tế không phải vậy.
Richard

1
Bài đăng của bạn có ý nghĩa hoàn hảo (theo nghĩa mọi người biết bạn muốn kết quả gì), nhưng tôi chỉ chia sẻ điều gì đó trong trường hợp kiến ​​thức không rõ ràng với bạn (trong trường hợp nó có thể giúp bạn đưa ra ý tưởng để giải quyết vấn đề đã nói) ;-)
Richard

Vâng rất đúng, cảm ơn đã làm rõ. Nó chỉ "trông" giống như nó đang cuộn lên, bởi vì bạn không thể thấy nội dung thấp hơn bạn từng có thể. Trong thực tế, vị trí cuộn không thay đổi. Một chút ảo ảnh. Vâng, điều đó có thể giúp đưa ra một giải pháp.
Ryan Peschel

Câu trả lời:


5

Đây là một giải pháp hài hước mà bạn có thể thích.

Những gì chúng ta biết về div chỉ giữ vị trí trên cùng của thanh cuộn, vì vậy nếu chiều cao thay đổi do bất kỳ lý do nào thì thanh cuộn sẽ giữ nguyên và đây là nguyên nhân gây ra sự cố của bạn.

Khi giải quyết, bạn có thể lật .messages180 độ bằng cách sử dụng transform: rotate(180deg) scaleX(-1);và lật ngược lại .messageđể hủy lật nội dung sau đó div sẽ tự động duy trì thanh cuộn dưới cùng (trên cùng).

function test() {
  document.querySelector(".send-message").classList.toggle("some-margin")
}
.container {
  width: 400px;
  height: 300px;
  border: 1px solid #333;
  display: flex;
  flex-direction: column;
}

.messages {
  overflow-y: auto;
  height: 100%;
  transform: rotate(180deg) scaleX(-1);
}

.message
{
  transform: rotate(180deg) scaleX(-1);
}
.send-message {
  width: 100%;
  display: flex;
  flex-direction: column;
}

.some-margin {
  margin-bottom: 100px;
}
<div class="container">
  <div class="messages">
  <div class="message">hello1</div>
  <div class="message">hello2</div>
  <div class="message">hello3</div>
  <div class="message">hello4</div>
  <div class="message">hello5</div>
  <div class="message">hello6</div>
  <div class="message">hello7</div>
  <div class="message">hello8</div>
  <div class="message">hello9</div>
  <div class="message">hello10</div>
  <div class="message">hello11</div>
  <div class="message">hello12</div>
  <div class="message">hello13</div>
  <div class="message">hello14</div>
  <div class="message">hello15</div>
  <div class="message">hello16</div>
  <div class="message">hello17</div>
  <div class="message">hello18</div>
  <div class="message">hello19</div>
  <div class="message">hello20</div>
  </div>
  <div class="send-message">
  <input />
  </div>
</div>

<button onclick="test()">add margin</button>


Điều này có vấn đề khi cuộn con lăn quay ngược (cuộn lên xuống và cuộn xuống đi lên)
Ryan Peschel

Ok tôi đã dành rất nhiều thời gian cho việc này nhưng hiện tại các nhà phát triển khác có 3 câu trả lời mà bạn không tìm kiếm :) Tôi hy vọng sẽ giúp bạn chúc bạn may mắn. nhưng như một lời khuyên, người dành thời gian cố gắng trả lời câu hỏi của bạn, bạn sẽ không bị buộc tội khi làm điều đó.
Basil

2
Điều chắc chắn. Dù sao cũng cảm ơn
Ryan Peschel

Điều này rất thông minh ;-) Thật không may, cuộn ngược lại là một chút tắt.
Richard

3

Hoạt động bình thường của thanh cuộn ở trên cùng, vì vậy khi bạn đặt nó ở dưới cùng khi tải trang, bạn phải tự duy trì nó bởi vì khi nào nội dung bên dưới đẩy nó thì cuộn div sẽ di chuyển lên trên cùng.

Vì vậy, tôi có hai giải pháp cho bạn:

  1. Đảo ngược các tin nhắn bên trong div tin nhắn để tin nhắn cuối cùng sẽ là đầu tiên để cuộn sẽ luôn ở trên cùng.

  2. Tôi đã tạo một hàm javascript để cuộn xuống dưới cùng của bất kỳ phần tử nào để bạn chỉ cần gọi nó bất cứ khi nào bạn muốn cuộn xuống dưới cùng.

function scrollbottom(e)
    {
      e.scrollTop = e.clientHeight;
    }

Kiểm tra đoạn trích

var elem = document.querySelector(".messages");

window.onload = function(e){ 
  scrollbottom(elem);
}

function test() {
  document.querySelector(".send-message").classList.toggle("some-margin");
  scrollbottom(elem);
}

function scrollbottom(e)
{
  e.scrollTop = e.clientHeight;
}
.container {
  width: 400px;
  height: 300px;
  border: 1px solid #333;
  display: flex;
  flex-direction: column;
}

.messages {
  overflow-y: auto;
  height: 100%;
}

.send-message {
  width: 100%;
  display: flex;
  flex-direction: column;
}

.some-margin {
  margin-bottom: 100px;
}
<div class="container">
  <div class="messages">
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  </div>
  <div class="send-message">
  <input />
  </div>
</div>

<button onclick="test()">add margin</button>


Thật không may, tôi không muốn cuộn để chỉ cuộn xuống dưới cùng. Tôi muốn duy trì vị trí của nó. Ngoài ra, có khả năng điều này có thể được thực hiện mà không cần Javascript. Từ OP: "Tương tự, nếu bạn hơi cuộn lên để bạn chỉ có thể thấy tin nhắn thứ hai đến tin nhắn cuối cùng, nhấp vào nút sẽ giữ nguyên vị trí đó khi nhấp."
Ryan Peschel

3

Bạn có thể làm theo cách khác, bằng cách đưa chiều cao cho .messages thay vì đưa nó vào .containertrong trường hợp này, nó sẽ không ảnh hưởng đến các tin nhắn divnhưng nếu bạn đưa nó cho .containernó sẽ đẩy div của bạn vì lề nằm trong chính div có chiều cao.

Kiểm tra đoạn trích này

function test() {
  document.querySelector(".send-message").classList.toggle("some-margin");
}
.container {
  width: 400px;
  border: 1px solid #333;
  display: flex;
  flex-direction: column;
}

.messages {
  height: 300px;
  overflow-y: auto;
}

.send-message {
  width: 100%;
  display: flex;
  flex-direction: column;
}

.some-margin {
  margin-bottom: 50px;
}
<div class="container">
  <div class="messages">
  <div class="message">hello1</div>
  <div class="message">hello2</div>
  <div class="message">hello3</div>
  <div class="message">hello4</div>
  <div class="message">hello5</div>
  <div class="message">hello6</div>
  <div class="message">hello7</div>
  <div class="message">hello8</div>
  <div class="message">hello9</div>
  <div class="message">hello10</div>
  <div class="message">hello11</div>
  <div class="message">hello12</div>
  <div class="message">hello13</div>
  <div class="message">hello14</div>
  <div class="message">hello15</div>
  <div class="message">hello16</div>
  <div class="message">hello17</div>
  <div class="message">hello18</div>
  <div class="message">hello19</div>
  <div class="message">hello20</div>
  </div>
  <div class="send-message">
  <input />
  </div>
</div>

<button onclick="test()">add margin</button>


Điều này không hoạt động vì lề cần được áp dụng .send-message. Nếu bạn nhìn vào câu hỏi trước đây của tôi thì điều này được thực hiện bởi vì nó gần giống với việc mở lề từ việc mở bàn phím ảo trên thiết bị di động (đáy lề chỉ là thay thế 1: 1 để gỡ lỗi cho giải pháp)
Ryan Peschel

3

Cách giải quyết đơn giản là thiết lập scrollTopchuyển đổi trước đó . Ở đây tôi đang sử dụng tập dữ liệu để lưu trữ scrollTopgiá trị trước đó , bạn có thể sử dụng biến.

window.onload = function(e) {
  document.querySelector(".messages").scrollTop = 10000;
}

function test() {
  let state = document.querySelector(".send-message").classList.toggle("some-margin")
  let div = document.querySelector(".messages");

  if (state) {
    div.dataset.top = div.scrollTop;
    div.scrollTop += 100 // same as margin-bottom of .some-margin
  } else {
    div.scrollTop = div.dataset.top;
  }
}
.container {
  width: 400px;
  height: 300px;
  border: 1px solid #333;
  display: flex;
  flex-direction: column;
}

.messages {
  overflow-y: auto;
  height: 100%;
}

.send-message {
  width: 100%;
  display: flex;
  flex-direction: column;
}

.some-margin {
  margin-bottom: 100px;
}
<div class="container">
  <div class="messages">
    <div class="message">hello1</div>
    <div class="message">hello2</div>
    <div class="message">hello3</div>
    <div class="message">hello4</div>
    <div class="message">hello5</div>
    <div class="message">hello6</div>
    <div class="message">hello7</div>
    <div class="message">hello8</div>
    <div class="message">hello9</div>
    <div class="message">hello10</div>
    <div class="message">hello11</div>
    <div class="message">hello12</div>
    <div class="message">hello13</div>
    <div class="message">hello14</div>
    <div class="message">hello15</div>
    <div class="message">hello16</div>
    <div class="message">hello17</div>
    <div class="message">hello18</div>
    <div class="message">hello19</div>
    <div class="message">hello20</div>
  </div>
  <div class="send-message">
    <input />
  </div>
</div>

<button onclick="test()">add margin</button>


0

Ý tôi là, sau đây là một giải pháp CSS duy nhất giải quyết chính xác ví dụ của bạn:

.some-margin{margin-bottom:100px;}

.messages{margin-top:-100px;}

nhưng tôi không nghĩ nó sẽ giúp bạn giải quyết vấn đề ban đầu về bàn phím ảo. Nhưng có lẽ điều này có thể truyền cảm hứng cho người khác đến một giải pháp.

Vấn đề chính dường như là thanh cuộn đã thực hiện chính xác những gì bạn muốn:

Duy trì vị trí của nó để nội dung được đọc gần đây nhất có thể nhìn thấy.

Ngoại trừ thanh cuộn quyết định rằng bạn muốn xem TOP của nội dung hiện có thể nhìn thấy, chứ không phải phía dưới. (Sẽ dễ dàng hơn nếu bạn sử dụng số: https://jsfiddle.net/1co3x48n/ )

Nếu bạn sẵn sàng sử dụng javascript, có tất cả các loại câu trả lời: https://www.google.com/search?q=scrollbar+always+on+bottom+css+site:stackoverflow.com

Thành thật mà nói, việc bạn có thể trải qua ~ 3 + trang này và chỉ tìm thấy câu trả lời Javascript cho tôi biết rằng bạn sẽ không tìm thấy câu trả lời chỉ có CSS, chắc chắn không phải là một trang tương thích với trình duyệt.


0

Không có giải pháp nào được cung cấp thực sự có vẻ hiệu quả. Vấn đề với việc sử dụng onFocuscho một hộp văn bản là nó sẽ không áp dụng nếu hộp văn bản đã có tiêu điểm. Tôi đã làm phiền với điều này trong nhiều giờ và giải pháp gần nhất mà tôi nghĩ ra cho đến nay là:

componentDidMount() {
  this.screenHeight = window.innerHeight;

  let chatElem = document.querySelector(".conversations-chat");

  window.addEventListener('resize', () => {
    let diff = this.screenHeight - window.innerHeight;

    chatElem.scrollTop += diff;

    this.screenHeight = window.innerHeight;      
  });
}

Tuy nhiên, điều này dường như chỉ đôi khi làm việc. Nó hoạt động 100% thời gian khi nhấp vào hộp văn bản, nhưng vì một số lý do khi đóng bàn phím ảo, nó chỉ hoạt động nếu được cuộn lên đủ. Mặt khác, nó đặt lại đến cùng một vị trí mỗi lần (gần dưới cùng, nhưng không hoàn toàn ở dưới cùng).

Không chắc chắn những gì gây ra điều đó. Tôi sẽ phải điều tra thêm vào ngày mai tôi cho rằng. Đây là một trong những gần nhất cho đến nay mặc dù.


Giống như tất cả chúng ta đã nói trong câu trả lời của mình, dường như không thể thực hiện được chỉ với CSS. (Có một vấn đề với mã JS của bạn, đó là chatElem.scrollTop không thể nhỏ hơn 0 , vì vậy nếu nó ở gần đỉnh, nó sẽ cố gắng trở thành số âm, thay vào đó là 0, khi bạn làm cho màn hình lớn hơn một lần nữa, một cuộn xuất hiện ở nơi không có trước đây.)
Eliezer Berlin

Với cùng một mã thông báo, chatElem.scrollTop không thể nhiều hơn chatElem.scrollHeight - chatElem.offsetHeight , vì vậy nó sẽ tạo ra một cuộn thêm ở nơi không có trước đây nếu bạn cố gắng làm điều đó.
Eliezer Berlin

0

Tạo một thùng chứa như trong các ví dụ trên, nhưng sau đó chỉ thay đổi CSS khi bạn bắt đầu nhập.

Tôi không đặt vị trí thanh cuộn, chỉ di chuyển toàn bộ thùng chứa thư lên trên. Vì vậy, bất kể di chuyển của bạn có thể là gì, sẽ vẫn như cũ. Ít nhất là xuống dưới, tất nhiên bạn sẽ không thể nhìn thấy các dòng ở trên cùng.

Bạn sẽ có thể điều chỉnh css theo nhu cầu của bạn. Bạn thậm chí có thể đi mà không cần JS nếu bạn sử dụng: tập trung hoặc thiết lập CSS hơi khác, hãy sáng tạo :)

function activate(){
    document.querySelector("#container").classList.toggle("active");
  }
#container{
    position:relative;
    width:300px;
    height:100vh;
    max-height:230px;
    overflow:hidden;
  }
  #messages{
    position:absolute;
    bottom:30px;
    overflow:auto;
    height:200px;
    width:100%;
    background:#eee;
  }
  #container.active #messages {
    bottom:100px;
  }
  #send-message{
    position:absolute;
    border:1px solid #ccc;
    bottom:0;
    height:28px;
  }
  #container.active #send-message{
    height:100px;
  }
<div id="container">
  <div id="messages">
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  <div class="message">hello</div>
  </div>
  <div id="send-message">
    <input id="newmessage" onclick="activate()" type="text" />
  </div>
</div>


0

bạn phải thêm document.querySelector(".messages").scrollTop = 10000;vào testchức năng khi thêm lề sau đó scrollTopkết thúc tải bạn đã đặt scrolltopvà khi bạn thêm lề hoặc xóa lề scrolltopkhông được đặt lại, hãy thay đổi tập lệnh của bạn thành như thế này

<script>
    window.onload = function(e){ 
    document.querySelector(".messages").scrollTop = 10000;
}

function test() {
    document.querySelector(".send-message").classList.toggle("some-margin")
            document.querySelector(".messages").scrollTop = 10000;
}
    </script>

0

Dường như có một vấn đề với chức năng chuyển đổi js. Tôi đã thay đổi nó thành một ẩn và hiển thị đơn giản. Ngoài ra, tôi đã thêm một chiều rộng trên thẻ đầu vào. Bạn cũng cần thêm một vị trí: tuyệt đối trên div tin nhắn gửi và dưới cùng: 0 để nó ở dưới cùng. sau đó đặt vị trí: tương đối trên container để div tin nhắn gửi vẫn ở trong container. Điều này có nghĩa là hộp chứa tin nhắn sẽ không ảnh hưởng đến chính các tin nhắn và đẩy chúng lên.

window.onload = function(e) {
  document.querySelector(".messages").scrollTop = 10000;
};

function test() {
  var x = document.querySelector(".send-message");

  if (x.style.display === "none") {
    x.style.display = "block";
  } else {
    x.style.display = "none";
  }
}
.container {
     width: 400px;
     height: 300px;
     border: 1px solid #333;
     display: flex;
     flex-direction: column;
     position: relative;
}
 .messages {
     overflow-y: auto;
     height: 100%;
}
 .send-message {
     width: 100%;
     display: flex;
     flex-direction: column;
     position: absolute;
     bottom: 0;
}
 .send-message input {
     width:100%;
}
 .some-margin {
     margin-bottom: 100px;
}

 
 
<div class="container">
   <div class="messages">
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">test</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
      <div class="message">hello</div>
   </div>
   <div class="send-message">
      <input />
   </div>
</div>
<button onclick="test()">add margin</button>


Tôi không hiểu giải pháp này. Nó chỉ có vẻ ẩn hộp văn bản gửi tin nhắn khi bạn nhấp vào thêm lề?
Ryan Peschel

-1

Một cách tiếp cận CSS không hoàn hảo mà tôi có thể đưa ra là như sau:

window.onload = function(e){ 
  document.querySelector(".messages").scrollTop = 10000;
}

document.querySelector('button').addEventListener('click', test)

function test() {
  document.querySelector(".send-message").classList.toggle("some-margin")
  document.querySelector('.wrapper').classList.toggle('wrapper--transformed')
}
.container {
  width: 400px;
  height: 300px;
  border: 1px solid #333;
  display: flex;
  flex-direction: column;
}

.messages {
  position: relative;
  overflow-y: auto;
  height: 100%;
}

.wrapper {
  display: block;
}

.wrapper--transformed {
  transform: translateY(-100px);
  margin-bottom: -100px;
}

.send-message {
  width: 100%;
  display: flex;
  flex-direction: column;
}

.some-margin {
  margin-bottom: 100px;
}
<div class="container">
  <div class="messages">
    <div class = "wrapper">
      <div class="message">hello1</div>
      <div class="message">hello2</div>
      <div class="message">hello3</div>
      <div class="message">hello4</div>
      <div class="message">hello5</div>
      <div class="message">hello6</div>
      <div class="message">hello7</div>
      <div class="message">hello8</div>
      <div class="message">hello9</div>
      <div class="message">hello1</div>
      <div class="message">hello2</div>
      <div class="message">hello3</div>
      <div class="message">hello4</div>
      <div class="message">hello5</div>
      <div class="message">hello6</div>
      <div class="message">hello7</div>
      <div class="message">hello8</div>
      <div class="message">hello9</div>
      <div class="message">hello1</div>
      <div class="message">hello2</div>
    </div>
  </div>
  <div class="send-message">
    <input />
  </div>
</div>
<button>add margin</button>

Phần trên cùng có một chút vấn đề khi có lề. Thủ thuật ở đây là sử dụng lề âm và sử dụng dịch để "cuộn lên" (không thực sự là cuộn, chỉ là ảo ảnh) wrapperdiv.


Vấn đề phần trên cùng là một chút vấn đề, yeah. Ngoài ra, điều này có giả định biết kích thước chính xác của bàn phím di động để biết mức bù bao nhiêu không? Tôi không chắc chắn nếu tôi có quyền truy cập vào thông tin đó.
Ryan Peschel

Trả lời câu hỏi của bạn, đúng vậy. Kỹ thuật trên phải biết chính xác chiều cao của bàn phím. Tuy nhiên, có nhiều cách sử dụng JS để xác định chiều cao của một phần tử và thay đổi CSS.
Richard

Làm thế nào bạn sẽ xác định chiều cao của bàn phím ảo di động?
Ryan Peschel

@RyanPeschel Bàn phím ảo đó có phải là một yếu tố của HTML (ví dụ div) không?
Richard

Tôi không chắc nó được mã hóa như thế nào.
Ryan Peschel

-2

Nó rất đơn giản có thể được giải quyết với tên neo. Hãy xem fiddle JS tại https://jsfiddle.net/gvbz93sx/

Thay đổi HTML <a name="bottom"></a>

Thay đổi mã nguồn document.location.hash = "#bottom";

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.