今天在牛客网上看到这道题,发现自己并不会,看来自己css都没怎么学习,也不怎么会用。看了下答案,不是很明白,也在网上搜集了一些资料和解法,感觉一些同学博客上也写了一些解法和拓展,所以就在这里借鉴一下咯。(参考地址:http://www.ithao123.cn/content-5672159.html)

实现图示的效果涉及到的知识主要有两点:一个是before、after伪元素,一个是border

1、before 和 after 都是css中的伪元素,通过给定一个属性content给元素添加新的内容

before:用来在元素前插入新内容。

after:用来在元素后面插入新内容。

(1)before 给元素添加内容实例:

<p>我</p>

如果给这个p元素设置一个before:

p:before{ content:"爱你"; }

这个p就变成了:我爱你,content属性的值就添加到了p元素内容的前面。

(2)after 给元素添加内容实例:

<p>我</p>

p:after{   content:"20岁了"; }

这个p就会变成:我20岁了

2、利用伪元素设置css样式,如题目中的尖角,题目只给出一个div,只能弄出左边的带边框正方形,右边的尖角怎么来的呢?那就可以靠这个伪元素来完成了。

思路解析:

(1)先把正方形画出来

 #demo{
width:100px;
height:100px;
background-color:#fff;
border: 2px #000 solid;
position: relative;
}

(2)通过before或者after变出一个尖角出来。放到正方形右上角去。

1)首先,我们复习一下border属性。

  • border-width:

    thin(细边框) medium (中等边框)thick(细边框) 10px(像素值)只有当边框样式不是 none 时才起作用   
  • border-style:
    dotted (点状)solid(实线) double(双线) dashed(虚线); 
  • border-color:设置不同的颜色

2)boder实例:

  • 一个边长为20px的正方形,设置border为20px,可得效果:,html代码如下:
 <html>
<head>
<title></title>
<style type="text/css">
#demo{
width:20px;
height:20px;
background-color:#fff;
border: 20px #000 solid; }
</style>
</head>
<body>
<div id="demo"> </div>
</body>
</html>
  • 我们可以根据border-left,border-right,border-top,border-bottom手动设置四个边框为不同颜色,css代码如下:
  •  #demo
    {
    width:20px;
    height:20px;
    background-color:#fff;
    border-left: 20px pink solid;
    border-right:20px red solid;
    border-top:20px green solid;
    border-bottom:20px blue solid;
    }
  • 将div宽度设置为0,则可见四个彩色小三角形。css代码修改如下:
    #demo
    {
    width:0px;
    height:0px;
    background-color:#fff;
    border-left: 20px pink solid;
    border-right:20px red solid;
    border-top:20px green solid;
    border-bottom:20px blue solid;
    }

    3)拓展思考,如果将三边边框透明,是不是就可以实现一个小三角形?

  • 如果只设置左边框,不设置其他三个边框。
  • #demo
    {
    width:0px;
    height:0px;
    background-color:#fff;
    border-left: 20px pink solid;
    /*border-right:20px red solid;
    border-top:20px green solid;
    border-bottom:20px blue solid;*/
    }

    实验结果:页面空白。原因:因为如果只设置左边框,而这个div的高度又为0,那这个左边框是不会向上下两端扩展。

  • 只不设置左边框,其余三边均设置。
    #demo
    {
    width:0px;
    height:0px;
    background-color:#fff;
    border-left: 20px pink solid;
    /*border-right:20px red solid;*/
    border-top:20px green solid;
    border-bottom:20px blue solid;
    }

    实验结果:。分析:未设置左边框,所以上下边框只向右边扩展。

  • 只设置左边框,不设置右边框,上下边框设置透明。
    #demo
    {
    width:0px;
    height:0px;
    background-color:#fff;
    border-left: 20px pink solid;
    /*border-right:20px red solid;*/
    border-top:20px transparent solid;
    border-bottom:20px transparent solid;
    }

实验结果:  分析,上下边框设置透明,左边框向上下扩展。

  • 实现一个小三角,先设置四边透明,再设置颜色,代码更简洁:

    #demo
    {
    width:0px;
    height:0px;
    border: 20px transparent solid;
    border-left-color: #000;
    }

    (3)把三角形放到正方形右侧。

    分析:正方形是缺了一段,我们可以让三角形颜色为白色覆盖掉正方形的边框,另外再用一个黑色的比白色三角形大一点的三角形放在白三角形下面,这样就只漏出了三角形的两条边,所以这里就要用到before和after。

   1)因为before和after插入的三角形是放在指定的位置的,所以它们的position都设置为绝对定位absolute,那么div就要设置成相对定位relative。

这里首先回顾一下定位的区别:position(static(默认)|relative|fixed|absolute)

    static:按照浏览器正常的文档流摆放 top left right bottom
    relative:相对于static本来位置。即默认的位置
    absolute 相对于父类元素定位,父元素的position必须是relative或者是absolute,如果不是,则继续往上查找父元素,如果一直找不到,则最后相对于body定位。
    fixed:相对于body元素

  2)首先绘出黑三角形

 #demo:before {
content: ' ';
width:;
height:;
border: solid transparent;
left: 100%;
top: 18px;
position: absolute;
border-width: 12px;
border-left-color: #000;
}

  实验结果:

3)绘制白色三角形

 #demo:after
{
content: ' ';
width:;
height:;
border: solid transparent;
left: 100%;
top: 20px;
position: absolute;
border-width: 10px;
border-left-color: #fff;
}

实验结果:

(4)整理CSS重叠属性,简化代码,最终完整页面HTML代码如下:

 <html>
<head>
<title>demo</title>
<style type="text/css">
#demo
{
width: 100px;
height: 100px;
background-color: #fff;
position: relative;
border: 2px solid #000;
} #demo:before, #demo:after
{
border: solid transparent;
content: ' ';
height: 0px;
width: 0px;
left: 100%;
position: absolute;
}
#demo:before {
border-width: 12px;
border-left-color: #000;
top: 18px; }
#demo:after
{
top: 20px;
border-width: 10px;
border-left-color: #fff;
} </style>
</head>
<body>
<div id="demo"> </div>
</body>
</html>

(5)终于完全明白了。2015-09-12      meggie

百度前端笔试题目--css 实现一个带尖角的正方形的更多相关文章

  1. 用CSS画一个带阴影的三角形的示例代码

    1. 思路 怎么用CSS3画一个带阴影的三角形呢 ? 有童鞋说, 这还不简单吗 网上有很多解决方案, 但其实大多都是实现不太完美的, 存在一些问题 假设我们做一个向下的三角形箭头 常见的方法大致有两种 ...

  2. html如何绘制带尖角(三角)的矩形

    结合实际情况自己写的: .menu_triangle { height: 10px; width: 10px; background-color: #049888; transform: transl ...

  3. 用CSS实现文本框尖角

    经常看到这样的尖角,以前不懂,以为都是用图片做出来的,后来惊奇的发现,原来很多都是用CSS做出来的,既美观又节省资源,真是两全其美啊! 那么,用CSS怎么实现这种效果呢?首先,来写一个简单的代码: & ...

  4. 一个小公司的前端笔试HTML CSS JS

    网上有这套题的答案,版本也很多,我做了很多参考.本文就当个小笔记,可能有错误,还望指正~ 第1章  Html篇 1. 你做的网页在哪些浏览器测试过?这些浏览器的内核分别是什么? 浏览器类型 内核 Fi ...

  5. 如何用css写一个带斜切角、有边框又有内外阴影的按钮呢?

    如果有一天,UI设计师丢过来一张UI稿,上面有这样一个带有斜切角.有边框还有内外阴影的按钮,你会怎么实现呢?第一反应切图?可是按钮内容.大小都是可变的,那得切多少图啊~Canvas?SVG?No,no ...

  6. Effective前端(3)用CSS画一个三角形

    来源:https://zhuanlan.zhihu.com/p/26160325 三角形的场景很常见,打开一个页面可以看到各种各样的三角形: 由于div一般是四边形,要画个三角形并不是那么直观.你可以 ...

  7. 前端笔试题目小结--获取输入参数用户名;查询URL字符串参数

    编写一个JavaScript函数getSuffix,用于获得输入参数的后缀名.如输入abc.txt,返回txt. str1 = "abc.txt"; function getSuf ...

  8. 前端笔试题目总结——应用JavaScript函数递归打印数组到HTML页面上

    数组如下: var item=[{ name:'Tom', age:70, child:[{ name:'Jerry', age:50, child:[{ name:'William', age:20 ...

  9. 来自网易云的黑科技,带尖角的div......

    今天在网易云的网页版听歌,话说Steve Vai的曲子永远是这么让人揣摩不透,不过我还时更喜欢老Joe,咦,跑题了··· 大家可以看到评论输入框和回复框,上面都有个小尖角,实现的方式有很多,我一般是用 ...

随机推荐

  1. 《Linux内核分析》 week2作业-时间片轮转

    一.基于时间片轮转调度代码的解读 代码结构主要由三个文件组成: 1.mypcb.h 2.myinterrupt.c 3.mymain.c 1.进程控制块(mypcb.h) /* CPU-specifi ...

  2. Ubuntu小私房(4)--Linux系统目录结构

    Linux目录结构是Linux学习者必须了解的知识,Linux的目录与Windows又有很大的不同,所以搞清楚Linux目录结构是关键. Linux文件类型 (部分转自ChinaBytel) linu ...

  3. 准备开发一个基于canvas的图表库,记录一些东西(一)

    开源的图表库已经有很多了,这里从头写个自己的,主要还是 提高自己js的水平,增加复杂代码组织的经验 首先写一个画图的库,供以后画图表使用.经过2天的开发,算是能拿出点东西了,虽然功能还很弱,但是有了一 ...

  4. D3js初探及数据可视化案例设计实战

    摘要:本文以本人目前所做项目为基础,从设计的角度探讨数据可视化的设计的方法.过程和结果,起抛砖引玉之效.在技术方案上,我们采用通用web架构和d3js作为主要技术手段:考虑到项目需求,这里所做的可视化 ...

  5. android-support-v7-appcompat下载

    http://download.csdn.net/detail/u010556601/7449661 将压缩包解压,放入sdk\extras\android\support\v7目录下 在eclips ...

  6. Android Timer的使用

    1:服务端使用PHP <?php echo date('Y-m-d H:i:s'); ?> 2:activity_main.xml <RelativeLayout xmlns:and ...

  7. 深入剖析keil c51 --- 从汇编到c51

    第一节 main()函数和启动代码 汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和 ...

  8. Jquery 对象集合的迭代扩展forEach

    if (jQuery && !jQuery.fn.forEach) { $(function () { (function ($) { $.fn.extend({ forEach: f ...

  9. Graphviz-Gdot语言学习

    GVEdit这个绘图软件呢我也是刚接触的,感觉画起图来还是很爽的...尤其很熟悉c++后很容易上手这门dot语言. 先看一下十分清新的编程界面: 没有天下最邪恶的语法加亮,没有缩进行...这又算什么! ...

  10. MYSQL数据备份与还原学习笔记

    数据备份与还原   1.mysqldump 1.1 文件地址: E:\xampp\mysql\bin 文件名:mysqldump.exe CMD下进入mysqldump.exe cd E:\xampp ...