织梦让图片栏目向左播放

99ANYc3cd6
预计阅读时长 29 分钟
位置: 首页 织梦建站 正文

这通常不是通过织梦后台的某个简单开关就能实现的,而是需要结合修改模板文件添加少量CSS/JavaScript代码来完成。

下面我将为你提供两种最常用、最有效的方法,并附上详细的步骤。


使用CSS动画实现平滑的无限向左滚动(推荐)

这种方法效果最好,图片会平滑、无缝地循环滚动,用户体验佳。

实现原理:

  1. HTML结构: 创建一个包含所有图片的容器,内部再包裹一个用于滚动的列表。
  2. CSS样式:
    • 将容器设置为overflow: hidden,隐藏超出部分。
    • 将内部列表设置为display: flex,让图片横向排列。
    • 使用CSS @keyframes 动画,让内部列表从右向左移动。
    • 通过animation-iteration-count: infinite让动画无限循环。
  3. 织梦调用: 使用织梦的 {dede:channel} 标签来循环调用栏目的缩略图。

详细操作步骤:

第一步:创建或修改模板文件

  1. 登录你的织梦后台,进入【模板】->【模板管理】。
  2. 找到你想要修改的栏目列表页模板(通常是 list_*.htm)或者首页模板 index.htm
  3. 在你希望显示滚动图片栏目的位置,添加以下HTML代码。
<!-- 这是一个示例,你可以根据需要调整样式类名 -->
<div class="channel-scroll-container">
    <div class="channel-scroll-list">
        {dede:channel type='top' row='10'}
        <a href="[field:typeurl/]">
            <img src="[field:typedir function='str_replace("{cmspath}", "", "@me")']/img/[field:typename/].jpg" alt="[field:typename/]">
        </a>
        {/dede:channel}
    </div>
</div>

代码解释:

  • {dede:channel type='top' row='10'}: 这是织梦的栏目调用标签。
    • type='top': 表示调用顶级栏目,如果你想调用当前栏目的子栏目,可以改成 type='son'type='self'
    • row='10': 表示调用10个栏目,你可以根据需要修改数量。
  • [field:typeurl/]: 栏目的链接地址。
  • [field:typedir/]: 栏目的目录地址。
  • 图片路径: img/[field:typename/].jpg 是一个常见的命名规则,即每个栏目下都有一个与栏目名同名的图片,请确保你的图片路径是正确的!你也可以直接使用 [field:litpic/] 来调用栏目缩略图。

第二步:添加CSS样式

  1. 在模板文件的 <head> 标签内,或者在外部CSS文件中,添加以下样式代码。
/* 容器:设置宽度和隐藏溢出 */
.channel-scroll-container {
    width: 100%; /* 或者你想要的固定宽度,如 1200px */
    height: 200px; /* 设置一个固定高度 */
    overflow: hidden;
    position: relative;
    margin: 20px auto;
    background-color: #f5f5f5; /* 可选:背景色 */
}
/* 滚动列表:使用flex布局横向排列 */
.channel-scroll-list {
    display: flex;
    height: 100%;
    animation: scroll-left 20s linear infinite; /* 调整 20s 来控制滚动速度 */
}
/* 列表中的每个链接和图片 */
.channel-scroll-list a {
    flex-shrink: 0; /* 防止图片被压缩 */
    margin-right: 20px; /* 图片之间的间距 */
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
}
.channel-scroll-list img {
    max-height: 180px; /* 设置图片最大高度 */
    object-fit: contain; /* 保持图片比例 */
}
/* 核心动画:从右向左移动 */
@keyframes scroll-left {
    0% {
        transform: translateX(0);
    }
    100% {
        /* 移动的距离是列表自身的宽度 */
        transform: translateX(-100%);
    }
}

CSS关键点:

  • overflow: hidden: 隐藏了超出容器的部分,这是实现滚动效果的基础。
  • display: flex: 让所有图片在一行内显示。
  • animation: scroll-left 20s linear infinite: 定义了动画名称、持续时间(20秒)、匀速运动和无限循环。
  • @keyframes scroll-left: 定义了动画的两个关键帧,从 translateX(0) (原地) 移动到 translateX(-100%) (向左移动自身宽度的距离)。

第三步:可选的优化(无缝循环)

上面的方法在动画重置时会有一个跳跃感,为了实现完美的无缝循环,我们可以复制一份列表内容。

修改HTML结构,将列表内容复制一份。

<div class="channel-scroll-container">
    <!-- 第一份列表 -->
    <div class="channel-scroll-list">
        {dede:channel type='top' row='10'}
        <a href="[field:typeurl/]">
            <img src="[field:typedir function='str_replace("{cmspath}", "", "@me")']/img/[field:typename/].jpg" alt="[field:typename/]">
        </a>
        {/dede:channel}
    </div>
    <!-- 第二份完全相同的列表 -->
    <div class="channel-scroll-list">
        {dede:channel type='top' row='10'}
        <a href="[field:typeurl/]">
            <img src="[field:typedir function='str_replace("{cmspath}", "", "@me")']/img/[field:typename/].jpg" alt="[field:typename/]">
        </a>
        {/dede:channel}
    </div>
</div>

修改CSS,让两个列表并排显示,并调整动画。

.channel-scroll-container {
    width: 100%;
    height: 200px;
    overflow: hidden;
    position: relative;
    margin: 20px auto;
}
/* 修改滚动列表,让它宽度为200%,容纳两份内容 */
.channel-scroll-list {
    display: flex;
    height: 100%;
    width: 200%; /* 关键修改 */
    animation: scroll-left 20s linear infinite;
}
/* 列表中的每个链接和图片 (样式不变) */
.channel-scroll-list a {
    flex-shrink: 0;
    margin-right: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
}
.channel-scroll-list img {
    max-height: 180px;
    object-fit: contain;
}
/* 动画时间可以缩短,因为现在要移动两份内容的距离 */
@keyframes scroll-left {
    0% {
        transform: translateX(0);
    }
    100% {
        transform: translateX(-50%); /* 关键修改:移动一半的宽度 */
    }
}

这样,当第一份列表完全滚出视野时,第二份列表刚好接上,动画循环,实现无缝效果。


使用JavaScript实现更灵活的控制

如果你需要更复杂的控制,比如鼠标悬停时暂停滚动,或者点击按钮控制滚动,那么使用JavaScript是更好的选择。

实现原理:

通过JS动态计算列表宽度,然后使用 setIntervalrequestAnimationFrame 来不断改变列表的 margin-left 值,从而实现滚动效果。

详细操作步骤:

第一步:HTML结构(与方法一相同)

<div class="channel-scroll-container-js">
    <div class="channel-scroll-list-js">
        {dede:channel type='top' row='10'}
        <a href="[field:typeurl/]">
            <img src="[field:typedir function='str_replace("{cmspath}", "", "@me")']/img/[field:typename/].jpg" alt="[field:typename/]">
        </a>
        {/dede:channel}
    </div>
</div>

第二步:CSS样式(基础样式)

.channel-scroll-container-js {
    width: 100%;
    height: 200px;
    overflow: hidden;
    position: relative;
    margin: 20px auto;
}
.channel-scroll-list-js {
    display: flex;
    height: 100%;
    /* 初始位置 */
    margin-left: 0; 
    transition: none; /* JS控制时,禁用CSS过渡 */
}
.channel-scroll-list-js a {
    flex-shrink: 0;
    margin-right: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
}
.channel-scroll-list-js img {
    max-height: 180px;
    object-fit: contain;
}

第三步:添加JavaScript代码

在模板文件的底部,</body> 标签之前,添加以下JS代码。

<script>
document.addEventListener('DOMContentLoaded', function() {
    const container = document.querySelector('.channel-scroll-container-js');
    const list = container.querySelector('.channel-scroll-list-js');
    // 克隆一份列表内容,用于无缝循环
    const listClone = list.cloneNode(true);
    container.appendChild(listClone);
    let scrollAmount = 0;
    const speed = 1; // 滚动速度,数值越大越快
    function scroll() {
        // 获取列表的总宽度
        const listWidth = list.scrollWidth;
        // 增加滚动距离
        scrollAmount -= speed;
        // 如果滚动距离超过列表宽度,重置到初始位置
        if (scrollAmount <= -listWidth) {
            scrollAmount = 0;
        }
        // 应用滚动
        list.style.marginLeft = scrollAmount + 'px';
        listClone.style.marginLeft = (scrollAmount + listWidth) + 'px';
    }
    // 使用 requestAnimationFrame 实现平滑动画
    function animate() {
        scroll();
        requestAnimationFrame(animate);
    }
    // 启动动画
    animate();
    // 鼠标悬停时暂停滚动
    container.addEventListener('mouseenter', function() {
        // 这里可以设置一个标志来暂停动画,或者直接操作DOM
        // 为了简单,我们可以让JS停止执行,但更好的做法是使用一个变量控制
        // window.isScrolling = false;
    });
    // 鼠标离开时恢复滚动
    container.addEventListener('mouseleave', function() {
        // window.isScrolling = true;
    });
});
</script>

JS代码解释:

  • cloneNode(true): 深度克隆列表,包括其所有子元素。
  • scrollWidth: 获取元素在不换行情况下的总宽度。
  • requestAnimationFrame(animate): 这是现代浏览器推荐的高性能动画方法,它会根据屏幕刷新率来调用animate函数,使动画非常流畅。
  • 鼠标事件 mouseentermouseleave 可以用来控制动画的暂停和恢复,你可以根据需要完善这部分逻辑。

总结与建议

特性 方法一 (CSS动画) 方法二 (JavaScript)
实现难度 简单,只需CSS 中等,需要JS知识
性能 优秀,由浏览器硬件加速 优秀,requestAnimationFrame 性能也很好
控制性 较弱,难以暂停/继续 非常灵活,可轻松实现暂停、调速、反向等
兼容性 所有现代浏览器 所有现代浏览器
推荐场景 简单、自动、无需用户交互的滚动 需要用户交互(如悬停暂停)或复杂控制的滚动

对于绝大多数“让图片向左播放”的需求,方法一(CSS动画) 已经足够好用且效果出色,是首选方案,如果你需要更高级的交互功能,再考虑使用方法二(JavaScript)

希望这个详细的教程能帮助你解决问题!

-- 展开阅读全文 --
头像
织梦CMS如何实现中英文双语?
« 上一篇 01-21
dede怎么下载远程图片大小
下一篇 » 01-21

相关文章

取消
微信二维码
支付宝二维码

目录[+]