【问题标题】:Stacking and curves in pure-CSS logos纯 CSS 徽标中的堆叠和曲线
【发布时间】:2013-11-18 20:10:45
【问题描述】:

如何仅使用纯 CSS 创建任意曲线?有“贝塞尔”图书馆吗?我没有找到任何可以匹配下面徽标外边缘的曲线的东西。

看着the Shapes of CSS,我认为徽标可以近似为 2 个粉红色和黑色长方形,边缘完全圆润,倾斜 45 度,中间有 3 个白色小圆圈,矩形两侧有一些大圆圈给那个小“凹痕”。

这个形状真的可以只用圆形吗?

更新:这是我目前想出的(这里是JSFiddle):

<span class='grey logo'>
    <span class='black circle' id='left_middle'>&nbsp;</span>
    <span class='grey circle' id='left_top'>&nbsp;</span>
    <span class='grey circle' id='left_bottom'>&nbsp;</span>
    <span class='left black circle'>&nbsp;</span>
    <span class='left white small circle'>&nbsp;</span>
    <span class='top grey circle' id='left_right'>&nbsp;</span>
    <span class='pink circle' id='right_middle'>&nbsp;</span>
    <span class='top pink circle'>&nbsp;</span>
    <span class='top white small circle'>&nbsp;</span>
    <span class='right pink circle'>&nbsp;</span>
    <span class='right white small circle'>&nbsp;</span>
    <span class='grey circle' id='right_top'>&nbsp;</span>
    <span class='grey circle' id='right_bottom'>&nbsp;</span>
</span>

和:

/* normalize CSS */
.logo, .logo *, .logo *:before, .logo *:after {
    display: block;

    margin: 0;
    padding: 0;

    background: transparent;
    font: normal normal 0/0 serif;

    border: 0;
    outline: 0;
}
.logo {
    position: relative;
    overflow: hidden;
    margin: 0 0;

    width: 500px;
    height: 500px;
}
.logo * {
    position: absolute;
}

/* colors */
.logo [class*=pink] {
    background-color: rgb(217, 27, 91);
}
.logo [class*=white] {
    background-color: white;
}
.logo [class*=black] {
    background-color: black;
}
[class*=grey] {
    background-color: rgb(240, 240, 240)
}

/* shapes */
.logo [class*=circle] {
    width: 100px;
    height: 100px;

    border-radius: 50px;
    -moz-border-radius: 50;
    -webkit-border-radius: 50px;
}
.logo [class*=small] {
    margin-left: 20px;
    margin-top: 20px;

    width: 60px;
    height: 60px;
}

/* positions */
.logo [class*=top] {
    left: 108px;
    top: 8px;
}
.logo [class*=left] {
    left: 46px;
    top: 70px;
}
.logo [class*=right] {
    left: 170px;
    top: 70px;
}
.logo #left_middle {
    left: 76px;
    top: 40px;
}
.logo #right_middle {
    left: 140px;
    top: 40px;
}
.logo #left_top {
    left: 13px;
    top: -25px;
}
.logo #right_top {
    left: 203px;
    top: -25px;
}
.logo #left_bottom {
    left: 141px;
    top: 103px;
}
.logo #right_bottom {
    left: 75px;
    top: 103px;
}
.logo #left_right {
    margin-left: -5px;
    margin-top: -5px;

    width: 110px;
    height: 110px;
}

现在的问题是,无论我如何排列我的元素,堆叠总是乱七八糟。

问题来自GCI 2013

【问题讨论】:

  • 我猜除非你是MC Escher,否则你将无法用纯CSS解决问题。这是 SVG 或 Canvas 的经典案例。
  • @Christoph 我的任务特别要求只使用 CSS(可能还有 SASS 或其他 CSS 扩展)。
  • 为什么你只限于 CSS?在 SVG 中创建它是没有问题的,它也可以在每个现代浏览器中正常工作。它可以很容易地嵌入到 HTML 页面中。我认为 css 在这里行不通。
  • @Christoph 我的原始近似值足够好吗?
  • @Christoph 再次,我有 SVG。我意识到 SVG 支持变得更好了,但我的任务需要一个 CSS 徽标。

标签: image css stylesheet graphical-logo


【解决方案1】:

Something to get you started

CSS

.circ {
    width: 100px;
    height: 100px;
    background: red;
    -moz-border-radius: 50;
    -webkit-border-radius: 50px;
    border-radius: 50px;
}
.circ-small {
    width: 65px;
    height: 65px;
    background: #fff;
    -moz-border-radius: 33;
    -webkit-border-radius: 33px;
    border-radius: 33px;
}
div{
    position:absolute;
}

HTML

<div class="circ" style="left:40px;top:40px;"></div>
<div class="circ"></div>
<div class="circ"       style="left:70px;top:70px;"></div>
<div class="circ"       style="left:103px;top:-25px;background-color:#fff"></div>
<div class="circ"       style="left:-25px;top:103px;background-color:#fff"></div>
<div class="circ-small" style="left:25px;top:25px;"></div>
<div class="circ-small" style="left:88px;top:88px;"></div>

【讨论】:

  • 10x 用于回答。你能帮我解决我更新的问题吗?
  • 这是最简单的部分......如何将一个元素与另一个元素重叠的真正问题,它位于第一个元素之下。
  • 这正是我更新后的问题所要求的。那里肯定有问题。
【解决方案2】:

为了让您完成挑战的一小部分作业,我将只发布不会出现重叠问题的代码的开头。如果您仔细检查代码,您会发现,我在这里没有使用完整的圆圈,而是使用了透明和彩色边框的混合。这解决了重叠问题并减少了所需的元素总数。

Your starting point

基本部分是伪元素(这里有不同的颜色和z-indizes):

.pinky:before{
    right:-84px;bottom:-1px;
    height:30px;width:50px;
    border-radius:50%;
    z-index:1;
    border:20px solid transparent;
    border-bottom-color: $pink;
    @include transform( rotate(45deg) );
}

您应该首先为自己更改颜色和 z-indizes,看看它是如何构建的,一旦您进入它,就完成徽标的其余部分。

【讨论】:

    【解决方案3】:

    我做到了!我不得不习惯在 CSS 中只能对任何类型的形状使用“border-radius”(注意:不完全正确)。

    这里的主要问题是由于形状循环必须相互重叠而导致重叠。

    这里的两种主要方法是:


    这是带有编译后 CSS 的 a JSFiddle,以及第一种方法的 the result

    HTML:

    <span class='wrapper'>
        <span class='logo'>
            <span class='circle black' id='left_middle'>&nbsp;</span>
            <span class='circle dark_grey' id='left_right'>&nbsp;</span>
            <span class='circle grey' id='left_left'>&nbsp;</span>
    
            <span class='circle left black'>&nbsp;</span>
            <span class='circle left small white'>&nbsp;</span>
    
            <span class='circle top grey' id='left_top'>&nbsp;</span>
    
            <span class='circle pink' id='right_middle'>&nbsp;</span>
            <span class='circle grey' id='right_right'>&nbsp;</span>
            <span class='grey' id='right_left'>&nbsp;</span>
    
            <span class='circle top pink'>&nbsp;</span>
            <span class='circle top white small'>&nbsp;</span>
    
            <span class='circle right pink'>&nbsp;</span>
            <span class='circle right small white'>&nbsp;</span>
        </span>
    
        <span class='text'>
            <span class='bold'>BRL</span><span class='thin'>CAD</span>
        </span>
    </span>
    

    SCSS/SASS:

    /* Fonts */
    @font-face {
        font-family: 'BRL-CAD';
        src: url('fonts/Grandesign Neue Roman.ttf');
    }
    @font-face {
        font-family: 'BRL-CAD Bold';
        src: url('fonts/Grandesign Neue Roman Bold.ttf');
    }
    
    /* Shapes */
    $large_radius: 75px;
    $small_radius: 45px;
    
    /* Positions */
    $all_left: 10px;
    $all_top:  55px;
    
    $top_left:   $all_left + 55px;
    $top_top:    $all_top;
    $left_left:  $all_left;
    $left_top:   $all_top + 52px;
    $right_left: $all_left + 100px;
    $right_top:  $all_top + 57px;
    
    $right_middle_left: ($top_left + $right_left) / 2;
    $right_middle_top:  ($top_top + $right_top) / 2;
    
    $right_right_left: $all_left + 129px;
    $right_right_top:  $all_top - 11.5px;
    
    $right_left_diff:  50px;
    $right_left_left:  $all_left + 63px;
    $right_left_top:   $all_top + 72.5px;
    
    $left_middle_left: ($top_left + $left_left) / 2;
    $left_middle_top:  ($top_top + $left_top) / 2;
    
    $left_right_left:  $all_left + 73.5px;
    $left_right_top:   $all_top + 64.5px;
    
    $left_left_left:   $all_left - 18px;
    $left_left_top:    $all_top - 21px;
    
    $left_top_diff:    3px;
    $left_top_left:    $top_left - $left_top_diff;
    $left_top_top:     $top_top - $left_top_diff;
    
    $logo_width:  $right_left + $large_radius + $all_left;
    $logo_height: $right_top  + $large_radius + $all_top ;
    $all_width: $logo_width + 290px;
    $all_height: $logo_height;
    
    /* Colors */
    $pink: rgb(217, 27, 91);
    $grey: rgb(235, 235, 235);
    $dark_grey: rgb(230, 230, 230);
    
    /* Normalized CSS */
    .wrapper, .wrapper .logo, .wrapper .logo *, .wrapper .logo *:before, .wrapper .logo *:after {
        display: block;
    
        margin: 0;
        padding: 0;
    
        border: 0;
        outline: 0;
    
        background: transparent;
    }
    
    /* Logo + Text */
    .wrapper {
    
        /* CSS Tricks */
        position: relative;
        overflow: hidden;
    
        width:  $all_width ;
        height: $all_height;
    
        > * {
            float:left;
            display:inline;
        }
    
        /* Background */
        $start: rgb(240, 240, 240);
        $stop: rgb(225, 225, 225);
    
        background: $dark_grey;                                                               // non-CSS3 browsers
        background: -webkit-gradient(linear, left top, left bottom, from($start), to($stop)); // for WebKit
        background: -moz-linear-gradient(top,  $start,  $stop);                               // for Firefox
        background: linear-gradient(0deg, $stop, $start);                                     // for standards-compliance
    
        /* Logo */
        .logo {
    
            /* CSS Tricks */
            @extend .wrapper;
            width:  $logo_width ;
            height: $logo_height;
    
            * {
                position: absolute;
            }
    
            /* Colors */
            @mixin colorize($name, $color) {
                [class*=#{$name}] {
                    background-color: $color;
                }
            }
    
            @include colorize('white', white);
            @include colorize('black', black);
            @include colorize('pink', $pink);
            @include colorize('grey', $grey);
            @include colorize('dark_grey', $dark_grey);
    
            /* Shapes */
            [class*=circle] {
                width: $large_radius;
                height: $large_radius;
    
                border-radius: 50%;
            }
    
            [class*=small] {
                $margin: ($large_radius - $small_radius) / 2;
                margin-left: $margin;
                margin-top: $margin;
    
                width: $small_radius;
                height: $small_radius;
            }
    
            /* Classes and IDs */
            [class*=top] {
                left: $top_left;
                top: $top_top;
            }
            [class*=left] {
                left: $left_left;
                top: $left_top;
            }
            [class*=right] {
                left: $right_left;
                top: $right_top;
            }
            #right_middle {
                left: $right_middle_left + 5px;
                top: $right_middle_top;
            }
            #right_right {
                left:  $right_right_left;
                top: $right_right_top;
            }
            #right_left {
                left: $right_left_left;
                top: $right_left_top;
    
                $radius: $right_left_diff;
    
                width: $radius / 2;
                height: $radius;
    
                border-right: $radius / 4 solid $dark_grey;
                border-radius: 0 $radius / 2 $radius / 2 0;
    
                background: transparent;
            }
            #left_middle {
                left: $left_middle_left; //76px;
                top: $left_middle_top; //40px;
            }
            #left_right {
                left: $left_right_left;
                top: $left_right_top;
            }
            #left_left {
                left: $left_left_left;
                top: $left_left_top;
            }
            #left_top {
                left: $left_top_left;
                top: $left_top_top;
    
                $radius: $large_radius + 2*$left_top_diff;
                width: $radius;
                height: $radius;
            }
    
        }
    
        /* Text */
        .text {
            margin-left: 5px;
            margin-top: $all_top + 10px;
            font-size: 75px;
    
            .bold {
                color: $pink;
                font-weight: bold;
                font-family: 'BRL-CAD Bold', sans-serif;
            }
            .thin {
                color: black;
                font-family: 'BRL-CAD', sans-serif;
            }
        }
    
    }
    

    【讨论】:

    • 嘿伙计,很高兴它为你解决了。你介意接受 kei 或我的回答作为帮助你的功劳吗?
    • @Christoph 我不能说 kei 的回答有帮助,因为我已经超出了这个范围。但是您对边界半径的回答对我有所帮助,因此我对其进行了 +1。我最终使用了一种不同的方法,包括使用 CSS 渐变来模拟负边界半径。来自维基“[接受]一个对[你]个人有用的答案”。我对这个网站还比较陌生,所以我不太确定在这里做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多