Phần trăm thay đổi kích thước hình ảnh CSS của chính nó?


108

Tôi đang cố gắng thay đổi kích thước một img với tỷ lệ phần trăm của chính nó. Ví dụ, tôi chỉ muốn thu nhỏ hình ảnh xuống một nửa bằng cách thay đổi kích thước nó thành 50%. Nhưng việc áp dụng width: 50%;sẽ thay đổi kích thước hình ảnh thành 50% của phần tử vùng chứa (phần tử mẹ có thể là <body>ví dụ).

Câu hỏi là, tôi có thể thay đổi kích thước hình ảnh với tỷ lệ phần trăm của chính nó mà không sử dụng javascript hoặc phía máy chủ không? (Tôi không có thông tin trực tiếp về kích thước hình ảnh)

Tôi khá chắc rằng bạn không thể làm điều này, nhưng tôi chỉ muốn xem liệu có giải pháp CSS thông minh duy nhất hay không. Cảm ơn!


Nó sẽ chiếm tỷ lệ phần tử chứa nếu bạn muốn sử dụng width: <number>%. Tôi không nghĩ rằng có một cách để làm điều đó!
Aniket

Câu trả lời:


110

Tôi có 2 phương pháp cho bạn.

Phương pháp 1. demo trên jsFiddle

Phương pháp này chỉ thay đổi kích thước hình ảnh trực quan chứ không phải là kích thước thực tế trong DOM và trạng thái hình ảnh sau khi thay đổi kích thước được căn giữa ở giữa kích thước ban đầu.

html:

<img class="fake" src="example.png" />

css:

img {
  -webkit-transform: scale(0.5); /* Saf3.1+, Chrome */
     -moz-transform: scale(0.5); /* FF3.5+ */
      -ms-transform: scale(0.5); /* IE9 */
       -o-transform: scale(0.5); /* Opera 10.5+ */
          transform: scale(0.5);
             /* IE6–IE9 */
             filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9999619230641713, M12=-0.008726535498373935, M21=0.008726535498373935, M22=0.9999619230641713,SizingMethod='auto expand');
}​

Lưu ý hỗ trợ trình duyệt : thống kê trình duyệt hiển thị nội tuyến trongcss.

Phương pháp 2. demo trên jsFiddle

html:

<div id="wrap">
    <img class="fake" src="example.png" />
    <div id="img_wrap">
        <img class="normal" src="example.png" />
    </div>
</div>

css:

#wrap {
    overflow: hidden;
    position: relative;
    float: left;
}

#wrap img.fake {
    float: left;
    visibility: hidden;
    width: auto;
}

#img_wrap {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

#img_wrap img.normal {
    width: 50%;
}​

Lưu ý: img.normalimg.fakelà hình ảnh giống nhau.
Lưu ý hỗ trợ trình duyệt: Phương pháp này sẽ hoạt động trên tất cả các trình duyệt, vì tất cả các trình duyệt đều hỗ trợcsscác thuộc tính được sử dụng trong phương thức.

Phương pháp hoạt động theo cách này:

  1. #wrap#wrap img.fakecó dòng chảy
  2. #wrapoverflow: hiddenđể kích thước của nó là giống hệt nhau để hình ảnh bên trong ( img.fake)
  3. img.fakelà phần tử duy nhất bên trong #wrapkhông có absoluteđịnh vị để nó không phá vỡ bước thứ hai
  4. #img_wrapabsoluteđịnh vị bên trong #wrapvà mở rộng kích thước cho toàn bộ phần tử ( #wrap)
  5. Kết quả của bước thứ tư là #img_wrapcó kích thước giống như hình ảnh.
  6. Bằng cách width: 50%bật img.normal, kích thước của nó 50%bằng #img_wrap, và do đó 50%bằng kích thước hình ảnh gốc.

Điều này không thay đổi kích thước hình ảnh đến 50% kích thước ban đầu của nó, bây giờ 50% phụ huynh của img_wrap ..
Wesley

Xem câu trả lời cập nhật của tôi để cố gắng giải quyết vấn đề. Bạn nghĩ sao?
Wesley

Tôi nghĩ có thể sử dụng display: none thay vì hiển thị, như trong mã của tôi. Trong ví dụ của bạn, không gian cho các giả ẩn hình ảnh vẫn là 'reserved' mà vít lên dòng nếu bạn muốn đưa nội dung xung quanh nó
Wesley

nó là không thể, bởi vì thủ thuật chính là trong hai thẻ lồng nhau và thẻ nổi.
Vladimir Starkov

1
Các transform:scale()giải pháp có vấn đề dù lớn. Nó không tương tác tốt với mô hình hộp CSS. Do đó tôi có nghĩa là nó không tương tác với nó chút nào , vì vậy bạn sẽ có được bố trí trông hoàn toàn sai. Xem: jsfiddle.net/kahen/sGEkt/8
kahen

46

HTML:

<span>
    <img src="example.png"/>
</span>

CSS:

span {
    display: inline-block;
}
img {
    width: 50%;
}

Đây phải là một trong những giải pháp đơn giản nhất sử dụng cách tiếp cận phần tử vùng chứa.

Khi sử dụng phương pháp tiếp cận phần tử vùng chứa, câu hỏi này là một biến thể của câu hỏi này . Mẹo là để phần tử vùng chứa thu nhỏ hình ảnh con, vì vậy nó sẽ có kích thước bằng kích thước của hình ảnh chưa được kích thước. Do đó, khi đặt widththuộc tính của hình ảnh dưới dạng giá trị phần trăm, hình ảnh sẽ được chia tỷ lệ so với tỷ lệ ban đầu của nó.

Một số các thuộc tính shrinkwrapping-bổ trợ khác và giá trị tài sản là: float: left/right, position: fixedmin/max-width, như đã đề cập trong câu hỏi liên quan. Mỗi loại có tác dụng phụ riêng, nhưng display: inline-blocksẽ là lựa chọn an toàn hơn. Matt đã đề cập float: left/righttrong câu trả lời của mình, nhưng anh ấy đã gán nó sai overflow: hidden.

Demo trên jsfiddle


Chỉnh sửa: Như đã đề cập bởi trojan , bạn cũng có thể tận dụng mô-đun định cỡ nội tại & ngoại tại CSS3 mới được giới thiệu :

HTML:

<figure>
    <img src="example.png"/>
</figure>

CSS:

figure {
    width: intrinsic;
}
img {
    width: 50%;
}

Tuy nhiên, không phải tất cả các phiên bản trình duyệt phổ biến đều hỗ trợ nó tại thời điểm viết bài .


@ Có ai làm cách nào để sửa lỗi không thu gọn đường viền khoảng không? fiddle
CoR

Đây chỉ là những gì tôi cần ... một cái gì đó nhanh chóng và đơn giản, cảm ơn. Tôi đã sử dụng nó như thế này: HTML: <img src="https://www.google.com/images/srpr/logo11w.png"/> CSS: img { display: inline-block; width: 15%; }
Chnikki

Đối với độc giả trong tương lai: giá trị chính xác để đặt figurewidth: fit-content;hiện tại. Hỗ trợ trình duyệt ngày nay cũng tốt hơn rất nhiều.
Dániel Kis-Nagy

12

Thử zoomtài sản

<img src="..." style="zoom: 0.5" />

Chỉnh sửa: Rõ ràng, FireFox không hỗ trợ thuộc zoomtính. Bạn nên sử dụng;

-moz-transform: scale(0.5);

cho FireFox.


4
Không có thuộc tính CSS nào như "zoom" và nó không được hỗ trợ bởi bất kỳ ai ngoài IE. Đó là một thứ độc quyền của Microsoft và không phải là tiêu chuẩn.
Rob

9
Thật không may, thông tin này đã lỗi thời. Thu phóng được hỗ trợ bởi các trình duyệt Internet Explorer, Chrome và Safari tại thời điểm này. FireFox và Opera chưa hỗ trợ nó. Đó là lý do tại sao tôi đã thêm phần chỉnh sửa. IE là trình đầu tiên hỗ trợ nó nhưng không phải là duy nhất.
Emir Akaydın

Theo liên kết này, Opera dường như cũng hỗ trợ thu phóng. FireFox là chương trình duy nhất không hỗ trợ. fix-css.com/2011/05/css-zoom
Emir Akaydın

2
Đó là lý do tại sao IE đã mất một nửa thị phần trong 8 năm qua. Nếu bạn không thể tin tưởng vào các trình duyệt để hỗ trợ một cái gì đó, thì bạn không có điểm chung. Thông số kỹ thuật được viết bởi chính các nhà cung cấp trình duyệt. Nếu họ không đưa nó vào đó, thì đừng dựa vào nó, nếu không bạn sẽ viết nhiều dòng đánh dấu như bạn đã làm. Đây không phải là năm 1998 nữa.
Rob

1
Tôi không biết bạn có để ý không nhưng "thu phóng" được hỗ trợ bởi Internet Explorer, Chrome, Safari và Opera. đây là bằng chứng cho thấy "thu phóng" không phải là nhà cung cấp cụ thể. chỉ có FireFox là khác. vì vậy tôi lặp lại câu hỏi của mình. giải pháp sạch với tài sản css có thể so sánh được là gì? câu trả lời của tôi là câu trả lời tốt nhất cho đến khi ai đó tìm thấy một giải pháp tiêu chuẩn thích hợp.
Emir Akaydın

5

Một giải pháp khác là sử dụng:

<img srcset="example.png 2x">

Nó sẽ không xác thực vì srcthuộc tính là bắt buộc, nhưng nó hoạt động (ngoại trừ trên bất kỳ phiên bản IE nào vì srcsetkhông được hỗ trợ).


2

Điều này thực sự là có thể, và tôi đã tình cờ phát hiện ra nó như thế nào khi thiết kế trang web thiết kế đáp ứng quy mô lớn đầu tiên của mình.

<div class="wrapper">
  <div class="box">
    <img src="/logo.png" alt="">
  </div>
</div>

.wrapper { position:relative; overflow:hidden; }

.box { float:left; } //Note: 'float:right' would work too

.box > img { width:50%; }

Phần tràn: ẩn cung cấp chiều cao và chiều rộng của trình bao bọc, bất chấp nội dung nổi, mà không sử dụng hack clearfix. Sau đó, bạn có thể định vị nội dung của mình bằng cách sử dụng lề. Bạn thậm chí có thể làm cho trình bao bọc div trở thành một khối nội tuyến.


2

Đây là một chủ đề rất cũ nhưng tôi đã tìm thấy nó trong khi tìm kiếm một giải pháp đơn giản để hiển thị ảnh chụp màn hình võng mạc (độ phân giải cao) trên màn hình có độ phân giải tiêu chuẩn.

Vì vậy, có một giải pháp HTML duy nhất cho các trình duyệt hiện đại:

<img srcset="image.jpg 100w" sizes="50px" src="image.jpg"/>

Điều này cho trình duyệt biết rằng hình ảnh có kích thước gấp đôi kích thước hiển thị dự kiến. Giá trị tỷ lệ thuận và không cần phản ánh kích thước thực của hình ảnh. Người ta cũng có thể sử dụng 2w 1px để đạt được hiệu quả tương tự. Thuộc tính src chỉ được sử dụng bởi các trình duyệt cũ.

Hiệu quả tuyệt vời của nó là nó hiển thị cùng kích thước trên màn hình võng mạc hoặc màn hình tiêu chuẩn, thu nhỏ ở màn hình sau.


0
function shrinkImage(idOrClass, className, percentShrinkage){
'use strict';
    $(idOrClass+className).each(function(){
        var shrunkenWidth=this.naturalWidth;
        var shrunkenHeight=this.naturalHeight;
        $(this).height(shrunkenWidth*percentShrinkage);
        $(this).height(shrunkenHeight*percentShrinkage);
    });
};

$(document).ready(function(){
    'use strict';
     shrinkImage(".","anyClass",.5);  //CHANGE THE VALUES HERE ONLY. 
});

Giải pháp này sử dụng js và jquery và thay đổi kích thước chỉ dựa trên các thuộc tính hình ảnh chứ không phải phụ huynh. Nó có thể thay đổi kích thước một hình ảnh hoặc một nhóm dựa trên thông số lớp và id.

để biết thêm thông tin, hãy truy cập tại đây: https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5


0

Đây là một cách tiếp cận không khó:

<div>
    <img src="sample.jpg" />
</div>

then in css:
div {
    position: absolute;
}

img, div {
   width: ##%;
   height: ##%;
}

0

Trên thực tế, hầu hết các câu trả lời ở đây không thực sự chia tỷ lệ hình ảnh theo chiều rộng của chính nó .

Chúng ta cần có chiều rộng và chiều cao tự động trên imgchính phần tử để có thể bắt đầu với kích thước ban đầu của nó.

Sau đó, một phần tử vùng chứa có thể chia tỷ lệ hình ảnh cho chúng tôi.

Ví dụ HTML đơn giản:

<figure>
    <img src="your-image@2x.png" />
</figure>

Và đây là các quy tắc CSS. Tôi sử dụng một vùng chứa tuyệt đối trong trường hợp này:

figure {
    position: absolute;
    left: 0;
    top: 0;
    -webkit-transform: scale(0.5); 
    -moz-transform: scale(0.5);
    -ms-transform: scale(0.5); 
    -o-transform: scale(0.5);
    transform: scale(0.5);
    transform-origin: left;
} 

figure img {
    width: auto;
    height: auto;
}

Bạn có thể điều chỉnh định vị hình ảnh với các quy tắc như transform: translate(0%, -50%);.


-1

Tôi nghĩ bạn đúng, chỉ là không thể với CSS thuần túy theo như tôi biết (ý tôi là không phải trình duyệt chéo).

Biên tập:

Ok, tôi không thích câu trả lời của mình cho lắm nên tôi hơi phân vân. Tôi có thể đã tìm thấy một ý tưởng thú vị có thể giúp ích .. có lẽ nó là có thể sau tất cả (mặc dù không phải là điều đẹp nhất từng có):

Chỉnh sửa: Đã thử nghiệm và hoạt động trong Chrome, FF và IE 8 & 9. . Nó không hoạt động trong IE7.

Ví dụ về jsFiddle tại đây

html:

<div id="img_wrap">
    <img id="original_img" src="http://upload.wikimedia.org/wikipedia/en/8/81/Mdna-standard-edition-cover.jpg"/>
    <div id="rescaled_img_wrap">
        <img id="rescaled_img" src="http://upload.wikimedia.org/wikipedia/en/8/81/Mdna-standard-edition-cover.jpg"/>
    </div>
</div>

css:

#img_wrap {
    display: inline-block;       
    position:relative;    
}

#rescaled_img_wrap {
    width: 50%;
}
#original_img {
    display: none;
}
#rescaled_img {
    width: 100%;
    height: 100%;
}

ví dụ của bạn thay đổi kích thước hình ảnh không theo tỷ lệ
Vladimir Starkov

Phương pháp của bạn giúp bạn có thể giảm hình ảnh thông qua thay đổi kích thước cửa sổ
Vladimir Starkov

đó là bởi vì bạn đang sử dụng inline-block, đó là lý do tại sao chiều rộng #img_wrapkhông chỉ phụ thuộc vào chiều rộng html bên trong mà còn phụ thuộc vào chiều rộng vùng chứa ngữ cảnh.
Vladimir Starkov

Theo như tôi có thể nói, màn hình đó: không có hình ảnh nào không làm gì cả và có thể bị xóa. Hay tôi đang thiếu cái gì đó?
run rẩy
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.