英文:
CSS to display bitmap, resized keeping aspect ratio, cropped to a circle
问题
我想在我的Blazor(服务器端)应用程序的菜单栏中显示用户的头像。所以我使用<img>
来显示位图。但是我需要对这个图像做两件事。
首先,将其调整大小为24x24,保持纵横比且不裁剪。因此,如果我有一个64x32的图像,它会将其大小调整为24x12,并居中显示在显示区域中,两侧的24x6使用背景颜色填充。
其次,将其裁剪成一个圆形,24x24区域外的一切都是页面背景。
我有98%的把握这可以通过CSS来实现,但我尝试过的一切都一团糟。
英文:
I want to show the avatar of a user in the menu bar of my Blazor (server side) app. So I use <img>
to display the bitmap. But I need to do two things with the image.
First, resize it to 24x24, keeping the aspect ratio and no cropping. So if I am given an image that is 64x32, then it sizes it to 24x12, centered in the display area, with the background color for the 24x6 on either side of it.
Second, crop it to a circle where everything outside the circle in the 24x24 area is the page background.
I'm 98% certain this can be done with css but everything I've tried has been a mess.
答案1
得分: 3
以下是您要翻译的内容:
Background positioning and sizing is a powerful tool in browsers. You can always:
- put the image in the background,
- size it so it is always contained inside the element (hence no cropping)
- center the background image (so if it's smaller than the element size you specified or it has a different aspect ratio, it's still visible properly)
For some sketchy browsers, you can add a transparent PNG image as the image src
, so it doesn't show a broken image placeholder (that's the data URL in the src
).
For the circled effect with transparent areas around the circle, use border-radius
. A 50% border radius will result in a circle, when you have equal length sides.
Update:
Same thing with src
attribute and CSS object-fit
and object-position
:
Update 2
Advantages/disadvantages of the two solutions, regarding the use case in this question:
While I listed these as advantages and disadvantages, it is true only when these technologies are used what they were intended for (which we don't always do).
Background image solution
- Advantages:
- supported by every graphical browser in existence
- mature technology, no bugs
- Disadvantages (In some cases they may be advantages, depending on what would you'd like to achieve)
- The images used in this way will not be printed
- The images used in this way won't be indexed by search engines
- If not properly labelled (
title
,alt
), screen readers will ignore them
Src
solution
- Advantages:
- Printed
- Indexed in search engines
- Disadvantages
- While the technology has matured in the past few years, it's still not supported in older browsers. A particular browser of interest is Internet Explorer and older versions of Safari
- If your target audience is known to be using outdated browsers, this solution is a deal breaker (as it simply doesn't work, or may be buggy)
Conclusion
If you don't care about older browsers or printing/SEO is important consideration, the src
/object-*
version should be used. This technology is working the way it is intended when working with contextual images.
If legacy browser support is a must, then the background image solution should be used (as the src
solution won't degrade gracefully).
英文:
Background positioning and sizing is a powerful tool in browsers. You can always:
- put the image in the background,
- size it so it is always contained inside the element (hence no cropping)
- center the background image (so if it's smaller than the element size you specified or it has a different aspect ratio, it's still visible properly)
For some sketchy browsers, you can add a transparent PNG image as the image src
, so it doesn't show a broken image placeholder (that's the data URL in the src
).
For the circled effect with transparent areas around the circle, use border-radius
. A 50% border radius will result in a circle, when you have equal length sides.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
.resizable-image {
background-size: contain;
background-repeat: no-repeat;
background-position: center center;
}
.circled {
border-radius: 50%;
}
.s-32 {
width: 32px;
height: 32px;
}
<!-- language: lang-html -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" class="resizable-image circled s-32" style="background-image:url('https://i.stack.imgur.com/e33ew.jpg?s=64&g=1')" />
<!-- end snippet -->
Update:
Same thing with src
attribute and CSS object-fit
and object-position
:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-css -->
.resizable-image {
object-fit: contain;
object-position: center center;
}
.circled {
border-radius: 50%;
}
.s-32 {
width: 32px;
height: 32px;
}
<!-- language: lang-html -->
<img class="resizable-image circled s-32" src="https://i.stack.imgur.com/e33ew.jpg?s=64&g=1" />
<!-- end snippet -->
Update 2
Advantages/disadvantages of the two solutions, regarding the use case in this question:
While I listed these as advantages and disadvantages, it is true only when these technologies are used what they were intended for (which we don't always do).
Background image solution
- Advantages:
- supported by every graphical browser in existence
- mature technology, no bugs
- Disadvantages (In some cases they may be advantages, depending on what would you'd like to achieve)
- The images used in this way will not be printed
- The images used in this way won't be indexed by search engines
- If not properly labelled (
title
,alt
), screen readers will ignore them
Src
solution
- Advantages:
- Printed
- Indexed in search engines
- Disadvantages
- While the technology has matured in the past few years, it's still not supported in older browsers. A particular browser of interest is Internet Explorer and older versions of Safari
- If your target audience is known to be using outdated browsers, this solution is a deal breaker (as it simply doesn't work, or may be buggy)
Conclusion
If you don't care about older browsers or printing/SEO is important consideration, the src
/object-*
version should be used. This technology is working the way it is intended when working with contextual images.
If legacy browser support is a must, then the background image solution should be used (as the src
solution won't degrade gracefully).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论