CSS5 | CSS滑动门左扇与右扇图片重叠问题解决

本文中所使用的滑动门背景图片是自己用微软相册手工切的,没用ps,所以凑乎看吧

首先放出一张目标效果也是最终完成图

下面说问题

CSS推拉门原理

按原理来说,就是两个行内块前后站一行,然后前面的a标签和span标签分别是推拉门素材的左扇部分和右扇部分,然后跟随span的文字内容长度自动加长span背景,看起来就像是在加长,实则只是多放出隐藏的素材图片的剩余部分。

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        a {
            margin: 100px;
            height: 49px;
            display: inline-block;
            background-color: pink;
            padding-left: 15px;
        }

        a span {
            height: 49px;
            display: inline-block;
            background-color: purple;
            padding-right: 15px;
        }
    </style>
</head>
<body>
<a href="#"><span></span></a>
</body>
</html>

然后实际操作的时候问题就出在素材图片上了,我一开始使用的是没有白色背景的纯png抠图图标

yuanjiao-bgimg.png

代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>css滑动门原理</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        a {
            margin: 100px;
            height: 133px;
            display: inline-block;
            /*千万不能写死宽度,我们要推拉门*/
            background: url("../../img/yuanjiao-bgimg.png") no-repeat;
            /*background: pink no-repeat;*/
            padding-left: 35px;
        }

        a span {
            height: 133px;
            display: inline-block;
            background: url("../../img/yuanjiao-bgimg.png") no-repeat;
            /*background: purple no-repeat;*/
            padding-right: 55px;
        }

    </style>
</head>
<body>
<a href="#">
    <span></span>
</a>
</body>
</html>

出来的效果就是这样的

这样就出现素材图片重叠的问题

即使我们将span的素材图片定位到右侧

html 复制代码
a span {
            height: 133px;
            display: inline-block;
            background: url("../../img/yuanjiao-bgimg.png") no-repeat right;
            /*background: purple no-repeat;*/
            padding-right: 55px;
        }

也是会多出a标签的右侧角出来的

针对这个问题有两种方法

1.给素材图片加上与背景一样的颜色,从素材图片上入手

new-yuanjiao-bgimg.png

这个是修改后的图

从黑色背景上可以看出与原图的区别

因为我们演示背景是纯白的,所以我们图片的边缘背景也是rgb(225,225,225) -> white

重新修改代码

html 复制代码
a {
    margin: 100px;
    height: 133px;
    display: inline-block;
    /*千万不能写死宽度,我们要推拉门*/
    background: url("../../img/new-yuanjiao-bgimg.png") no-repeat;
    padding-left: 35px;
}

a span {
    height: 133px;
    display: inline-block;
    background: url("../../img/new-yuanjiao-bgimg.png") no-repeat;
    padding-right: 55px;
}

这样就是想要的效果了

再把右扇的素材图片定位一下右边,再完善一下代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>css滑动门原理</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        a {
            margin: 100px;
            height: 133px;
            display: inline-block;
            /*千万不能写死宽度,我们要推拉门*/
            background: url("../../img/new-yuanjiao-bgimg.png") no-repeat;
            padding-left: 65px;
            text-decoration: none;
            line-height: 133px;
            color: white;
        }

        a span {
            height: 132px;
            display: inline-block;
            background: url("../../img/new-yuanjiao-bgimg.png") no-repeat right;
            padding-right: 65px;
        }

    </style>
</head>
<body>
<a href="#">
    <span>CSS滑动门</span>
</a>
</body>
</html>

刷新浏览器,得到想要的效果

但实际上培训机构的这种做法其实普适性并不强,我要是改了背景颜色我还要改素材图的背景颜色,岂不是很麻烦,所以我想到第二种方案

2.使用原先的png抠图素材,配合border-radius直接把a标签的右边两个多余的角切掉

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        a {
            margin: 100px;
            height: 133px;
            display: inline-block;
            /*千万不能写死宽度,我们要推拉门*/
            background: url("../../img/yuanjiao-bgimg.png") no-repeat;
            padding-left: 65px;
            text-decoration: none;
            line-height: 133px;
            color: white;
            border-radius: 0 50% 50% 0; /*给a标签的右上和右下两个角直接切角*/
        }

        a span {
            height: 133px;
            display: inline-block;
            background: url("../../img/yuanjiao-bgimg.png") no-repeat right;
            padding-right: 65px;
        }

    </style>
</head>
<body>
<a href="#">
    <span>CSS滑动门</span>
</a>
</body>
</html>

也可以得到同样的效果

随着span内的文字增加也会自适应背景图,教程的素材图片左扇其实可以再把padding-left的像素多给一些就会让图片的过渡更自然一些

所以,在选取或者制作css推拉门按钮的素材图片时也尽可能少的做颜色过渡,这样会使得整体性不好

相关推荐
只会写Bug9 分钟前
后台管理项目中关于新增、编辑弹框使用的另一种展示形式
前端·vue.js
weixin1997010801616 分钟前
《废旧物资商品详情页前端性能优化实战》
前端·性能优化
用户527096487449019 分钟前
Vite 开发代理里的 `ws` 是什么,什么时候该开
前端
冰水不凉21 分钟前
robot_localization实现imu和odom融合
前端·slam
M ? A1 小时前
Vue v-bind 转 React:VuReact 怎么处理?
前端·javascript·vue.js·经验分享·react.js·面试·vureact
军军君011 小时前
数字孪生监控大屏实战模板:政务服务大数据
前端·javascript·vue.js·typescript·前端框架·echarts·less
05Nuyoah1 小时前
CSS文本和字体属性,列表属性
javascript·css·css3
忆往wu前1 小时前
前端请求三部曲:Ajax / Fetch / Axios 演进与 Vue 工程化封装
前端·vue.js
GGBond今天继续上班2 小时前
只需要一条命令,让所有 AI 应用工具共享 skills
前端·人工智能·开源
Hilaku2 小时前
为什么我不建议普通前端盲目卷全栈?
前端·javascript·程序员