CSS Speech Bubble with Box Shadow

后端 未结 5 1211
青春惊慌失措
青春惊慌失措 2020-11-28 01:48

Creating a DIV that uses CSS to draw a triangle to the left. Trying to apply a uniform box-shadow to both parent and the pseudo element (see images) and code.

Is th

5条回答
  •  北荒
    北荒 (楼主)
    2020-11-28 02:26

    Here is a complete working example in full (S)CSS, with variables for nose size shadow width and an optional border.

    The trick is to get the offsets and transform right to achieve pixel-perfection, and to use overflow:hidden as necessary to cut the nose of your bubble (especially if you need borders).

    The example in the answer above doesn't work for us because the shadow gets cropped and is laid over the main bubble area.

    Degrades gracefully in IE7/8.

    HTML:

     

    The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who, in the name of charity and good will, shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children.

    And I will strike down upon thee with great vengeance and furious anger those who would attempt to poison and destroy My brothers. And you will know My name is the Lord when I lay My vengeance upon thee.

    SCSS:

    $shadow_radius = 6px;
    $nose_size = 12px;
    $shadow = 0 1px $shadow_radius #B2B2B2;
    $border =  1px solid #bbb
    
    .chat {
        font-family:      sans-serif;
        font-size:        small;
    }
    
    .bubble {
        background-color: #F2F2F2;
        border-radius:    5px;
        border:           $border;
        box-shadow:       $shadow;
        display:          inline-block;
        padding:          10px 18px;
        margin-left:     ($shadow_radius + $nose_size);
        margin-right:    ($shadow_radius + $nose_size);
        position:         relative;
        vertical-align:   top;
    }
    
    .tail {
        position: absolute;
        top:      $nose_size;
        left:   -($shadow_radius + $nose_size);
        height:  ($shadow_radius + $nose_size);
        width:   ($shadow_radius + $nose_size);
        overflow: hidden;
    }
    .tail:before {
        border:            $border;
        background-color:  #F2F2F2;
        box-shadow:        $shadow;
        content:           "\00a0";
    
        display:           block;
        position:          absolute;
        top:               0px;
        left:              $nose_size;
        height:            $nose_size;
        width:             $nose_size;
        -webkit-transform: skew( -45deg );
        -moz-transform:    skew( -45deg );
    }
    

提交回复
热议问题