CSS-изображение изменяет размер в процентах от себя?



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



вопрос в том, Могу ли я изменить размер изображения с процентом без использования JavaScript или серверный? (У меня нет прямой информации о размере изображения)



Я уверен, что вы не могу этого сделать, но я просто хочу посмотреть, есть ли интеллектуальное решение только для CSS. Спасибо!

1376   9  

9 ответов:

у меня есть 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.поддельные ' есть flow
  2. #wrap и overflow: hidden установить #wrap размеры идентичны внутреннему изображению (img.fake)
  3. img.fake это только один элемент без absolute или fix в должности #wrap чтобы не нарушить результат второго шага.
  4. #img_wrap и absolute установки внутри #wrap и расширен по размеру до всего элемента (#wrap)
  5. результат четвертого шага #wrap_img те же размеры, что и изображение.
  6. используя responsive images метод set width: 50%; на img.normal и теперь вы получили ваш результат.

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


Edit: как упоминалось троян, вы также можете воспользоваться недавно введенным CSS3 внутренний и внешний модуль калибровки:

HTML:

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

CSS:

figure {
    width: intrinsic;
}
img {
    width: 50%;
}
, не все популярные версии браузеров поддерживают его на момент написания статьи.

попробовать zoom свойства

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

Edit: по-видимому, FireFox не поддерживает zoom собственность. Вы должны использовать;

-moz-transform: scale(0.5);

для FireFox.

это на самом деле возможно, и я обнаружил, как совершенно случайно при разработке моего первого крупномасштабного адаптивного дизайна сайта.

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

переполнение: скрытый дает высоту и ширину обертки, несмотря на плавающее содержимое, без использования взлома clearfix. Затем вы можете разместить свой контент с помощью полей. Вы даже можете сделать оболочку div встроенным блоком.

другое решение заключается в использовании:

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

Он не будет проверять, потому что src атрибут является обязательным, но он работает (за исключением любой версии IE, потому что srcset не поддерживается).

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

Edit:

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

изменить: Протестировано и работает в 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%;
}
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 и изменяет размер только на основе свойств изображения, а не на родительском. Он может изменить размер одного изображения или группы на основе параметров класса и идентификатора.

для получения дополнительной информации, перейдите сюда:https://gist.github.com/jennyvallon/eca68dc78c3f257c5df5

Это очень старый поток, но я нашел его во время поиска простого решения для отображения retina (high res) Screen capture на стандартном дисплее разрешения.

Так что есть только HTML решение для современных браузеров :

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

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

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

это не трудный подход:

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

then in css:
div {
    position: absolute;
}

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

Comments

    Ничего не найдено.