Процентний розмір зображення зображення CSS?


109

Я намагаюся змінити розмір img з відсотком від себе. Наприклад, я просто хочу скоротити зображення вдвічі, змінивши розмір його до 50%. Але застосувавши width: 50%;, розмір зображення буде дорівнювати 50% елемента контейнера (батьківський елемент, який може бути, <body>наприклад).

Питання полягає в тому, чи можу я змінити розмір зображення у відсотках від себе, не використовуючи JavaScript або сторону сервера? (У мене немає прямої інформації про розмір зображення)

Я впевнений, що ви не можете цього зробити, але я просто хочу перевірити, чи є інтелектуальне рішення тільки для CSS. Дякую!


Якщо ви користуєтесь, це займе відсоток вмістуючого елемента width: <number>%. Я не думаю, що існує спосіб це зробити!
Анікет

Відповіді:


111

У мене є 2 методи для вас.

Метод 1. демонстрація на jsFiddle

Цей метод змінює розмір зображення лише візуального, а не його фактичних розмірів у DOM, а візуального стану після розміру в центрі вихідного розміру.

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');
}​

Примітка щодо підтримки веб-переглядача : статистика веб-переглядачів відображається в рядкуcss.

Метод 2. демонстрація на 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%;
}​

Примітка: img.normal іimg.fakeце те саме зображення.
Примітка щодо підтримки веб-переглядача: Цей метод працює у всіх браузерах, оскільки всі браузери підтримуютьcssвластивості, які використовуються в методі.

Метод працює таким чином:

  1. #wrapі #wrap img.fakeмають потік
  2. #wrapмає overflow: hiddenтак, щоб його розміри були ідентичними внутрішнім зображенням ( img.fake)
  3. img.fakeє єдиним елементом всередині #wrapбез absoluteпозиціонування, щоб не порушити другий крок
  4. #img_wrapмає absoluteпозиціонування всередині #wrapі розмір поширюється на весь елемент ( #wrap)
  5. Результатом четвертого кроку є те, що #img_wrapмає ті ж розміри, що і зображення.
  6. Встановивши width: 50%на img.normalїї розмір 50%з #img_wrap, і , отже , 50%від розміру початкового зображення.

Це не зменшує розмір зображення до 50% від його оригінального розміру, тепер це 50% від батьків img_wrap ..
Веслі,

Дивіться мою оновлену відповідь щодо спроби вирішити проблему. Що ти думаєш?
Веслі

Я думаю, що має бути можливість використовувати display: жоден замість видимості, як у моєму коді. У вашому прикладі місце для підробленого прихованого зображення все ще є «зарезервованим», що накручує потік, якщо ви розміщуєте вміст навколо нього
Веслі,

це неможливо, оскільки головна хитрість полягає у двох вкладених та плаваючих тегах.
Володимир Старков

1
Однак transform:scale()рішення має велику проблему. Це не добре взаємодіє з моделлю CSS box. Я маю в виду , що він не взаємодіє з ним на всіх , так що ви отримаєте макет , який виглядає все неправильно. Дивіться: jsfiddle.net/kahen/sGEkt/8
kahen

46

HTML:

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

CSS:

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

Це повинно стати одним із найпростіших рішень із використанням підходу до елементів контейнера.

При використанні підходу до елемента контейнера це питання є варіантом цього питання . Трюк полягає в тому, щоб дозволити елементу контейнера скоротити дочірнє зображення, тому він буде мати розмір, рівний розміру нерозмірного зображення. Таким чином, встановлюючи widthвластивість зображення як відсоткове значення, зображення масштабується відносно його вихідного масштабу.

Деякі з інших термоусадки включення властивостей і значень властивостей є: float: left/right, position: fixedі min/max-width, як вже згадувалися в пов'язаному питанні. У кожного є свої побічні ефекти, але display: inline-blockце був би безпечніший вибір. Метт згадував float: left/rightу своїй відповіді, але він неправильно приписував це overflow: hidden.

Демонстрація на jsfiddle


Редагувати: Як згадував троян , ви також можете скористатися нещодавно введеним модулем внутрішнього та зовнішнього розміру CSS3 :

HTML:

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

CSS:

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

Однак, не всі популярні версії браузера підтримують його під час написання .


@ Кожен, як виправити не руйнуються межі прольоту? скрипка
CoR

Це було саме те, що мені потрібно ... щось швидке і просте, дякую. Я використовував це так: HTML: <img src="https://www.google.com/images/srpr/logo11w.png"/> CSS: img { display: inline-block; width: 15%; }
Chnikki

Для читачів в майбутньому: правильне значення для установки на figureце width: fit-content;як зараз. Підтримка браузера також сьогодні набагато краща.
Даніель Кіс-Надь

12

Спробуйте zoomвласність

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

Редагувати: Мабуть, FireFox не підтримує zoomвластивість. Ви повинні використовувати;

-moz-transform: scale(0.5);

для FireFox.


4
Немає такого властивості CSS, як "zoom", і його не підтримує ніхто, крім IE. Це майно Майкрософт і нестандартне.
Роб

9
На жаль, ця інформація застаріла. Наразі масштаб підтримується браузерами Internet Explorer, Chrome і Safari. FireFox і Opera поки не підтримують його. Тому я додав частину редагування. IE - це перший, хто його підтримав, але не єдиний.
Емір Акайдін

За цим посиланням, схоже, Opera також підтримує масштабування. FireFox - це єдиний, який не підтримує. fix-css.com/2011/05/css-zoom
Емір Акайдін

2
Тому IE втратила половину своєї частки ринку за останні 8 років. Якщо ви не можете надійно розраховувати на те, що браузери щось підтримають, у вас немає спільної точки зору. Специфікацію пишуть самі постачальники браузерів. Якщо вони не вкладуть його туди, тоді не покладайтеся на нього, або ви будете писати кілька рядків розмітки, як і раніше. Це знову не 1998 рік.
Роб

1
я не знаю, чи помітили ви, але "збільшення" підтримують Internet Explorer, Chrome, Safari та Opera. це доказ того, що "масштабування" не є специфічним для постачальника. відрізняється лише FireFox. тому я повторюю своє запитання. що таке чисте рішення з властивістю css? моя відповідь - найкраща відповідь, поки хтось не знайде належне стандартне рішення.
Емір Акайдін

5

Іншим рішенням є використання:

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

Він не перевіряється, оскільки srcатрибут необхідний, але він працює (за винятком будь-якої версії IE, оскільки srcsetне підтримується).


2

Це насправді можливо, і я виявив, як випадково, розробляючи свій перший широкомасштабний дизайнерський сайт.

<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%; }

Переповнення: приховано надає обертці висоту та ширину, незважаючи на плаваючий вміст, не використовуючи злому виправлення. Потім ви можете розмістити вміст за допомогою поля. Ви навіть можете зробити обгортковий діл вбудованим блоком.


2

Це дуже стара тема, але я знайшов її під час пошуку простого рішення для відображення екрана сітківки (високої роздільної здатності) на екрані зі стандартною роздільною здатністю.

Отже, для сучасних браузерів існує лише рішення HTML:

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

Це говорить про браузер, що зображення вдвічі більше розміру передбаченого розміру дисплея. Значення пропорційні та не потребують відображення фактичного розміру зображення. Можна також використовувати 2w 1px, щоб досягти такого ж ефекту. Атрибут src використовується лише застарілими браузерами.

Приємний ефект від цього полягає в тому, що він відображає однаковий розмір на сітківці або стандартному дисплеї, зменшуючись на останньому.


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. 
});

Це рішення використовує js та jquery і змінює розміри, виходячи лише із властивостей зображення, а не з батьківського. Він може змінити розмір одного зображення або групи на основі параметрів класу та id.

докладніше, перейдіть сюди: https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5


0

Це не важкий підхід:

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

then in css:
div {
    position: absolute;
}

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

0

На насправді більшість відповідей тут не дуже масштабувати зображення по ширині собі .

Нам потрібно мати ширину і висоту авто на самому imgелементі, щоб ми могли почати з його оригінального розміру.

Після цього елемент контейнера може масштабувати зображення для нас.

Простий HTML-приклад:

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

І ось правила CSS. У цьому випадку я використовую абсолютний контейнер:

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;
}

Ви можете налаштувати позиціонування зображення за допомогою таких правил transform: translate(0%, -50%);.


-1

Я думаю, що ви праві, просто з чистим CSS це неможливо, наскільки я знаю (я не маю на увазі крос-браузер).

Редагувати:

Гаразд, мені не дуже сподобалася моя відповідь, тому я трохи спантеличив. Я, можливо, знайшов цікаву ідею, яка могла б допомогти. Можливо, це все-таки можливо (хоча це не найкрасивіша річ коли-небудь):

Редагувати: випробувано та працює в Chrome, FF та IE 8 та 9. . Він не працює в IE7.

Приклад jsFiddle тут

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%;
}

ваш приклад зміни розміру зображення пропорційно
Володимир Старков

Ваш метод дозволяє зменшити зображення за допомогою зміни розміру вікон
Володимир Старков,

це тому, що ви використовуєте inline-block, ось чому ширина #img_wrapзалежить не тільки від внутрішньої ширини html, але й від ширини контекстного контейнера.
Володимир Старков

Наскільки я можу сказати, це відображення: жодне зображення нічого не робить і його не можна видалити. Або я щось пропускаю?
тремтіння
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.