马黑黑 发表于 2024-1-15 10:44

CSS实现单图背景不间断滚动演示及说明

本帖最后由 马黑黑 于 2024-1-15 10:46 编辑 <br /><br /><style>
.pa { font: normal 20px/24px sans-serif; }
.pa p { margin: 10px 0; }
.pa pre { padding: 10px; background: #eee; font-size: 16px; tab-size: 4; white-space: pre-wrap; word-wrap: break-word; }
#mydiv { margin: 20px auto; width: 600px; height: 400px; border: 1px solid red; background: url('https://638183.freep.cn/638183/t22/hl/229.jpg'); background-repeat: no-repeat; background-size: 100% 100%; }
.Mid { display: flex; align-content: center; }
.Mid input, .Mid label, .Mid output { margin-right: 10px; }
.Mid output { color: red; }
.Mid label { color: blue; }
.pa mark { background: lightblue; }
</style>

<div class="pa">

<p>以下示例展示背景图片的滚动,其中,滑杆改变背景图片的位置(background-position),复选按钮改变背景图片的重复属性(background-repeat):</p>
<div id="mydiv"></div>
<p class="Mid">
        <label for="prog">background-position : </label>
        <input id="prog" type="range" min="-600" max="600" value="0" />
        <output id="rngmsg">0px</output>
</p>
<p class="Mid">
        <label for="chkrepeat">background-repeat : </label>
        <input id="chkrepeat" type="checkbox" value="repeat" />
        <output id="repeatmsg">no-repeat</output>
</p>
<p>【附】</p>
<h2>一、红色边框div的CSS核心代码:</h2>
<pre>
#mydiv {
        width: 600px;
        height: 400px;
        border: 1px solid red;
        background: url('https://638183.freep.cn/638183/t22/hl/229.jpg');
        background-repeat: no-repeat;
        background-size: 100% 100%;
        background-position: 0 0;
}
</pre>
<h2>二、设置说明:</h2>
<p>(一)盒子无需过多关心背景图片的实际宽高,因为我们使用<mark> background-size: 100% 100%; </mark>强制背景图片按盒子宽高尺寸呈现,图片将全影显示,虽然可能会有点比例失调。一般的建议是,盒子宽高和图片实际宽高最好是正比关系,至少不要有太大的误差。</p>
<p>(二)要让背景图片无间断衔接着滚动,需要将<mark> background-repeat </mark>属性设置为<mark> repeat </mark>(或根据需要设置为<mark> repeat-x </mark>、<mark> repeat-y </mark>),原因是,只有设置为背景重复,背景位置改变到一定程度时才不会断档,从而实现不间断滚动。但要实现无缝衔接的话,需要图片的支持,具体说就是,图片的左右区域相似或相同(水平滚动时)或图片的上下区域相似或相同(垂直滚动时),可以很容易地使用作图软件对图片进行简单加工以满足此要求。</p>
<p>(三)<mark> background-position </mark>属性是滚动的关键,它设置背景图片X方向和Y方向的位置,<mark> 0 0 </mark>表示背景图片始于盒子的左上角,然后,令<mark> background-position </mark>的值按盒子的尺寸改变,比如水平移动,示例盒子的宽度是<mark> 600px </mark>,则,如果往<mark> -600px </mark>改变,背景图片将自右向左滚动,反之,如果往<mark> 600px </mark>改变,背景图片将自左向右滚动。</p>
<p>(四)在以上思路基础上,可以为<mark> background-position </mark>设置CSS关键帧动画,这样就可以实现背景图片不间断无缝滚动(楼下展示)。</p>

</div>

<script>
prog.oninput = () => {
        rngmsg.value = prog.value + 'px';
        mydiv.style.setProperty('background-position',prog.value + 'px 0');
};
chkrepeat.oninput = () => {
        repeatmsg.value = chkrepeat.checked ? ' repeat' : ' no-repeat';
        mydiv.style.setProperty('background-repeat', chkrepeat.checked ? 'repeat' : 'no-repeat');
};
</script>

马黑黑 发表于 2024-1-15 10:46

<style>
#bgmovebox {
        margin: 0 0 0 calc(50% - 593px);
        width: 1024px;
        height: 576px;
        border: 1px solid gray;
        background: url('https://638183.freep.cn/638183/t22/hl/230.png');
        background-repeat: repeat;
        background-size: 100% 100%;
        background-position: 0 0;
        animation: mov 20s infinite linear;
        position: relative;
}

@keyframes mov {
        to { background-position: -1024px 0; }
}
</style>

<div id="bgmovebox"></div>

马黑黑 发表于 2024-1-15 10:48

二楼效果代码

<style>
#bgmovebox {
        margin: 0 0 0 calc(50% - 593px);
        width: 1024px;
        height: 576px;
        border: 1px solid gray;
        background: url('https://638183.freep.cn/638183/t22/hl/230.png');
        background-repeat: repeat;
        background-size: 100% 100%;
        background-position: 0 0;
        animation: mov 20s infinite linear;
        position: relative;
}

@keyframes mov {
        to { background-position: -1024px 0; }
}
</style>

<div id="bgmovebox"></div>这里,盒子和图片的尺寸,高度一致,宽度 盒子:图片=1:2

马黑黑 发表于 2024-1-15 10:56

背景滚动早些时候我有过介绍,不过可能当时没有说得像现在解释的那么清晰

庶民 发表于 2024-1-15 11:10

我学了几天,太难了。

醉美水芙蓉 发表于 2024-1-15 11:36

醉美水芙蓉 发表于 2024-1-15 11:37

醉美水芙蓉 发表于 2024-1-15 11:38

马黑黑 发表于 2024-1-15 12:02

醉美水芙蓉 发表于 2024-1-15 11:38
谢谢黑黑老师分享教程!

{:4_190:}

马黑黑 发表于 2024-1-15 12:04

庶民 发表于 2024-1-15 11:10
我学了几天,太难了。

如果没有较为全面的基础,学起来会有点慢。不过一切靠积累,过了一些坎之后,一切都将很明朗。

起个网名好难 发表于 2024-1-15 12:18

马黑黑 发表于 2024-1-15 10:48
二楼效果代码

这里,盒子和图片的尺寸,高度一致,宽度 盒子:图片=1:2

https://pic.rmb.bdstatic.com/bjh/down/0ef2b35c33169916c5826bfc2b143839.jpeg

亚伦影音工作室 发表于 2024-1-15 13:36

这个不错实现了无缝对接滚动!

红影 发表于 2024-1-15 14:48

这个特别好,我知道我前面的那个帖子应该怎么修改了{:4_199:}

红影 发表于 2024-1-15 14:52

这个好像以前有过背景滚动的帖子,我去找找。。。

红影 发表于 2024-1-15 15:00

翻到了,也是用background-position的改变来实现的{:4_173:}

红影 发表于 2024-1-15 15:25

无缝动态背景
https://www.huachaowang.com/forum.php?mod=viewthread&tid=57836&fromuid=2
(出处: 花潮论坛)
无题(致东篱闲人)
https://www.huachaowang.com/forum.php?mod=viewthread&tid=57833&fromuid=2
(出处: 花潮论坛)

马黑黑 发表于 2024-1-15 18:15

红影 发表于 2024-1-15 15:25
无缝动态背景
https://www.huachaowang.com/forum.php?mod=viewthread&tid=57836&fromuid=2
(出处: 花潮 ...

是吧?我有印象介绍过的

马黑黑 发表于 2024-1-15 18:16

红影 发表于 2024-1-15 14:48
这个特别好,我知道我前面的那个帖子应该怎么修改了

这个,一楼的演示,会帮助理解

马黑黑 发表于 2024-1-15 18:16

红影 发表于 2024-1-15 15:00
翻到了,也是用background-position的改变来实现的

就是用这个属性的

马黑黑 发表于 2024-1-15 18:17

红影 发表于 2024-1-15 14:52
这个好像以前有过背景滚动的帖子,我去找找。。。

{:4_181:}
页: [1] 2 3 4 5 6
查看完整版本: CSS实现单图背景不间断滚动演示及说明