美文网首页iOS11相关
iPhone X刘海列表环绕交互 -- shape-outsid

iPhone X刘海列表环绕交互 -- shape-outsid

作者: Coldhands | 来源:发表于2017-09-20 16:00 被阅读24次

看到旭神博客上的一篇文章,关于iPhone X刘海发型设计和衍生的交互,其就是通过CSS3 Shapes实现元素滚动自动环绕iPhone X头部刘海效果。这里我整理了一下,写一个缩减版。

iPhone X的刘海发型和衍生的交互

首先先看一下微博上流传的交互样式。

iPhoneX刘海衍生的交互

可以看出此交互就是滚动页面时,列表会环绕着iPhoneX的刘海排列。
实际上,CSS3里面针对这种特定形状环绕的效果已经支持很久了,CSS3 Shapes和CSS3 Regions都是可以实现的,只是我们接触甚少。

CSS Shapes环绕iPhone X刘海简易方法

这里就描述一种在技术上简单易懂的解决方式。

实现原理

CSS Shapes中有个CSS属性名为shape-outside,可以让内联元素以不规则的形状进行外部排列,语法如下:

/* 函数值 */
shape-outside: circle();
shape-outside: ellipse();
shape-outside: inset(10px 10px 10px 10px);
shape-outside: polygon(10px 10px, 20px 20px, 30px 30px);

/* <url>值 */
shape-outside: url(image.png);

/* 渐变值 */
shape-outside: linear-gradient(45deg, rgba(255, 255, 255, 0) 150px, red 150px);

shape-outside属性想要生效,本身需要是浮动float元素。
本demo效果实现的简易方法就是使用shape-outside:url('image.png')属性实现类似效果,image.png就是用来被环绕的图片,相当于iPhoneX的刘海设计,环绕与否是基于计算alpha通道决定,简单来讲,就是沿着图片非透明区域环绕。
由于使用url()的形状计算是基于图片元素,和Shapes其他四个inset(),circle(),ellipsepolygon()这些基础形状方法的计算性质不一样,可以直接使用垂直方向的margin进行偏移。
先来看下实现效果吧

shape-outside url实现效果
细节说明

列表环绕的刘海图片和实际在页面显示的刘海图并非是一张图片,为了让刘海和列表文字之间留有空隙,要将url('liu-outside.png')中的 liu-outside.png图片做实色填充处理,这里是填充了6像素。

代码:

css代码

*{
    margin: 0;
    padding: 0;
    list-style: none;
 }
.box{
    max-width: 600px;
    height: 380px;
    border: 4px solid #000;
    overflow: auto;
    margin: auto;
 }
.liuOutside{
    float: left;
    width: 30px;
    height: 180px;
    margin-top: 100px;
    -webkit-shape-outside: url('./liu-outside.png'); 
    shape-outside: url('./liu-outside.png');
    transition: margin-top .15s;
 }
.liuhai{
    width: 24px;
    height: 180px;
    background: url("./liu.png") no-repeat left center;
    margin-top: 100px;
    position: absolute;
 }
.scrollContent li{
    border-bottom: 1px solid #ddd;
    padding: 1em;
}

html代码

    <div class="box">
        <i class="liuOutside"></i>
        <i class="liuhai"></i>
        <ul class="scrollContent">
            <li>这个方法是比较简单的</li>
            <li>使用shape-outside url(image.png)语法</li>
            <li>其中'image.png'就是用来被环绕的图片</li>
            <li>环绕与否是基于计算alpha通道决定</li>
            <li>即沿着图片非透明区域环绕</li>
            <li>为了不至于列表靠的太近</li>
            <li>shape的url图片右侧</li>
            <li>刻意填充了6像素实色</li>
            <li>现在看到的齐刘海</li>
            <li>是覆盖在上面的一张图</li>
            <li>实际生效的是后面浮动的shape</li>
            <li>此功能的实现需要JS的配合</li>
            <li>主要控制margin-top值</li>
            <li>只能对内联信息进行跟随控制</li>
        </ul>
    </div>

js代码

var liuOutside = document.querySelector(".liuOutside");
var box = document.querySelector(".box");
var outside = function() {
    var scrollTop = box.scrollTop;
    // 滚动偏移应用在margin-top上
    liuOutside.style.marginTop = (100 + scrollTop) + "px";
};
// 滚动时实时监听改变shape的形状
box.addEventListener("scroll",outside);
outside();
Tips

1.效果的实现必须要js代码的配合,否则会出现很难受的效果,如下:

未有js代码实现效果

2.还有一种实现方案就是shape-outside:polygon(),通过点坐标勾勒出和齐刘海形状相似的多边形形状,css代码如下:

.liuOutside{
    float: left;
    shape-outside: polygon(0 0, 0 100px, 16px 104px, 30px 116px, 30px 264px, 16px 276px, 0 280px, 0 0);
}

应该想到的是,既然方法换了,那么js代码相应的也需要作出改变:

box.addEventListener('scroll', function () {
    var scrollTop = box.scrollTop;
    // 滚动偏移应用在shape-outside上
    shape.style.shapeOutside = 'polygon(0 0, 0 '+ (100 + scrollTop) +'px, 16px '+ (104 + scrollTop) +'px, 30px '+ (116 + scrollTop) +'px, 30px '+ (264 + scrollTop) +'px, 16px '+ (276 + scrollTop) +'px, 0 '+ (280 + scrollTop) +'px, 0 0)';
});

此方法在确定环绕点时比较繁琐。
3.附上用到的两张刘海图片

注:根据张鑫旭大牛的文章所写,一起学习。

相关文章

网友评论

    本文标题:iPhone X刘海列表环绕交互 -- shape-outsid

    本文链接:https://www.haomeiwen.com/subject/yokosxtx.html