给定任意图像,我想从图像中心裁剪一个正方形并将其显示在给定的正方形内。
这个问题与此类似:CSS显示已调整大小并裁剪的图像,但我不知道图像的大小,因此无法使用设置的边距。
给定任意图像,我想从图像中心裁剪一个正方形并将其显示在给定的正方形内。
这个问题与此类似:CSS显示已调整大小并裁剪的图像,但我不知道图像的大小,因此无法使用设置的边距。
Answers:
一种解决方案是使用以元素大小为裁剪尺寸的元素为中心的背景图像。
.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>
img
标签示例此版本保留了img
标签,因此我们不会失去拖动或右键单击以保存图像的功能。信贷帕克贝内特不透明度伎俩。
.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
的CSS3图像规范定义object-fit
和object-position
属性,它们一起允许对规模更大的控制和一个的图像内容的位置img
元素。有了这些,就有可能达到预期的效果:
.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" />
background-size: cover;
保持原始纵横比的同时适当缩小或填充div的图像。
img
的alt
ant title
属性将丢失。
object-fit: cover;
直接在img标签上使用,这会带来更多语义。
我一直在寻找使用img
标签的纯CSS解决方案(而不是背景图片)。
.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的答案,但它也允许纵向图像。
对我来说就像一个魅力。关于图像,您唯一需要知道的是它是纵向还是横向,以便设置.portrait
类,因此我不得不在这部分使用一些Javascript。
尝试以下操作:设置图像裁剪尺寸,并在CSS中使用以下行:
object-fit: cover;
img
标签但不带标签的示例background-image
该解决方案保留了img
标签,因此我们不会失去拖动或右键单击以保存图像的能力,而background-image
不仅仅是使用CSS居中和裁剪。
除非常高的图像外,请保持良好的宽高比。(检查链接)
标记
<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%);
}
我使用@Russ和@Alex的答案创建了angularjs指令
在2014年及以后可能会很有趣: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 + "')");
}
}
});
试试这个:
#yourElementId
{
background: url(yourImageLocation.jpg) no-repeat center center;
width: 100px;
height: 100px;
}
请记住,width
并且height
仅在您的DOM元素具有布局(显示为块的元素,如a div
或an img
)时才有效。如果不是(例如,一个跨度),则添加display: block;
到CSS规则。如果您无权访问CSS文件,请在元素中内联样式。
您还可以通过另一种方式裁剪图像居中图像:
.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;}
您唯一需要做的就是将“垂直”类添加到垂直图像中,您可以使用以下代码进行操作:
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();
});
});
注意:“!important”用于覆盖img标签上可能的宽度,高度属性。