【问题标题】:Button using three (3) background images css使用三 (3) 个背景图像 css 的按钮
【发布时间】:2013-07-11 14:45:53
【问题描述】:

我正在尝试使用三个背景图像制作一个按钮,以便我们可以提取按钮文本的翻译并很好地展开。我们可能会为 IE8 添加一个基本样式,但我们的设计师希望我们使用这种样式,而我们无法用纯 CSS3 很好地重新创建它。

图片如下:

这是 HTML(只是一个简单的按钮,但我觉得还是应该放它:

<button class="back clickable" aria-label="Back" onclick="javascript:history.back();">Back</button>

我已经尝试了几件事;我将粘贴两次尝试的 CSS。

尝试 1:使用伪选择器
http://jsfiddle.net/c2B6X/

.back {
    background: url("images/back-middle.png") 14px 0 repeat-x;
    color: $white;
    height: 28px;
    padding: 5px;
    &:before {
        background: url("images/back-front.png") 0 0 no-repeat;
        width: 14px;
    }
    &:after {
        background: url("images/back-end.png") 100% 0 no-repeat;
        width: 8px;
    }
}

尝试 2:三个background-images
http://jsfiddle.net/nPUQN/

.back {
    background: none;
    background-image: url("images/back-middle.png"), url("images/back-end.png"), url("images/back-front.png");
    background-position: 14px 0, 100% 0, 0 0;
    background-repeat: repeat-x, no-repeat, no-repeat;
    border-right: 8px transparent;
    border-left: 14px transparent;
    color: $white;
    height: 28px;
    padding: 5px;

}

如果它看起来像非典型 CSS,那是因为我们使用的是 SASS。

有什么明显的我遗漏或做错了吗?任何有关如何完成这项工作的建议将不胜感激。

编辑
由于我得到了这么多“有效”的答案,因此我将在 Chrome、FF 和 IE9 中最有效的答案标记为正确。

编辑 2
我已经尝试了所有答案,但在 IE9 中都没有。我们必须支持 IE9(和 IE8,但我暂时不会去那里)。我要开始赏金了。任何能够提供适用于 IE9、Firefox 和 Chrome 的答案的人都会得到它。

【问题讨论】:

  • 希望你看到了这个。 css3.info/preview/multiple-backgrounds
  • 为什么将变量命名为$white?如果您希望颜色为蓝色怎么办?
  • 在 IE9 中无效。周一回来上班时会再去看看。 :)
  • 请注意,多个背景在 IE8 中不起作用。

标签: html css image sass background-image


【解决方案1】:

伪内容需要content,因此您首先需要指定:

.selector::before {
  content: ' ';
}

然后要定义任何布局,例如宽度和高度,您需要将伪元素显示为blockinline-block。块布局将强制每个伪元素换行,inline-block 将位于行上,因此您必须使用浮动或绝对定位。

.selector {
  position: relative;
  height: 28px;

  /* allow for the pseudo-elements which do not have layout due to absolute positioning */
  margin: 0 15px;
}
.selector::before,
.selector::after {
  content: ' ';
  position: absolute;
  top: 0;
  width: 15px;
  height: 28px;
}
.selector::before {
  left: -15px;
}
.selector::after {
  right: -15px;
}

这里为您演示:http://codepen.io/anon/pen/yaJGI

【讨论】:

  • 我已将您的笔与真实图像分叉,以使其更有效地作为“操作方法”:codepen.io/gcyrillus/pen/aKDkw ;) +1 for content:'';
  • 如果您将溢出设置为在按钮上可见,这将在 IE9 中工作:codepen.io/cimmanon/pen/xKpaBcodepen.io/cimmanon/pen/rDpFn
  • 我觉得我应该在 i_like_robots、@cimmanon 和 GCyrillus 之间分配赏金,因为是你们三个人把我需要的答案放在一起。
  • i_like_robots 完成了大部分工作。当我们为现有答案做出贡献而不是提供我们自己的答案时,我们就知道自己在做什么。
  • 重要的是你得到你的答案,我们都很喜欢它;)
【解决方案2】:

您需要为:before:after 添加内容才能显示。之后,您可以绝对定位它们,通过分别给它们right: 100%left: 100%,您可以将它们定位在按钮的前面和后面。

button {
  background:transparent;
  border: none;
  padding: 0;
  margin: 0;
  line-height: 1;
  font-size: 12px;
  cursor: pointer;
  margin-left: 14px; /* width of :before */
}
.back {
    background: url("http://i.stack.imgur.com/DaQcG.png") 14px 0 repeat-x;
    color: white;
    height: 28px;
    padding: 5px;
    position: relative;
}
.back:before {
        position: absolute;
        content: "";
        height: 28px;
        top: 0;
        right: 100%;
        background: url("http://i.stack.imgur.com/6m2HC.png") 0 0 no-repeat;
        width: 14px;
    }
.back:after {
        position: absolute;
        content: "";
        height: 28px;
        top: 0;
        left: 100%;
        background: url("http://i.stack.imgur.com/2WA5B.png") 100% 0 no-repeat;
        width: 8px;
    }

before 和 after 的定义稍有相同,可以写得更紧凑,但还是需要重新定义。 ;)

http://jsfiddle.net/c2B6X/

提示:请注意,下载三张图片的效率较低。您可以创建一个图像,其中包含顶部的开始和结束,以及底部的中间部分。通过定位背景,您可以在元素内显示正确的部分。这种技术称为sprites,它减少了请求的数量。

【讨论】:

  • 是的,一旦我们从设计中获得所有图标,我们就会使用 spritemap。
  • 因此,如果您使用精灵,请考虑在按钮的开始/结束下设置一些白点。
  • 白点?我不明白你的意思。
  • 我认为这是为了在精灵周围保留一些空间,以防定位偏离像素,这有时可能会发生,尤其是在页面缩放时。
  • 啊,是的,精灵图中总是有额外的空白。
【解决方案3】:

我想出了一些东西,你可以看看。您可以对其进行修改以最适合您的需求。

http://jsfiddle.net/Xy7Hv/1/

HTML:

<button class="back">Back</button>

CSS:

.back {
    border: none;
    height: 28px;
    padding-right: 8px;
    padding-left: 14px;
    background-image: url("http://i.stack.imgur.com/DaQcG.png"),             
        url("http://i.stack.imgur.com/6m2HC.png"), 
        url("http://i.stack.imgur.com/2WA5B.png");
    background-position: 14px 0px, left, right;
    background-size: 30px 100%, 14px 28px, 8px 28px;
    background-repeat:  no-repeat,no-repeat,no-repeat;
}

("background-size: 30px" 是按钮的宽度,所以如果你所有的按钮大小都一样,那应该没问题)

【讨论】:

  • 好技巧,但在我看来不够灵活,如果增加字体大小、字母间距或使用其他字体,您可能会有白点;)
  • 所以你的意思是你不打算每次都一样大小。
  • 我没有任何计划,这只是一直在发生的事情:),用户有自己的浏览器和设置,字体的处理方式是最难控制的。
  • 我确实说过它会根据本地化字符串的长度改变大小。它不适用于不同的尺寸。我尝试将其加粗,但它甚至不起作用。
  • 哦,好的,我明白了。这就是我现在所知道的所有事情。好吧,反正不用javascript。
【解决方案4】:

我今天使用了这个代码。它类似于您的第二个示例,但使用背景快捷方式属性和位置字符串的混合。

background: url("../images/img01.png") 0px 0px no-repeat, url("../images/img02.png") 53px 0px repeat-x, url("../images/img03.png") right top no-repeat;

img01 = 左图(53px 宽)

img02 = 填充图像

img03 = 右图

【讨论】:

    【解决方案5】:

    使用您的多背景版本,您可以添加渐变或白色图像来构建您的按钮 bg ,并使用填充保留一些空间。 http://jsfiddle.net/nPUQN/1/

    .back {
        background:
            url("http://i.stack.imgur.com/2WA5B.png") 100% 0 no-repeat ,
            url("http://i.stack.imgur.com/6m2HC.png") 0 0 no-repeat,
           -webkit-linear-gradient(0deg, white 0, white 14px , transparent 14px ,transparent) 0 0 no-repeat ,
            -webkit-linear-gradient(180deg, white 0, white 8px , transparent 8px ,transparent) 0 0 no-repeat ,
            url("http://i.stack.imgur.com/DaQcG.png") 14px 0 repeat 
            ;
        color: $white;
        height: 28px;
        padding: 5px 8px 5px 14px;
    }
    

    为 chrome 添加前缀,添加其他需要的前缀或使用前缀 js :)

    【讨论】:

    • 在 FF 和 Chrome 中运行良好,但在 IE9 中根本不显示图像。
    • 因为 IE9 不接受线性渐变,这些渐变本身应该是适合 IE9 功能的图像。
    • (见我对精灵的评论 :) ) .... 那些白点应该是替换此处使用的渐变的图像块;)
    • 哦,我没听懂。好的,谢谢你再次解释。
    【解决方案6】:

    我添加这个答案是因为我喜欢保持另一个原样。 这个要在 IE8/9 中使用伪和位置进行测试: http://codepen.io/gcyrillus/full/lBpaI 或编辑: http://codepen.io/gcyrillus/pen/lBpaI

    .back {
        background:
            url("http://i.stack.imgur.com/DaQcG.png") 14px 0 repeat 
            ;
        color: white;
        height: 28px;
        padding: 5px;
      position:relative;
      overflow:visible;
    }
    .back:before {
      content:url(http://i.stack.imgur.com/6m2HC.png);
      top:0;
      left:-14px;
      position:absolute;
    }
    .back:after {
      content:url(http://i.stack.imgur.com/2WA5B.png);
      position:absolute;
      right:-8px;
      top:0;
    }
    

    【讨论】:

    • 这是 I_like_robots 的类似答案,只是清理了! (离线并错过了一些 cmets 并已修复。)所以在给我积分之前先看看其他答案:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多