Görüntüyü otomatik olarak kırpma ve ortalama


159

Herhangi bir keyfi görüntü göz önüne alındığında, görüntünün merkezinden bir kareyi kırpmak ve belirli bir karede görüntülemek istiyorum.

Bu soru şuna benzer: CSS Yeniden Boyutlandırılan ve Kırpılan Bir Görüntüyü Göster , ancak görüntünün boyutunu bilmiyorum, bu nedenle ayarlanan kenar boşluklarını kullanamıyorum.


1
Öğe bir resim etiketi olmalı mı yoksa arka plan resmi özelliğine sahip bir div olabilir mi?
Russ Ferri

Görüntüyü şablonlama sistemimden ayarlayabildiğim sürece önemli değil. biraz çirkin, ama sanırım satır içi stiller işe yarayacak.
Jonathan Ong

Yanıtlar:


320

Çözümlerden biri, kırpılan boyutlara göre boyutlandırılmış bir öğe içinde ortalanmış bir arka plan görüntüsü kullanmaktır.


Temel örnek

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
</div>


İle Örnek imgetiketi

Bu sürüm, imgetiketi sürükleyerek görüntüyü kaydetmek için sürükleme veya sağ tıklama özelliğini kaybetmiyoruz. Opaklık hilesi için Parker Bennett'e teşekkür ederiz.

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
  overflow: hidden;
}

/* Set the image to fill its parent and make transparent */
.center-cropped img {
  min-height: 100%;
  min-width: 100%;
  /* IE 8 */
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  /* IE 5-7 */
  filter: alpha(opacity=0);
  /* modern browsers */
  opacity: 0;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
  <img src="http://placehold.it/200x200" />
</div>


object-fit/-position

Desteklenen tarayıcılara bakın .

CSS3 Çıkan özellikleri tanımlar object-fitve object-position, daha büyük bir ölçekte üzerinde kontrol ve bir görüntü içeriğinin pozisyonu sağlar özellikleri imgelemanı. Bunlarla, istenen etkiyi elde etmek mümkün olacaktır:

.center-cropped {
  object-fit: none; /* Do not scale the image */
  object-position: center; /* Center the image within the element */
  height: 100px;
  width: 100px;
}
<img class="center-cropped" src="http://placehold.it/200x200" />


45
Sen kullanabilirsiniz background-size: cover;küçültmek veya orijinal en boy oranını koruyarak uygun div doldurmak için görüntü elde etmek.
Nick

7
Arka plan görüntüsünü kullanırken, kırpılan görüntüyü uygun şekilde boyutlandırmak için arka plan boyutu eklemelisiniz: Bkz. Jsfiddle.net/bw6ct
Kris Erickson

2
Ben nowdays Google, şeffaf ve gizli görüntülerin hakkında bildiği söylendi img'ın altkarınca titleöznitelikler SEO için kaybolacaktır.
Victor Sergienko

6
webkit'te object-fit: cover;doğrudan biraz daha semantik hisseden img etiketi üzerinde de kullanabilirsiniz .
Ben

2
Nesne uyumunu kullandım: en boy oranını kaybetmemek, kareyi kaplamak ve gerekirse kırpmak istemediğim etkiyi elde etmek için kullandım
Daniel Handojo

79

imgEtiketleri (arka plan görüntüsü yolu değil) kullanarak saf bir CSS çözümü arıyordum .

Ben css ile kırpma küçük resimlerde hedefe ulaşmak için bu parlak yolu buldum :

.thumbnail {
  position: relative;
  width: 200px;
  height: 200px;
  overflow: hidden;
}
.thumbnail img {
  position: absolute;
  left: 50%;
  top: 50%;
  height: 100%;
  width: auto;
  -webkit-transform: translate(-50%,-50%);
      -ms-transform: translate(-50%,-50%);
          transform: translate(-50%,-50%);
}
.thumbnail img.portrait {
  width: 100%;
  height: auto;
}

@Nathan Redblur'un cevabına benzer, ancak portre görüntülerine de izin verir.

Benim için bir cazibe gibi çalışıyor. Görüntü hakkında bilmeniz gereken tek şey .portrait, bu kısmı için biraz Javascript kullanmak zorunda kaldım, böylece sınıfı ayarlamak için portre veya manzara olup olmadığıdır .


3
CSS dönüşümlerinin yalnızca IE 9 ve üstü sürümlerde kullanılabildiğini unutmayın.
Simon East

5
Cevap bu olmalı.
Wes Modes

OP "keyfi görüntü" dedi, bu yüzden görüntünün genişliğinden daha uzun olup olmadığını önceden bilemezdi.
20'de opya

11
Minimum yükseklik koyarsanız:% 100; minimum genişlik:% 100; yükseklik yerine:% 100; genişlik: otomatik; img.portrait sınıfına ihtiyacınız yok.
user570605

1
@ user570605 öneri ile birlikte en iyi çözüm
albanx

45

Bunu deneyin: Görüntü kırpma boyutlarınızı ayarlayın ve bu satırı CSS'nizde kullanın:

object-fit: cover;

3
çok iyi desteklenmiyor: caniuse.com/#feat=object-fit DÜZENLEME: aslında, her zamanki gibi, sadece MS tarayıcıları bu konuda başarısız oluyor ... yine de oldukça fazla kullanım alanı gösteriyor: /
Brian H.

1
Bu tam olarak ihtiyacım olanı yapıyor :)
hcarreras

1
Bunu desteklemeyen yaygın olarak kullanılan tek tarayıcı Internet Explorer 11 ve Edge'dir. Kitlenize bağlı olarak, şu anda destek muhtemelen% 85-90 civarındadır, bu da bunu bazı senaryolar için geçerli kılabilir.
Husky

kral! harika bir çözüm !!
itzhar

1
Bu konuda iyi bir öğretici var: medium.com/@chrisnager/…
Pietro La Grotta

23

imgEtiketi olan ancak içermeyen örnekbackground-image

Bu çözüm imgetiketi korur, böylece görüntüyü kaydetmek için sürükleme veya sağ tıklama yeteneğini kaybetmeziz, ancak background-imagesadece css ile ortalayıp kırpmaz.

Çok yüksek görüntüler dışında en / boy oranını koruyun. (bağlantıyı kontrol edin)

(eylemde görüntüle)

Biçimlendirme

<div class="center-cropped">
    <img src="http://placehold.it/200x150" alt="" />
</div>

CSS

div.center-cropped {
  width: 100px;
  height: 100px;
  overflow:hidden;
}
div.center-cropped img {
  height: 100%;
  min-width: 100%;
  left: 50%;
  position: relative;
  transform: translateX(-50%);
}

Bunu deneyin ... eğer görüntü kaptan daha küçükse, ortalar
KnF

9

@ Russ'ın ve @ Alex'in cevaplarını kullanarak bir açısaljs direktifi oluşturdum

2014 ve sonrasında ilginç olabilir: P

html

<div ng-app="croppy">
  <cropped-image src="http://placehold.it/200x200" width="100" height="100"></cropped-image>
</div>

js

angular.module('croppy', [])
  .directive('croppedImage', function () {
      return {
          restrict: "E",
          replace: true,
          template: "<div class='center-cropped'></div>",
          link: function(scope, element, attrs) {
              var width = attrs.width;
              var height = attrs.height;
              element.css('width', width + "px");
              element.css('height', height + "px");
              element.css('backgroundPosition', 'center center');
              element.css('backgroundRepeat', 'no-repeat');
              element.css('backgroundImage', "url('" + attrs.src + "')");
          }
      }
  });

keman bağı


3
Hiya downvoters. Lütfen bir yorum bırakın, böylece bir hata varsa cevabımı güncelleyebilirim. Yanlış bilgi vermekten hoşlanmam. Şerefe.
mraaroncruz

Bir downvoter değil, ama bu Açısal bir soru değil ve cevabınız ilgisiz. @pferdefleisch
mawburn

1
@mburn mantıklı. 3 yıl oldu ve bu muhtemelen biraz yersiz ya da iğrenç görünüyor. Yine de bırakacağım çünkü yorumumdaki upvotes bana en az birkaç kişinin yararlı bulabileceğini söylüyor (ya da yorum yapmadan downvotes'u sevmiyorlar).
mraaroncruz

2

Bunu dene:

#yourElementId
{
    background: url(yourImageLocation.jpg) no-repeat center center;
    width: 100px;
    height: 100px;
}

Bunu unutmayın widthve heightyalnızca DOM öğenizin düzeni varsa (a divveya an gibi bir blok görüntülenen öğe img). Değilse (örneğin, bir açıklık), display: block;CSS kurallarına ekleyin . CSS dosyalarına erişiminiz yoksa stilleri öğeye satır içi bırakın.


çoğu durumda, bu CSS farklı görüntülerle tekrar tekrar kullanılır. bu nedenle, arka plan resmini satır içine ayarlamak kaçınılmazdır.
Raptor

0

Görüntüyü ortalayarak kırpmanın başka bir yolu daha vardır:

.thumbnail{position: relative; overflow: hidden; width: 320px; height: 640px;}
.thumbnail img{
    position: absolute; top: -999px; bottom: -999px; left: -999px; right: -999px;
    width: auto !important; height: 100% !important; margin: auto;
}
.thumbnail img.vertical{width: 100% !important; height: auto !important;}

İhtiyacınız olan tek şey dikey görüntülere "dikey" sınıf eklemek, bunu bu kodla yapabilirsiniz:

jQuery(function($) {
    $('img').one('load', function () {
        var $img = $(this);
        var tempImage1 = new Image();
        tempImage1.src = $img.attr('src');
        tempImage1.onload = function() {
            var ratio = tempImage1.width / tempImage1.height;
            if(!isNaN(ratio) && ratio < 1) $img.addClass('vertical');
        }
    }).each(function () {
        if (this.complete) $(this).load();
    });
});

Not: "! İmportant", img etiketindeki olası genişlik, yükseklik niteliklerini geçersiz kılmak için kullanılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.