Làm cách nào để thay thế văn bản bằng CSS?


321

Làm cách nào để thay thế văn bản bằng CSS bằng phương pháp như sau:

.pvw-title img[src*="IKON.img"] { visibility:hidden; }

Thay vì ( img[src*="IKON.img"] ), tôi cần sử dụng một cái gì đó có thể thay thế văn bản thay thế.

Tôi phải sử dụng [ ]để làm cho nó hoạt động.

<div class="pvw-title">Facts</div>

Tôi cần thay thế " Sự kiện ".


Thành thật mà nói, có lẽ tốt nhất là sử dụng javascript cho việc này.
Thưa ngài,

Sử dụng Javascript yêu cầu DOM phải được tải, do đó có FOUC. Tôi muốn làm điều này để thay thế văn bản bằng nội dung được trích xuất từ ​​chuỗi truy vấn trong khi tránh FOUC mà không phải tạo phía máy chủ HTML (do đó cho phép HTML được lưu trữ mạnh mẽ và được cung cấp từ CDN).
nemequ

32
Câu hỏi là làm thế nào để làm điều đó với CSS. Tôi đang sử dụng một CMS chỉ cho phép tôi thay đổi CSS, đó là lý do tôi đến đây trang trong khi googling cho câu trả lời, và không phải là một tên khác. Đó là lý do tại sao chúng tôi trả lời câu hỏi đã được hỏi thay vì hỏi tại sao tình huống của người hỏi không khác nhau.
felwithe

Câu trả lời:


291

Hoặc có lẽ bạn có thể bao bọc 'Sự kiện' <span>như sau:

<div class="pvw-title"><span>Facts</span></div>

Sau đó sử dụng:

.pvw-title span {
  display: none;
}
.pvw-title:after {
  content: 'whatever it is you want to add';
}

52
Đẹp, nhưng đó là một thay đổi đối với HTML chứ không chỉ là CSS.
mikemaccana

22
Đôi khi, đó là lựa chọn duy nhất của bạn
locrizak

4
span {hiển thị: không có; } cũng nên ẩn phần tử giả. Bạn nên sử dụng khả năng hiển thị: ẩn thay thế
xryl669

2
không trưng bày; và tầm nhìn: ẩn; cả hai đều ẩn yếu tố giả
Facundo Colombiaier

10
@Mathew đang ẩn span nhưng thêm phần tử giả vào div, vì vậy phần tử giả không bị ẩn (bằng cách sử dụng thuộc tính hiển thị hoặc hiển thị)
dewtea

249

Bắt buộc : Đây là một hack: CSS không phải là nơi thích hợp để thực hiện việc này, nhưng trong một số trường hợp - ví dụ: bạn có thư viện của bên thứ ba trong iframe chỉ có thể được tùy chỉnh bởi CSS - loại hack này là tùy chọn duy nhất .

Bạn có thể thay thế văn bản thông qua CSS. Hãy thay thế một nút màu xanh lục bằng 'xin chào' bằng một nút màu đỏ có nội dung 'tạm biệt' , sử dụng CSS.

Trước:

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

Sau:

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

Xem http://jsfiddle.net/ZBj2m/274/ để xem bản demo trực tiếp:

Đây là nút màu xanh lá cây của chúng tôi:

<button>Hello</button>

button {
  background-color: green;
  color: black;
  padding: 5px;
}

Bây giờ, hãy ẩn phần tử gốc, nhưng thêm phần tử khối khác sau đó:

button {
  visibility: hidden;
}
button:after {
  content:'goodbye'; 
  visibility: visible;
  display: block;
  position: absolute;
  background-color: red;
  padding: 5px;
  top: 2px;
}

Ghi chú:

  • Chúng tôi rõ ràng cần phải đánh dấu đây là phần tử khối, các phần tử 'sau' là nội tuyến theo mặc định
  • Chúng ta cần bù cho phần tử gốc bằng cách điều chỉnh vị trí của phần tử giả.
  • Chúng ta phải ẩn phần tử gốc và hiển thị phần tử giả bằng cách sử dụng visibility. Lưu ý display: nonevề yếu tố ban đầu không hoạt động.

2
Điều này không hoạt động trong tức là 10, có ý tưởng nào để sửa đổi nó để làm như vậy không?
Solmead

49
display: none;không hoạt động vì ::afterthực sự có nghĩa là bên trong yếu tố này, nhưng cuối cùng, trong trường hợp có ai đó tò mò.
Ry-

4
Thật không may, nút "sửa đổi" không hoạt động như một nút nữa. Đó là một ví dụ tốt, chỉ là nó không áp dụng cho một nút.
xryl669

1
không trưng bày; và tầm nhìn: ẩn; cả hai đều ẩn yếu tố giả
Facundo Colombiaier

Làm thế nào khi tôi làm điều này, nó thay thế thành phần nhưng văn bản là tất cả chữ hoa và không thể thay đổi thành chữ thường?
Jpaji Rajquer

159

Nếu bạn sẵn sàng sử dụng các yếu tố giả và để chúng chèn nội dung, bạn có thể làm như sau. Nó không giả định kiến ​​thức về yếu tố ban đầu và không yêu cầu đánh dấu bổ sung.

.element {
  text-indent: -9999px;
  line-height: 0; /* Collapse the original line */
}

.element::after {
  content: "New text";
  text-indent: 0;
  display: block;
  line-height: initial; /* New content takes up original line height */
}

Ví dụ về JSFiddle


1
Câu trả lời này hoạt động ở những nơi mà một số câu trả lời khác không có, chẳng hạn như các nút văn bản bên trong một <th>phần tử.
Chris Kerekes

5
Điều này hoạt động tốt. Trong trường hợp của tôi, line-height: 0color: transparenttrên phần tử chính và đặt lại các giá trị đó trên giả, thực hiện công việc (không thay đổi text-indent)
dontGoPlastic

1
Không nên line-height: normalthay thế initial?
Benjamin

1
Lý do để sử dụng văn bản thụt lề là vì nếu văn bản gốc dài hơn, phần tử vẫn giữ nguyên kích thước của văn bản cũ, không co lại theo kích thước của văn bản mới (giả sử đó là những gì bạn muốn)
Chris Janssen

Văn bản thụt lề: -9999px; hoạt động trên IE. Trong khi tầm nhìn: ẩn; phương pháp không hoạt động trên IE.
Tom Stermitz

57

Dựa trên câu trả lời của mikemaccana , điều này hiệu quả với tôi

button {
  position: absolute;
  visibility: hidden;
}

button:before {
  content: "goodbye";
  visibility: visible;
}

§ Định vị tuyệt đối

một phần tử được định vị hoàn toàn được đưa ra khỏi dòng chảy và do đó không chiếm không gian khi đặt các phần tử khác.


2
Đối với tôi câu trả lời này vượt trội hơn so với những người khác vì nó hoạt động với sự thay thế văn bản trong cùng một dòng, nghĩa là nó không buộc ngắt dòng trong văn bản (đối với sự kết hợp cụ thể của tôi với HTML và CSS).
pgr

30

Điều này là đơn giản, ngắn và hiệu quả. Không cần thêm HTML.

.pvw-title { color: transparent; }

.pvw-title:after {
        content: "New Text To Replace Old";
        color: black; /* set color to original text color */
        margin-left: -30px;
        /* margin-left equals length of text we're replacing */
    }

Tôi đã phải làm điều này để thay thế văn bản liên kết, ngoại trừ nhà, cho mẩu bánh mì WooC Commerce

Sass / Ít hơn

body.woocommerce .woocommerce-breadcrumb > a[href$="/shop/"] {
    color: transparent;
    &:after {
        content: "Store";
        color: grey;
        margin-left: -30px;
    }
}

CSS

body.woocommerce .woocommerce-breadcrumb > a[href$="/shop/"] {
    color: transparent;
}

body.woocommerce .woocommerce-breadcrumb > a[href$="/shop/"]&:after {
    content: "Store";
    color: @child-color-grey;
    margin-left: -30px;
}

22

Bạn không thể, tốt, bạn có thể.

.pvw-title:after {
  content: "Test";
}

Điều này sẽ chèn nội dung sau nội dung hiện tại của phần tử. Nó không thực sự thay thế nó, nhưng bạn có thể chọn một div trống và sử dụng CSS để thêm tất cả nội dung.

Nhưng trong khi bạn ít nhiều có thể, bạn không nên. Nội dung thực tế nên được đưa vào tài liệu. Thuộc tính nội dung chủ yếu dành cho đánh dấu nhỏ, như dấu ngoặc kép quanh văn bản sẽ xuất hiện trích dẫn.


Tôi rất chắc chắn về việc tôi đã sử dụng một mã để thay thế văn bản bằng loại phương thức đó .. '<div class = "pvw-title"> Sự kiện </ div> <div class = "pvw-title"> Sự kiện </ div> 'Tôi không thể sử dụng: sau đó, vì tôi có nhiều hơn một lớp div có cùng tên :(
MokiTa

Làm thế nào tương thích rộng rãi là cho các trình duyệt? Và tôi nghi ngờ javascript sẽ là một lựa chọn tốt hơn về lâu dài cho loại linh hoạt này.
Thưa ngài,

Các trình duyệt hiện đại hỗ trợ nó. Tôi không chắc chắn về các phiên bản IE cũ hơn, nhưng tôi đoán rằng có thể tìm kiếm trên quirksmode.com. -edit- Nó có thể: quirksmode.org/css/user-interface/content.html
GolezTrol

15

Hãy thử sử dụng :before:after. Một chèn văn bản sau khi HTML được hiển thị và các chèn khác trước khi HTML được hiển thị. Nếu bạn muốn thay thế văn bản, hãy để trống nội dung nút.

Ví dụ này đặt văn bản nút theo kích thước của chiều rộng màn hình.

<meta name="viewport" content="width=device-width, initial-scale=1">

<style>
  button:before {
    content: 'small screen';
  }
  @media screen and (min-width: 480px) {
    button:before {
      content: 'big screen';
    }
  }
</style>
<body>
  <button type="button">xxx</button>
  <button type="button"></button>
</body>

Nút văn bản:

  1. Với :before

    màn hình lớn

    màn hình lớn

  2. Với :after

    màn hình xxxbig

    màn hình lớn


11

Nếu bạn chỉ muốn hiển thị các văn bản hoặc hình ảnh khác nhau, hãy để thẻ trống và viết nội dung của bạn trong nhiều thuộc tính dữ liệu như thế <span data-text1="Hello" data-text2="Bye"></span>. Hiển thị chúng với một trong các lớp giả:before {content: attr(data-text1)}

Bây giờ bạn có một loạt các cách khác nhau để chuyển đổi giữa chúng. Tôi đã sử dụng chúng kết hợp với các truy vấn phương tiện cho phương pháp thiết kế đáp ứng để thay đổi tên điều hướng của tôi thành biểu tượng.

trình diễn và ví dụ jsfiddle

Nó có thể không trả lời hoàn hảo câu hỏi, nhưng nó thỏa mãn nhu cầu của tôi và có thể những người khác cũng vậy.


10

Tôi đã thiết lập các may mắn hơn font-size: 0trong những yếu tố bên ngoài, và font-sizecác :afterselector để bất cứ điều gì tôi cần.


1
Điều này hoạt động tốt. Đây là một bản demo .
Arthur

9

Điều này làm việc cho tôi với văn bản nội tuyến. Nó đã được thử nghiệm trên Firefox, Safari, Chrome và Opera.

<p>Lorem ipsum dolor sit amet, consectetur <span>Some Text</span> adipiscing elit.</p>

span {
    visibility: hidden;
    word-spacing: -999px;
    letter-spacing: -999px;
}

span:after {
    content: "goodbye";
    visibility: visible;
    word-spacing: normal;
    letter-spacing: normal;
}

2
Không làm việc cho tôi trong ít nhất IE 9 đến 11 do nó bỏ qua "visibility: có thể nhìn thấy" trên: sau khi phần tử: stackoverflow.com/questions/17530947/...
thenickdude

8

Tôi sử dụng thủ thuật này:

.pvw-title {
    text-indent: -999px;
}
.pvw-title:after {
    text-indent: 0px;
    float: left;
    content: 'My New Content';
}

Tôi thậm chí đã sử dụng điều này để xử lý quốc tế hóa các trang bằng cách chỉ thay đổi một lớp cơ sở ...

.translate-es .welcome {
    text-indent: -999px;
}
.translate-es .welcome:after {
    text-indent: 0px;
    float: left;
    content: '¡Bienvenidos!';
}

3
Đây là vấn đề đối với người dùng có trình đọc màn hình. Nếu bạn không thay đổi sự không chấp nhận / mức độ hiển thị của thành phần và không cung cấp bất kỳ gợi ý aria nào, văn bản "vô hình" của bạn vẫn có thể được đọc bởi trình đọc màn hình.
Trình biên dịch dễ thấy

8

Thay thế văn bản bằng các yếu tố giả và khả năng hiển thị CSS

HTML

<p class="replaced">Original Text</p>

CSS

.replaced {
    visibility: hidden;
    position: relative;
}

.replaced:after {
    visibility: visible;
    position: absolute;
    top: 0;
    left: 0;
    content: "This text replaces the original.";
}

3

Sử dụng phần tử giả, phương pháp này không đòi hỏi kiến ​​thức về phần tử gốc và không yêu cầu bất kỳ đánh dấu bổ sung nào.

#someElement{
    color: transparent; /* You may need to change this color */
    position: relative;
}
#someElement:after { /* Or use :before if that tickles your fancy */
    content: "New text";
    color: initial;
    position: absolute;
    top: 0;
    left: 0;
}

2

Điều này thực hiện một hộp kiểm dưới dạng nút hiển thị Có hoặc Không tùy thuộc vào trạng thái 'được kiểm tra' của nó. Vì vậy, nó thể hiện một cách thay thế văn bản bằng CSS mà không phải viết bất kỳ mã nào.

Nó vẫn sẽ hoạt động giống như một hộp kiểm cho đến khi trả về (hoặc không trả về) một giá trị POST, nhưng từ quan điểm hiển thị, nó trông giống như một nút chuyển đổi.

Màu sắc có thể không theo ý thích của bạn, chúng chỉ ở đó để minh họa một điểm.

HTML là:

<input type="checkbox" class="yesno" id="testcb" /><label for="testcb"><span></span></label>

... và CSS là:

/* --------------------------------- */
/* Make the checkbox non-displayable */
/* --------------------------------- */
input[type="checkbox"].yesno {
    display:none;
}
/* --------------------------------- */
/* Set the associated label <span>   */
/* the way you want it to look.      */
/* --------------------------------- */
input[type="checkbox"].yesno+label span {
    display:inline-block;
    width:80px;
    height:30px;
    text-align:center;
    vertical-align:middle;
    color:#800000;
    background-color:white;
    border-style:solid;
    border-width:1px;
    border-color:black;
    cursor:pointer;
}
/* --------------------------------- */
/* By default the content after the  */
/* the label <span> is "No"          */
/* --------------------------------- */
input[type="checkbox"].yesno+label span:after {
    content:"No";
}
/* --------------------------------- */
/* When the box is checked the       */
/* content after the label <span>    */
/* is "Yes" (which replaces any      */
/* existing content).                */
/* When the box becomes unchecked the*/
/* content reverts to the way it was.*/
/* --------------------------------- */
input[type="checkbox"].yesno:checked+label span:after {
    content:"Yes";
}
/* --------------------------------- */
/* When the box is checked the       */
/* label <span> looks like this      */
/* (which replaces any existing)     */
/* When the box becomes unchecked the*/
/* layout reverts to the way it was. */
/* --------------------------------- */
input[type="checkbox"].yesno:checked+label span {
    color:green;
    background-color:#C8C8C8;
}

Tôi chỉ thử nó trên Firefox, nhưng đó là CSS tiêu chuẩn nên nó phải hoạt động ở nơi khác.


2

Không giống như những gì tôi thấy trong mỗi câu trả lời khác, bạn không cần sử dụng các yếu tố giả để thay thế nội dung của thẻ bằng hình ảnh

<div class="pvw-title">Facts</div>

    div.pvw-title { /* No :after or :before required */
        content: url("your URL here");
    }

2
Kể từ CSS2, contentchỉ áp dụng cho :before:after. CSS3 mở rộng nó ra mọi thứ, nhưng mô-đun Nội dung được tạo vẫn ở trạng thái nháp, do đó, bất kỳ việc sử dụng nào đều khả năng phụ thuộc vào trình duyệt.
mrec

1
Một "balise" là gì? Không phải " 1. (Hệ thống điều khiển tàu châu Âu) Đèn hiệu điện tử hoặc bộ phát đáp được đặt giữa đường ray của đường ray " , tôi đoán. (Vui lòng trả lời bằng cách chỉnh sửa câu hỏi của bạn , không phải ở đây trong các bình luận).)
Peter Mortensen

1

Điều này thực sự không thể nếu không có thủ thuật. Đây là một cách làm việc bằng cách thay thế văn bản bằng một hình ảnh của văn bản.

.pvw-title{
    text-indent: -9999px;
    background-image: url(text_image.png)
}

Loại điều này thường được thực hiện với JavaScript. Đây là cách nó có thể được thực hiện với jQuery:

$('.pvw-title').text('new text');

3
Tôi cũng không thể sử dụng Javascript: /
MokiTa

1
Đây là cách duy nhất tôi nghĩ nó có thể hoạt động: .pvw-title span [style * = "color: # 000, font-size: 14px;"] {visual: hidden; } .pvw-title span [style * = "color: # 000; font-size: 14px;"]: after {mức độ hiển thị: nhìn thấy; màu: # 000; cỡ chữ: 14px; nội dung: "Kiểm tra"; } nhưng, vì cả hai đều sử dụng cùng một kiểu, tôi không thể làm điều đó ..: /
MokiTa

Tại sao bạn chọn nó dựa trên màu sắc / phông chữ?
Nathan Manousos

Tôi sẽ chọn nó dựa trên toàn bộ phong cách, vì vậy tôi có thể chỉnh sửa tiêu đề cụ thể đó chứ không phải cả hai, vì cả hai đều có cùng tên "div".
MokiTa

1

Tôi gặp vấn đề khi phải thay thế văn bản liên kết, nhưng tôi không thể sử dụng JavaScript cũng như không thể thay đổi trực tiếp văn bản của siêu liên kết khi nó được biên dịch từ XML. Ngoài ra, tôi không thể sử dụng các yếu tố giả, hoặc chúng dường như không hoạt động khi tôi đã thử chúng.

Về cơ bản, tôi đặt văn bản tôi muốn vào một khoảng và đặt thẻ neo bên dưới nó và bọc cả hai trong một div. Về cơ bản, tôi đã di chuyển thẻ neo lên qua CSS và sau đó làm cho phông chữ trong suốt. Bây giờ khi bạn di chuột qua nhịp, nó "hoạt động" như một liên kết. Một cách thực sự khó khăn để làm điều này, nhưng đây là cách bạn có thể có một liên kết với văn bản khác ...

Đây là một câu đố về cách tôi khắc phục vấn đề này

HTML của tôi

<div class="field">
    <span>This is your link text</span><br/>
    <a href="//www.google.com" target="_blank">This is your actual link</a>
</div>

CSS của tôi

 div.field a {
     color: transparent;
     position: absolute;
     top:1%;
 }
 div.field span {
     display: inline-block;
 }

CSS sẽ cần thay đổi dựa trên yêu cầu của bạn, nhưng đây là cách chung để thực hiện những gì bạn đang yêu cầu.


1
@AlmightTại sao tôi nghi ngờ điều này bị hạ cấp bởi vì giải pháp này yêu cầu sửa đổi đánh dấu và tôi nghi ngờ nếu OP có thể sửa đổi đánh dấu, anh ấy / cô ấy sẽ chỉ thay đổi văn bản trực tiếp. Nói cách khác, OP yêu cầu một giải pháp duy nhất CSS
dannie.f

1

Tôi đã tìm thấy một giải pháp như thế này trong đó một từ, "Dark", sẽ được rút ngắn thành "D" trên chiều rộng màn hình nhỏ hơn. Về cơ bản, bạn chỉ cần tạo kích thước phông chữ của nội dung gốc 0 và có dạng rút gọn dưới dạng phần tử giả.

Trong ví dụ này, thay đổi xảy ra khi di chuột thay thế:

span {
  font-size: 12px;
}

span:after {
  display: none;
  font-size: 12px;
  content: 'D';
  color: red;
}

span:hover {
  font-size: 0px;
}

span:hover:after {
  display: inline;
}
<span>Dark</span>


1

Sau tám năm, tôi đã đối mặt với thử thách tương tự khi cố gắng sử dụng tiện ích mở rộng trình duyệt Thời trang để thay đổi thứ gì đó trên trang web (không phải của tôi). Và lần này tôi đã làm cho nó hoạt động bằng cách xem mã nguồn bằng cách sử dụng "phần tử kiểm tra" và tạo mã CSS dựa trên đó.

Đây là những gì nó trông giống như trước đây:

<table>
  <tbody>
    <tr>
      <td role="gridcell">
        <span title="In progress" style="background-color: #e2047a;color:White;margin:2px;border-radius:2px;padding-left: 2px; padding-right: 2px;text-align: center;width: 45px; display: block;overflow: hidden;text-overflow: ellipsis;">In progress</span>
      </td>
    </tr>
  </tbody>
</table>

Đây là cùng một phần của HTML và CSS mà tôi đã sử dụng để sửa đổi kiểu:

td span[style="background-color: #e2047a;color:White;margin:2px;border-radius:2px;padding-left: 2px; padding-right: 2px;text-align: center;width: 45px; display: block;overflow: hidden;text-overflow: ellipsis;"] {
  width: 100px!important;
}
<table>
  <tbody>
    <tr>
      <td role="gridcell">
        <span title="In progress" style="background-color: #e2047a;color:White;margin:2px;border-radius:2px;padding-left: 2px; padding-right: 2px;text-align: center;width: 45px; display: block;overflow: hidden;text-overflow: ellipsis;">In progress</span>
      </td>
    </tr>
  </tbody>
</table>

Bạn có thể chạy mã ở trên và bạn sẽ thấy nó hoạt động (được thử nghiệm trong Chrome).


Đây đơn giản là những gì tôi muốn trở lại trong những ngày tôi hỏi câu hỏi này.

Tôi đã sử dụng một số loại blog cộng đồng / Myspace công cụ tương tự và thứ duy nhất bạn có khi tạo kiểu cho hồ sơ của mình là trình soạn thảo CSS của họ và đó là lý do tại sao tôi muốn chọn nó dựa trên phong cách.

Tôi tìm thấy câu trả lời ở đây:


0

Cách để thực hiện công việc này là thêm chiều cao dòng vào nội dung CSS. Điều này sẽ làm cho khối được nhìn thấy phía trên ẩn, do đó điều này sẽ không ẩn văn bản đã thay đổi.

Ví dụ với việc sử dụng trước :

.pvw-title span {
  display: none;
}

.pvw-title:before {
  content: 'Whatever it is you want to add';
  line-height: 1.5em
}

0

Vâng, như nhiều người nói đây là một hack. Tuy nhiên, tôi muốn thêm các bản cập nhật mới hơn, điều này tận dụng lợi thế flexboxrem, tức là

  • Bạn không muốn định vị thủ công văn bản này để thay đổi, đó là lý do tại sao bạn muốn tận dụng lợi thế của flexbox
  • Bạn không muốn sử dụng paddingvà / hoặc marginsử dụng văn bản một cách rõ ràng px, với các kích thước màn hình khác nhau trên các thiết bị và trình duyệt khác nhau có thể cho đầu ra khác nhau

Tóm lại, đây là giải pháp flexboxđảm bảo rằng nó tự động được định vị hoàn hảo và remđược thay thế chuẩn hơn (và tự động) cho pixel.

CodeSandbox với mã bên dưới và xuất ra dưới dạng ảnh chụp màn hình, vui lòng đọc notemã bên dưới!

h1 {
  background-color: green;
  color: black;
  text-align: center;
  visibility: hidden;
}
h1:after {
  background-color: silver;
  color: yellow;
  content: "This is my great text AFTER";
  display: flex;
  justify-content: center;
  margin-top: -2.3rem;
  visibility: visible;
}
h1:before {
  color: blue;
  content: "However, this is a longer text to show this example BEFORE";
  display: flex;
  justify-content: center;
  margin-bottom: -2.3rem;
  visibility: visible;
}

Lưu ý: đối với các thẻ khác nhau, bạn có thể cần các giá trị khác nhau rem, thẻ này đã được chứng minh h1và chỉ trên các màn hình lớn. Tuy nhiên với @mediabạn có thể dễ dàng mở rộng điều này cho các thiết bị di động.

Cách hack để thay thế văn bản HTML bằng CSS

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.