7

这里的第一张图片是网页设计师创建的草稿。

这里的第二张图片是我为此创建适当的 HTML/CSS 布局的结果。

问题是:如何仅使用适当的 HTML5 和 CSS 在评级药丸周围创建这个透明字段。解决方案必须是跨浏览器和超级兼容的(包括IE7及更高版本)。

评级药丸宽度不是固定的,它取决于里面的数字,所以透明字段必须反映这一点。

这是我目前的布局:

<div class="evo-module-c4b style="background-image: url('/i/oranges.jpg');">

    <div class="price">
        <span class="icon"></span>
        <span class="value">10,950</span>
    </div>

    <div class="die"></div>

    <div class="rating-wrapper">
        <div class="evo-rating">
            <span class="value">+100500</span>
        </div>
    </div>

    <div class="content">
        <h2>Lorem ipsum dolor</h2>
        <p class="author">Donec et</p>
        <p class="data">24.08.2012 10:53</p>
        <h3>Nunc pellentesque justo diam, sed dictum dolor.</h3>
    </div>

</div>

较少的:

div.evo-module-c4b {
    position: relative;
    width: @module-big-width;
    height: 250px;
    background-color: @color-gray-1;
    background-position: 0 0;
    background-repeat: no-repeat;
    overflow: hidden;

    div.price {
        position: absolute;
        top: 18px;
        right: 24px;
        span.icon {
            display: block;
            float: left;
            width: 16px;
            height: 16px;
            background-image: url('/i/evo/icons-imageset.png');
            background-position: -20px 0;
            background-repeat: no-repeat;
        }
        span.value {
            display: block;
            float: left;
            margin-left: 4px;
            font-size: 18px;
            font-weight: bold;
            color: @color-white;
        }
    }

    div.die {
        position: absolute;
        left: 0;
        bottom: 0;
        width: 100%;
        height: 108px;
        background-color: @color-gray-10;
        //background-image: url('/i/evo/modules/c4b/die.png');
        background-position: 0 0;
        background-repeat: no-repeat;
        z-index: 0;
    }

    div.rating-wrapper {
        position: absolute;
        width: 100%;
        top: 122px;
        text-align: center;
        div.evo-rating {
            display: inline-block;
        }
    }

    div.content {
        position: absolute;
        left: 0;
        top: 172px;
        width: 100%;
        z-index: 1;

        h2, h3, p {
            margin: 0;
            padding: 0;
            line-height: normal;
            text-align: center;
        }

        h2 {
            font-size: 18px;
            font-weight: bold;
        }

        p.author {
            font-size: 12px;
            font-weight: bold;
        }

        p.data {
            font-size: 10px;
            color: @color-gray-4;
        }

        h3 {
            font-size: 12px;
            color: @color-gray-4;
        }
    }
}

div.evo-rating {
    span.value {
        .evo-border-radius(@rating-height / 2 + 3px);
        display: block;
        height: @rating-height;
        font-size: 18px;
        font-weight: bold;
        line-height: @rating-height;
        color: @color-major;
        background-color: @color-white;
        border: 3px solid @color-major;
        padding: 0 5px;
    }
}

有什么建议么?)

4

5 回答 5

2

根据moopet提供的评论,我构建了这个答案并制作了一个jsFiddle 来说明他的想法

页面结构

我正在假设这是构成您的页面的 HTML:

<div class="picture">

  <div class="pill-wrapper">
    <div class="pill">+1030</div>
  </div>

  <div class="content">
  </div>    

</div>​

我们将如何处理这个透明的药丸边界?

弄清楚moopet在评论中给我们的想法,您绝对可以定位 .pill-wrapper(并使用 LESS 变量*找到正确的中心位置)。给这个 .pill-wrapper 一个填充和边框半径,然后你可以使用背景来创建一个人造透明边框。只需将背景设置为与显示的图片相匹配,并用于background-position匹配评级药丸在页面上的位置(同样,使用 LESS 变量可能会使这变得又好又容易)。

这如何转化为 CSS?

请研究下面介绍的 CSS。请注意,仅显示基本 CSS。任何字体样式都应由您自己应用。

.picture {
  position: absolute;

  width: 100%;
  height: 500px;

  background: url('http://goo.gl/Zi4hw');
}

.pill {
  box-sizing: border-box;

  width: auto;
  height: 36px;
  padding: 5px;

  background: #0066aa;
  border-radius: 18px;
  border: 2px solid #ffffff;
}

.pill-wrapper {
  position: absolute;
  top: 225px;
  left: 100px;

  height: 36px;
  padding: 10px;  

  background: url('http://goo.gl/Zi4hw') -100px -225px;
  border-radius: 36px;

}

.content {
  height: 250px;
  margin-top: 250px;
  background: rgba(255,255,255,0.9);
}

这种方法肯定存在问题。首先请注意,即使 LESS 会预处理所有内容,它也不是动态的或流动的,并且额外的 Javascript 可能会令人遗憾地工作,以解决在水平浏览器调整大小期间保持药丸居中的问题。其次,可能存在一些应该研究的兼容性问题。

但是基础知识在这里供您使用。

您可以在此处查看建议的解决方案:http: //jsfiddle.net/bakkerjoeri/R99NT/3/

**:我没有在 LESS 中编码的经验,所以对于我假设的任何错误,我深表歉意。请随时纠正我。*

于 2012-08-24T15:21:47.883 回答
2

更改带有 alpha 孔的图像的灰色背景并将其添加到图片上。您可能需要不同的尺寸,因为宽度可能会改变。

于 2012-08-24T12:52:01.003 回答
1

我认为这不可能完全实现,尽管最接近的解决方案可能涉及:

创建一个与药丸相同但更大的元素。绝对定位新元素,使其位于药丸下方,但使其更大。给它与主“橙色”图片相同的背景图像,但要调整它的背景位置,使其正确排列。这显然将取决于您的 css 其余部分的实现。

于 2012-08-24T15:08:31.017 回答
1

至于我 - 没有真正简单的解决方案。但我会尝试使用几个 div 将块与评级结合起来。想法是您可以准备一些灰色背景的图像,其中下半部分是灰色的,顶部是透明的。可以通过将 3(?) div 组合来解决药丸本身的问题。一个用于左圆形边框 - 可以是带有边框、灰色背景等和透明部分的图像,您的底层图像将在其中可见。一个用于评级本身,一个用于右圆角。所有人都将以并排放置的方式构建背景图像,他们将制作那个药丸。现在,您只需将所有这些都转移到您的顶部图像上。

于 2012-08-24T12:58:31.217 回答
0

如果药丸是使用选择器“:after”和“:before”制作的,您可以在左侧创建一个灰色 div,在右侧创建另一个,然后在药丸附近输入边界半径,但在另一侧。在药丸下你可以放一个大的灰色药丸。

于 2012-08-24T13:15:05.280 回答