- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有什么方法可以让background-position
接受百分比值?目前,我的按钮仅适用于width
和background-position
的显式值。
body {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
}
.button {
display: flex;
justify-content: center;
align-items: center;
text-decoration: none;
color: white;
font-weight: bold;
width: 350px;
height: 50px;
border: 1px solid green;
transition: background 0.5s;
background-repeat: no-repeat;
background-image: linear-gradient(to left, #2484c6, #1995c8 51%, #00bbce), linear-gradient(to right, #2484c6 0%, #1995c8 51%, #00bbce 76%);
}
.button-pixel {
background-position: -350px 0px, 0px 0px;
}
.button-pixel:hover {
background-position: 0px 0px, 350px 0px;
}
.button-percentage {
background-position: -100% 0px, 0px 0px;
}
.button-percentage:hover {
background-position: 0% 0px, 100% 0px;
}
<a href="#" class="button button-pixel">In Pixel</a>
<a href="#" class="button button-percentage">In Percentage</a>
最佳答案
TL; DR
当使用渐变作为背景时,与background-position
一起使用的所有百分比值都是等效的,因此不会有任何区别。您需要指定与容器大小不同的background-size
:
body {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
min-height:90vh;
}
.button {
text-decoration: none;
color: white;
font-weight: bold;
width: 350px;
height: 50px;
text-align:center;
transition: background 0.5s;
background-repeat: no-repeat;
background-image:
linear-gradient(to left, #2484c6, #1995c8 51%, #00bbce),
linear-gradient(to right, #2484c6 0%, #1995c8 51%, #00bbce 76%);
background-size:200% 100%; /*Changed this*/
}
.button-pixel {
background-position: -350px 0px, 0px 0px;
}
.button-pixel:hover {
background-position: 0px 0px, 350px 0px;
}
.button-percentage {
background-position: 100% 0px, 0px 0px;
}
.button-percentage:hover {
background-position: 0% 0px, 100% 0px;
}
<a href="#" class="button button-pixel">Pixel</a>
<a href="#" class="button button-percentage">Percentage</a>
background-position
的工作原理。
top
/
left
与定位元素一起使用:
.b {
width:200px;
height:200px;
background:url(https://picsum.photos/100/100?image=1069) no-repeat;
border:1px solid;
background-position:0 0;
position:relative;
animation:back 5s infinite linear alternate;
}
.b:before {
content:"";
position:absolute;
top:0;
left:0;
width:10px;
height:10px;
background:red;
animation:change 5s infinite linear alternate;
}
@keyframes back{to{background-position:200px 200px;}}
@keyframes change{to{top:200px; left:200px;}}
<div class="b"></div>
.b {
width:200px;
height:200px;
background:url(https://picsum.photos/100/100?image=1069) no-repeat;
border:1px solid;
background-position:0% 0%;
position:relative;
animation:back 3s infinite linear alternate;
}
.b:before {
content:"";
position:absolute;
top:0;
left:0;
width:10px;
height:10px;
background:red;
animation:change 3s infinite linear alternate;
}
@keyframes back{to{background-position:100% 100%;}}
@keyframes change{to{top:200px; left:200px;}}
<div class="b"></div>
background-position
的
30% 30%
):
30% 30%
的位置。然后,考虑到容器的大小,将该点放置在容器内从左上角到30% 30%
处的50% 50%
处。100% 100%
(中间)100% 0%
(右下)background-size
(右上).b {
width:200px;
height:200px;
background:url(https://picsum.photos/200/200?image=1069) no-repeat;
border:1px solid;
background-position:0% 0%;
position:relative;
animation:back 5s infinite linear alternate;
}
.b:before {
content:"";
position:absolute;
top:0;
left:0;
width:10px;
height:10px;
background:red;
animation:change 5s infinite linear alternate;
}
@keyframes back{to{background-position:100% 100%;}}
@keyframes change{to{top:100%; left:100%;}}
<div class="b"></div>
background-size
,则渐变的大小将为其容器的大小,这与使用图像不同。background-position
的specification,我们可以看到您的问题是如何产生的:If both values are auto then the intrinsic width and/or height of the image should be used, if any, the missing dimension (if any) behaving as auto as described above. If the image has neither an intrinsic width nor an intrinsic height, its size is determined as for contain.
contain
Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.
A bitmap image (such as JPG) always has intrinsic dimensions and proportions.
CSS
<gradient>
s have no intrinsic dimensions or intrinsic proportions.ref
background-position
会起作用。但是渐变没有内在值,因此渐变的尺寸将等于其容器的大小,带有百分比值的background-size
永远不会起作用,除非我们指定与其容器尺寸不同的background-size
。0%
和100%
之间使用值时100%
是如何工作的,但是使用负值或大于-50% 0
的值又如何呢?逻辑是相同的,但是找到参考点会比较棘手。-50%
放置背景。在这种情况下,参考点将在图像之外。这是一个例子:.b {
width:200px;
height:200px;
border:1px solid;
background:url(https://picsum.photos/100/100?image=1069) -50% 0/100px 100px no-repeat;
}
<div class="b"></div>
-50px
,即-50%
,以定义我们的参考点(即,从图像左边缘起-50px)。然后,考虑容器的大小(距离容器左边缘100像素),将该点放置在100px
上。然后我们绘制图像,并获得以上结果。仅图像的-50% 0
是可见的。-50px 0
与150px 150px
相同。.b {
width:200px;
height:200px;
display:inline-block;
border:1px solid;
background:url(https://picsum.photos/100/100?image=1069) -50% 0/100px 100px no-repeat;
}
.a{
background:url(https://picsum.photos/100/100?image=1069) -50px 0/100px 100px no-repeat;
}
<div class="b">
</div>
<div class="b a">
</div>
-50% 0
,-25px 0
将与50%
相同。50%
将增加,而容器的150% 0
将保持相同。.b{
width:200px;
height:200px;
border:1px solid;
background:url(https://picsum.photos/300/300?image=1069) -50% 0/50px 50px no-repeat;
animation:change 2s linear infinite alternate;
}
@keyframes change{
to {background-size:300px 300px}
}
<div class="b">
</div>
.b {
width:200px;
height:200px;
border:1px solid;
background:linear-gradient(to right,red,blue) -50% 0/50px 150px no-repeat;
animation:change 2s linear infinite alternate;
}
@keyframes change{
to {background-size:300px 150px}
}
<div class="b">
</div>
150%
定义背景,那么我们从左边缘考虑参考点50%
(或从右边缘考虑150%
),然后从容器的左边缘放置150% 0
。.b {
width:200px;
height:200px;
border:1px solid;
background:url(https://picsum.photos/100/100?image=1069) 150% 0/100px 100px no-repeat;
}
<div class="b"></div>
150px 0
等效于[0% 100%]
,并且如果我们开始增加背景大小,我们将具有与先前演示的相同的行为:.b {
width:200px;
height:200px;
border:1px solid;
background:url(https://picsum.photos/300/300?image=1069) 150% 0/50px 50px no-repeat;
animation:change 2s infinite linear alternate;
}
@keyframes change {
to {background-size:300px 300px}
}
<div class="b"></div>
Ws
范围之外的值可以隐藏背景图像,但是如何找到确切的值以完全隐藏图像呢?Wp
,容器的宽度为p
,我们需要找到200px
的值。从图中我们可以得到以下公式:p * Wp = p * Ws + Ws <=> p = Ws/(Wp - Ws) where p in [0,1]
100px
,图像是p
,那么1
是100%
,所以是-100%
(我们当然加上了负号,它是background-size
)。background-size
而不是固定值的百分比值,则可以使其更通用。假设S%
是Ws = Wp * s (s in [0,1] and S=s*100%)
。然后我们将得到p = s / (s - 1)
,公式将是p = Ws/(Wp - Ws) <=> p = s / (1 - s)
100%
。p'%
。100% + p%
为p' = 1 + p --> p' = 1 + s / (1 - s) = 1 / (1 - s)
,公式为s=0.5
。.b {
width:200px;
height:50px;
margin:5px;
border:1px solid;
background:linear-gradient(to right,red,blue) no-repeat;
background-size:calc(var(--s) * 100%) 100%;
animation:change 4s linear infinite alternate;
}
@keyframes change{
from { /*Hide on the left*/
background-position:calc(var(--s)/(var(--s) - 1) * 100%)
}
to { /*Hide on the right*/
background-position:calc(1/(1 - var(--s)) * 100%)
}
}
<div class="b" style="--s:0.5">
</div>
<div class="b" style="--s:0.8">
</div>
<div class="b" style="--s:2">
</div>
background-size
时,我们的50%
等于-100%
,百分比值将从200%
到s=2
。在这种情况下,我们从负值开始,以正值结束,因为图像的大小小于容器的大小。如果我们考虑最后一种情况(background-size
),则200%
等于200%
,并且百分比值将从-100%
到background-position:X Y
。我们以一个正值开始,以一个负值结束,因为图像的大小大于容器的大小。background-position:Px Py
。Y + Py * Ws = Py * Wp
。Ws
其中Wp
是图像的宽度,Y = Py * (Wp - Ws)
是容器的宽度(对于X轴,考虑高度的公式相同)。Wp = Ws
。根据该公式,我们可以验证两点,如前所述:Y
时,该公式不再有效,它可以确认当图像的大小与容器相同时,百分比值不起作用。因此像素和百分比值之间没有关系。 Py
和Wp > Ws
将具有相同的符号,而Wp < Ws
时将具有相反的符号。这确认了百分比值的行为取决于图像的大小。 background-size
的百分比值,我们也可以用不同的方式表达公式。我们将拥有Y = Py * Wp * (1-s)
。.b {
width:200px;
height:50px;
margin:5px;
border:1px solid;
background:linear-gradient(to right,red,blue) no-repeat;
background-size:calc(var(--s) * 100%) 100%;
animation:percentage 2s linear infinite alternate;
}
.box.a {
animation-name:pixel;
}
@keyframes percentage{
from { background-position:-50%;}
to { background-position:150%;}
}
@keyframes pixel{
from { background-position:calc(-0.5 * 200px * (1 - var(--s))) }
to { background-position:calc(1.5 * 200px * (1 - var(--s)));}
}
<div class="b" style="--s:0.5">
</div>
<div class="b a" style="--s:0.5">
</div>
<div class="b" style="--s:2">
</div>
<div class="b a" style="--s:2">
</div>
background-position
添加更多值来更改此引用。background-position: X Y
与background-position: left X top Y
等效(位于X
中left
和Y
中top
的位置)。通过调整top
和/或left
,我们可以更改参考以及图像的放置方式。这里有些例子:.b {
width:150px;
height:150px;
display:inline-block;
background:url(https://picsum.photos/70/70?image=1069) no-repeat;
border:1px solid;
position:relative;
}
body {
margin:0;
}
<div class="b"></div>
<div class="b" style="background-position:left 0 bottom 0"></div>
<div class="b" style="background-position:right 0 bottom 0"></div>
<div class="b" style="background-position:right 0 top 0"></div>
<div class="b" style="background-position:right 10% top 30%"></div>
<div class="b" style="background-position:right 10% bottom 30%"></div>
<div class="b" style="background-position:right 10px top 20px"></div>
<div class="b" style="background-position:left 50% bottom 20px"></div>
X
值,我们只能使用left
和right
(水平位置),对于Y
值,我们只能使用bottom
和top
(垂直位置)。通过所有不同的组合,我们可以在逻辑上获得4个不同的角。.b {
width:200px;
height:50px;
margin:5px;
border:1px solid;
background:linear-gradient(to right,red,blue) no-repeat;
background-size:calc(var(--s) * 100%) 100%;
animation:change 4s linear infinite alternate;
}
@keyframes change{
from {
background-position:left calc(var(--s)/(var(--s) - 1) * 100%) top 0
}
to {
background-position:right calc(var(--s)/(var(--s) - 1) * 100%) top 0
}
}
<div class="b" style="--s:0.5">
</div>
<div class="b" style="--s:0.8">
</div>
<div class="b" style="--s:2">
</div>
s=0.5
,我们将不再从-100%
动画化为200%
,但是将从left -100%
动画化为right -100%
。.b {
width:200px;
height:200px;
background:url(https://picsum.photos/100/100?image=1069) no-repeat;
border:1px solid;
background-repeat:no-repeat;
animation:change 2s infinite linear;
}
@keyframes change{
0%{background-position:left 20px top 20px;}
25%{background-position:right 20px top 20px;}
50%{background-position:right 20px bottom 20px;}
75%{background-position:left 20px bottom 20px;}
100%{background-position:left 20px top 20px;}
}
<div class="b"></div>
calc()
来进行一些涉及不同单位的复杂计算。例如,我们可以编写width:calc(100px + 20% + 12em)
,浏览器将考虑每个单元的工作方式来计算计算值,并以像素值结尾(在这种情况下)。background-position
呢?如果我们编写calc(50% + 50px)
,它将被评估为百分比值还是像素值?像素值会转换为百分比还是相反?background-position
中混合百分比和像素值时,calc()
具有特殊的行为,其逻辑如下:calc(50% + 50px)
的意思是:将图片居中,然后将其向左移动50px。.b {
width:200px;
height:200px;
display:inline-block;
border:1px solid;
background-image:
linear-gradient(red,red),
linear-gradient(red,red),
linear-gradient(red,red),
linear-gradient(red,red);
background-size:20px 20px;
background-position:
calc(50% + 20px) 50%,
calc(50% - 20px) 50%,
50% calc(50% - 20px),
50% calc(50% + 20px);
background-repeat:no-repeat;
transition:0.5s;
}
.b:hover {
background-position:50%;
}
<div class="b"></div>
<div class="b" style="width:100px;height:100px;"></div>
calc()
混合这两个红色方块非常容易。calc(10% + 20px + 30% + -10px + 10% + 20px)
。浏览器将如何处理?calc(X% + Ypx)
,然后应用上述逻辑来定位图像。calc(10% + 20px + 30% + -10px + 10% + 20px)
calc((10% + 30% + 10%) + (20px + -10px +20px))
calc(50% + 30px)
.box {
display:inline-block;
width:200px;
height:200px;
background-image:url(https://picsum.photos/100/100?image=1069);
border:1px solid;
background-position:calc(10% + 20px + 30% + -10px + 10% + 20px) 0;
background-repeat:no-repeat;
}
.alt {
background-position:calc(50% + 30px) 0;
}
<div class="box"></div>
<div class="box alt"></div>
background-origin
指定为了执行所有先前的逻辑,我们需要考虑使用哪个框。.b {
display:inline-block;
width:200px;
height:200px;
background:
url(https://picsum.photos/100/100?image=1069) no-repeat,
linear-gradient(to right,red,blue) bottom/100% 20% no-repeat;
border:20px solid rgba(0,0,0,0.1);
padding:20px;
box-sizing:border-box;
background-origin:border-box;
}
.p {
background-origin:padding-box; /*the default value*/
}
.c {
background-origin:content-box;
}
<div class="b"></div>
<div class="b p"></div>
<div class="b c"></div>
content-box
时,它等于padding-box
;而当我们没有边框时,border-box
时,它等于padding-box
。.b {
width:200px;
height:200px;
border:1px solid;
position:relative;
z-index:0;
overflow:hidden;
}
.b:before {
content:"";
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
z-index:-1;
background:url(https://picsum.photos/200/200?image=1069);
background-size:100% 100%;
transition:1s;
}
.b:hover::before {
transform:translate(100%,100%);
}
<div class="b"></div>
left
/ top
,但是transform
将具有更好的性能。background-origin
100%
来覆盖填充并使图像填充容器。.b {
width:200px;
height:200px;
outline:1px solid;
padding:0 100px 100px 0;
box-sizing:border-box;
z-index:0;
overflow:hidden;
background:url(https://picsum.photos/200/200?image=1069) no-repeat;
background-origin:content-box;
background-size:200% 200%;
transition:0.8s;
}
.b:hover {
background-position:-200% -200%;
/* We use [0%,-200%] to cover [0%,100%]*/
}
<div class="b"></div>
200%
中的background-size
进行纠正。对于background-position
,现在可以轻松根据上述说明找到所需的值。.b {
width:200px;
height:200px;
outline:1px solid;
padding:50px;
box-sizing:border-box;
z-index:0;
overflow:hidden;
background:url(https://picsum.photos/200/200?image=1069) no-repeat;
background-origin:content-box;
background-size:200% 200%;
background-position:50% 50%;
transition:0.8s;
}
.b:hover {
background-position:-150% -150%;
/* We use [50%,-150%] to cover [0%,100%]*/
}
<div class="b"></div>
em
,ch
等)的行为与px
相同。它们称为lengths。
关于css - 在线性梯度上使用背景位置的百分比值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51731106/
我正在尝试获取从过去的 startposition/location 到当前移动的 currentposition/location 的距离(以米为单位)。 我确实有工作正常的currentposit
所以我有一堆绝对覆盖的 div。用户通过在叠加层上拖动来创建方形 div。如果您要创建一个 div,然后放大和缩小,div 会保持在同一位置,因为它对叠加层是绝对的,如前所述。 然而问题就出在这里。您
我想找到 View 在显示屏幕上的位置。 为此,我使用了 view.getLeft() 、view.getBottom() 、view.getRight() 等方法> , view.getTop()。
我有一个看起来像这样的 View 层次结构(基于其他答案和 Apple 的使用 UIScrollView 的高级 AutoLayout 指南): ScrollView 所需的2 个步骤是: 为 Scr
所以我有一个名为 MARKS 的表,我有这些列 STUDENT_ID, CLASSFORM_NAME, ACADEMIC_YEAR, TERM, SUBJECT_NAME, TOTAL_MARKS
我有一个问题我无法理解,请帮助: 我开发了带有图像的 html 页面,并使用 jQuery UI 帮助使它们可拖动,我将这些图像位置设置为相对位置并给出了左侧和顶部像素,这是页面的链接 http://
我正在尝试创建一个 CSS 动画,它在 sprite 表中循环播放 16 个图像,给人一种幽灵“漂浮”的错觉。动画通过在 background-position 位置之间移动以显示不同状态的幽灵来实现
我正在创建这个网站的 WebView https://nearxt.com/打开时询问位置但是当我使用此链接在 flutter 中创建 webview 时那么它就无法定位我还在应用程序中定义了位置,但
我正在以编程方式创建一个需要跨越 2 个屏幕的窗口。正在创建的窗口的大小是正确的,但窗口大约从第一个屏幕的一半开始。我可以将它拖回第一个屏幕的开头,NSWindow 非常适合。 我只需要知道在窗口的起
位置“/”的匹配叶路由没有元素。这意味着默认情况下它将呈现一个空值,从而导致一个“空”页面 //App.js File import { BrowserRouter as Router, Routes
我有一个运行 Ubuntu 和 Apache 的 VPS 例如,假设地址是:5.5.5.5 在 VPS 上,我有一个名为 eggdrop 的用户(除了我的 root 用户)。 用户 eggdrop 有
我有一个 JLabel与 ImageIcon ,我使用 setIcon() JLabel中的函数. ImageIcon然后上来,坐在我的JLabel 的文字左侧.是否有可能拥有 ImageIcon在文
我的图中有节点,它们的 xlabels 位于它们的左上方。我怎样才能改变这个位置?我希望 xlabels 正好位于节点本身的旁边。 最佳答案 xlp是你想要的属性,但它没有做任何事情。 你不能改变位置
我对基本的 VIM 功能有疑问:(我尝试谷歌搜索但找不到答案) 如何列出所有自定义功能。(我做了 :function 并且不能找到我的自定义函数) 如何获得自定义函数列表中的函数(或它们的存储位置)。
我是 PHP 的新手,虽然我一直在搜索,但我不知道该怎么做。 我知道可以使用 Location("some page") 进行重定向。我还读到,只要没有向用户显示任何内容,它就可以工作。 我想做的是:
如果在 jgrowl.css 中位置更改为“center”,我如何将其覆盖为默认值,即“top-right” $.jGrowl(data, { header: 'data', an
我需要根据用户是否滑动屏幕顶部、屏幕中间或屏幕底部来触发不同的事件。我正在尝试找出最好/最简单的方法来做到这一点,因为我很确定没有办法从 UISwipeGestureRecognizer 获取位置。
我需要枚举用delphi编写的外部应用程序中使用的类 ,因此我需要访问VMT表以获取该信息,但是我找不到任何有关如何在exe(由delphi生成)文件中找到VMT(虚拟方法表)的位置(地址)的文档。
在 D2010 (unicode) 中是否有像 Pos 这样不区分大小写的类似函数? 我知道我可以使用 Pos(AnsiUpperCase(FindString), AnsiUpperCase(Sou
我正在尝试为我的reveal.js 演示文稿制作一个标题,该标题会粘贴在屏幕顶部。标题中的内容在每张幻灯片的基础上都是动态的,因此我必须将标记放在 section 标记中。 显然,如果标记在 sect
我是一名优秀的程序员,十分优秀!