【问题标题】:How to create fluid trapezoid image with css?如何用css创建流体梯形图像?
【发布时间】:2012-03-27 09:02:41
【问题描述】:

我正在开发一个使用视差效果的网站。其中有些图像是三角形的,例如

& 图像是透明的,因为它与上面的 DIV 重叠。我正在用 css 尝试很多东西。但没有得到想要的结果。我以固定宽度实现了预期的结果。检查此http://jsfiddle.net/eJ7Sf/2/,但不适用于流体宽度。检查我仍在尝试但没有奏效的方法

http://jsfiddle.net/ceGGN/3/

http://jsfiddle.net/eJ7Sf/1/

注意:我知道 css3 MASK 属性,但它不适用于 Firefox 以前的浏览器。我想要 firefox 3.6.13

之前的功能

【问题讨论】:

  • 为什么要包括-moz--webkit--o- 选项,而忽略-ms-?你知道,IE9 完全能够处理转换。
  • @Kolink 首先我考虑达到预期的结果。之后我会在其他浏览器上测试
  • 根据这个推理,您只需要您实际测试的那个...
  • 我可能是唯一的一个,但我不确定你到底想要什么。您希望它在保持图像纵横比的同时放大和缩小尺寸?

标签: css css-shapes


【解决方案1】:

更新答案(纯 CSS3)

极端的要求有时需要极端的解决方案。我已经在我最初的答案(如下)的基础上制作了一个纯 css 解决方案,它可以工作(并且可以工作)更好,如果您想在其中投入时间)。 current example 在渲染中有点“不稳定”,这对您来说可能没问题,但如果不是,您需要扩展驱动它的 the already obscene number of @media queries(使用 LESSSASS;我整理了一个公式驱动的 Excel 电子表格来帮助快速生成数字)。它使用以下代码:

HTML

<div class="box">
   <img src="yourImage.jpg" />
</div> 

CSS

.box{
    height:300px;  
    min-width: 100px; /*could be different, but you ought to have some min*/
    overflow:hidden;
}

.box img {
    height: 100%;
    width: 100%;   
    -ms-transform-origin: 100% 100%; /* IE 9 */
    -webkit-transform-origin: 100% 100%; /* Safari and Chrome */
    -moz-transform-origin: 100% 100%; /* Firefox */
    -o-transform-origin: 100% 100%; /* Opera */
    transform-origin: 100% 100%;
}

/*Sample... you need alot of these--my fiddle example has 51*/
@media screen and (min-width:  100px) { 
  .box { 
    -ms-transform:skewY(45deg); 
    -moz-transform:skewY(45deg); 
    -webkit-transform:skewY(45deg); 
    -o-transform:skewY(45deg); 
    transform:skewY(45deg); 
  } 
  .box img { 
    -ms-transform:skewY(-90deg); 
    -moz-transform:skewY(-90deg); 
    -webkit-transform:skewY(-90deg); 
    -o-transform:skewY(-90deg); 
    transform:skewY(-90deg);
  }
}

以下是度数的计算方法

假设height: 300px 的窄边大约 100px 梯形上的高且相等的角度。这意味着上下偏移量是(300px - 100px) / 2 = 100px。然后.box 角度根据这个公式从@media 查询min-width 金额中扣除:

Angle = arctan(100/min-width) /*100 is the upper/lower offset as above*/

对于.box img 角度,取Angle 并乘以-2。这将产生您的.box.box img 媒体查询并转换为以下伪代码

@media screen and (min-width: [your target min-width]) { 
  .box {transform: skewY(Angle)}
  .box img {transform: skewY(-2*Angle)}
}

其运行的平滑程度完全取决于您对min-width 进行更改以获得新的角度设置的微观尺度。正如我在上面的 CSS 代码中的评论中所说,我的示例使用了 51 个媒体查询调用,但仍然有些不稳定。

使用一些 javascript 解决方案会更好吗...可能,但这完全取决于设计者,所以 我在这里提供这个纯粹是为了证明它可以与 pure 一起工作css.

原答案

This seems to be achieving a fluid width.我不知道您想要多少控制图像的显示量或显示部分,因此它可能无法完全满足您的需求,但它确实使用转换来制作灵活宽度的图像给它一个假的透视外观。

【讨论】:

  • 当你增加窗口大小时变成纯三角形。但不是我想要的。查看图片。但是感谢您的努力:)
  • @sandeep--所以您希望左右高度始终相同?顺便说一句,这实际上不是三角形(如您的标题所述),而是梯形。
  • @sandeep-- 每边的高度会随着宽度的变化而变化吗?换句话说,您是打算只改变角度,还是要固定角度和高度以响应宽度的变化而改变(两者之一必须改变)。
  • 高度相同,看起来像梯形
  • @sandeep——我更新了我的答案。它有效,但我会让你确定它是否值得,特别是如果你想让渲染更平滑。
【解决方案2】:

使用 SVG 剪辑路径

您可以使用inline SVGclipPath element 实现此形状:

<svg viewbox="0 0 10 6.7">
  <defs>
    <clipPath id="clip">
      <polygon points="10 0, 10 6.7, 0 4.7, 0 2" />
    </clipPath>
  </defs>
  <image xlink:href="http://i.imgur.com/RECDV24.jpg" x="0" y="0" height="6.7" width="10" clip-path="url(#clip)"/>
</svg>

使用 CSS 剪辑路径

您也可以使用CSS clip-path property 实现此形状。浏览器支持非常低(请参阅canIuse),但这是一种简单的方法。
这是一个例子:

img{
  -webkit-clip-path:polygon(0% 20%, 100% 0%,100% 100%,0% 80%);
  clip-path:polygon(0% 20%, 100% 0%,100% 100%,0% 80%);
}
&lt;img src="http://i.imgur.com/5NK0H1e.jpg" alt=""/&gt;

【讨论】:

    【解决方案3】:

    如果你用pseudoelements2DTransformssupported since Firefox 3.5)玩一下就可以达到这个效果:http://jsfiddle.net/fcalderan/T5KPA/1/

    我在 Chrome 和 Firefox 上试过。 对于 Opera 和 IE9,您需要添加专有前缀

    标记真的很重要:

    <figure class="triangle">
        <img src="http://cssglobe.com/lab/angled/img.jpg">
    </figure>
    

    以及获得这个效果的css:

    img { display: block; }
    
    .triangle { 
       position   : relative; 
       overflow   : hidden; 
       padding    : 0; margin: 0; 
       display    : inline-block; 
    }
    
    .triangle:after,
    .triangle:before {
       content    : "";
       position   : absolute;
       z-index    : 2;
       left       : -50%;
       width      : 200%;
       height     : 40%;
       display    : block;
       background : #fff;   
    }
    
    .triangle:before {
        top: -24%;  
        -webkit-transform: rotate(-10deg);
        -moz-transform: rotate(-10deg);
        transform: rotate(-10deg);
    }
    
    .triangle:after {
        bottom: -24%;  
        -webkit-transform: rotate(10deg);
        -moz-transform: rotate(10deg);
        transform: rotate(10deg);
    }
    

    我使用白色为旋转后的伪元素着色,当然,您可以更改颜色使其适合真实的背景颜色

    【讨论】:

    • @sandeep,这种解决方案可以接受还是应该进一步完善?
    • 对不起,这不是流畅的。我想要的
    • 请您进一步解释一下吗?如何修改我的示例以查看其不起作用?
    • 我想要与流体宽度相同的效果意味着如果屏幕尺寸增加,图像也会增加,但形状看起来与当前相同。
    • 我为 figure 和 img 添加了 width:100%。尝试jsfiddle.net/fcalderan/T5KPA/4 并调整窗口大小
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多