整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

5亿光年外传来重复快速射电暴 这意味着什么?

天最近听说,有天文学家首次观测到了具有稳定周期的快速射电暴(FRB),这也是唯一已知的此类快速射电暴,以16天为周期循环出现,对该快速射电暴的发现和解释一旦确认,或将会带来革命性影响。听起来这么厉害,自然要来解读一番,听听国家天文台陈学雷研究员怎么说~

Q:什么是快速射电暴?最早是什么时候发现的?

陈学雷:快速射电暴(英文简称FRB)是一种在天空中突然出现的射电爆发,短时间内可以达到相当高的亮度,但一般持续时间只有毫秒量级。

这种现象最初是美国天文学家洛里默(Lorimer)在分析澳大利亚帕克斯(Parkes)望远镜于2001年进行观测记录的数据时发现的。洛里默在2007年发表了这一结果,但因为当时只有一个孤例,因此人们对于其真实性还持怀疑态度。2012年到2013年前后,人们又发现了多起类似事件,特别是索顿(Thorton)等人在2013年的论文中公布了4例FRB后,人们认识到这应该是种常见现象,于是开始积极搜寻FRB,目前已经发现了很多。

图1:由Duncan Lorimer发现的第一个快速射电暴FRB 010724 (Lorimer et al. 2007, Science, 318, 777L)

Q:这次发现的快速射电暴有哪些特点?

陈学雷:此前人们观测到的大部分快速射电暴是不重复的,少数虽然重复爆发,但爆发的时间是随机的,看不出明显的规律性。这次的FRB是最早于2018年发现的,经过从2018年9月16日到2019年10月31日的持续观测,加拿大CHIME FRB团队发现其爆发中存在显著的周期性,周期为16.35天。也就是说,每隔16.35天,就会有一段爆发比较频繁发生的时间。

图2:CHIME望远镜

Q:它的源头是位于约5亿光年外的一个漩涡星系中,科学家是如何判断它的位置的?

陈学雷:对于快速射电暴,目前在首次发现的时候人们往往并不能精确定位,这是因为发现射电暴的望远镜往往追求大视场,相当于广角镜头,角分辨率一般不是很高,只是粗略知道其方位。这时也可以从单次观测数据中粗略估计其距离,因为电波在穿过宇宙空间中的等离子体时会发生色散现象,也就是说频率高的信号会比频率低的信号早一点到达,传播的距离越远,穿过的等离子体越多,色散就会越强烈。因此根据不同频率信号到达的时间差,就可以估计出色散量,进而估计其距离,但是这种估计往往有较大误差,因为等离子体的分布并不是完全均匀的,有的地方多一些,有的地方少一些。

图3:不同频率电磁波受色散影响,到达探测器的时间不同 图片来自:https://phys.org/news/2018-04-fast-radio.html

对于重复射电暴,人们既然知道其频繁发生,就可以调用角分辨率更高的望远镜进行监视,从而更精确地测定其方位。像这一个,人们对它的角测量精度就足够高,从而能看出它在某个旋涡星系中。

Q:目前认为快速射电暴的产生与什么有关?为什么?

陈学雷:目前人们还不能完全确定快速射电暴的产生机制,学者们已经提出了几十种不同的理论模型。不过,大部分理论模型与致密天体特别是中子星有关。这是因为,快速射电暴持续时间非常短,亮度又非常高,这要求有一种能在很短时间、很小的空间尺度上释放大量能量的机制,而且我们往往看到射电辐射而没有看到其它波段的辐射,说明这种辐射不是通常的高温辐射,而是一种相干激发的电磁场辐射。

中子星体积小(半径是几十公里量级)、密度高、快速旋转,并往往伴有极高强度的磁场,如果产生这种强烈的相干辐射是不太令人意外的。当然,目前这仍然还是一些假说,到底是不是由中子星产生的辐射,产生的具体机制,有没有多种起源,这些问题都还需要进一步研究。

Q:研究快速射电暴有哪些难点?此次发现稳定周期快速射电暴有哪些意义?

陈学雷:现在已公布的重复快速射电暴已经有二十多个了,另外据说还有一些尚未公布。那些未重复的快速射电暴是真的完全不重复?还是其实也重复但只是因为发生频率太低没有被发现?目前我们还并不清楚。当然,研究快速射电暴的一个难点就在于从单个事件数据里能推测出的信息太少,所以重复暴具有很大价值,一方面更精确的定位使我们了解它所处的星系和在星系中的位置,另一方面从其重复爆发的亮度、时间等分布也可以分析其爆发机制。

此次发现的稳定周期当然很有意义。我们知道,天文学的起源其实就来自人类对周期性的认识:日出日落、月亮的盈缺、四季的变换、行星的会合等等,因此可以说周期性是天文学家最重要的观测线索之一。就本次而言,如何产生这种十几天的周期性?人们目前有一些不同的推测:有可能快速射电暴的源是处在双星系统中的中子星,那么双星的公转就提供了一种周期性的起源;孤立的中子星也有可能存在转动轴的进动,从而导致周期性。这些都有待进一步的研究验证,但显然这种周期性提供了重要的线索。(蔡琳)

受访专家:陈学雷,中国科学院国家天文台研究员,主要从事暗物质、暗能量、星系大尺度结构等宇宙学研究。

次向大家介绍一个checkbox和radio美化插件checkRadio.js, 为什么只有checkbox和radio美化? 因为input文本框,按钮,文件选择我们都可以通过简单的css就可以美化,唯独checkbox复选框,radio单选框,下拉菜单,滚动条不容易美化, 下拉菜单有了 easydropdown.js 就够了 ,那么我们就只需要 checkbox和radio美化就行了。

该插件已经被用到项目中,比较不错。

插件地址

http://www.qieban.cn/p/checkRadio.js/

切版qieban.cn,靠谱、高性价比前端切图外包选择。

adio、checkbox和switch应该是一个比较常用的html标签,尤其是在中后台ERP系统里面更为常见。不过浏览器自带的样式不怎么好看,而且不同浏览器效果也不一样。出于美化和统一视觉效果的需求,自定义样式就被提出来了。

实现思路

纯css实现的主要手段是利用label标签的模拟功能。label的for属性可以关联一个具体的input元素,即使这个input本身不可被用户可见,有个与它对应的label后,用户可以直接通过和label标签交互来替代原生的input——而这给我们的样式模拟留下了空间。简而言之就是:

隐藏原生input,样式定义的过程留给label (那为什么不直接改变checkbox的样式?因为checkbox作为浏览器默认组件,样式更改上并没有label那么方便,很多属性对checkbox都是不起作用的,比如background,而label在样式上基本和div一样'任人宰割')

而在选择事件上,由于css的“相邻选择符(E+F)”的存在,让我们可以直接利用html的默认checkbox,免去了js模拟选择的麻烦。

准备知识

DEMO的部分CSS3属性只写了webkit前缀,所以建议用webkit内核的浏览器查看本页案例,当然只要你给样式补上对应的浏览器前缀,就可以实现更多样式匹配

HTML代码:

 <!-- input的id必须有,这个是label进行元素匹配所必需的 -->
 <!-- 可以看到每个input的id和label的“for”属性对应同一字符串 -->
<input type="checkbox" id="checkbox01" />
<label for="checkbox01"></label>

<input type="checkbox" id="checkbox02" />
<label for="checkbox02"></label>

<input type="checkbox" id="checkbox03" />
<label for="checkbox03"></label>

<input type="checkbox" id="checkbox04" />
<label for="checkbox04"></label>

HTML构建完成,接下来是对应的css:

/* 隐藏所有checkbox */
input[type='checkbox'] {
 display: none;
}
/* 对label进行模拟.背景图片随便拼凑的,不要吐槽品味*/
/* transition效果是做个背景切换效果,这里单纯演示而已,实际上这个过渡不加更自然*/
label {
 display: inline-block;
 width: 60px;
 height: 60px;
 position: relative;
 background: url(//www.chitanda.me/images/blank.png);
 background-position: 0 0px;
 -webkit-transition: background 0.5s linear;
}
/* 利用相邻选择符和checkbox`:checked`的状态伪类来模拟默认选中效果(就是点击后那个勾号的效果) */
/*如果这段代码注释,点击后将没有任何反馈给用户*/
/*因为label本身是没有点击后被选中的状态的,checkbox被隐藏后,这个状态只能手动模拟*/
input[type='checkbox']:checked+label {
 background-position: 0 -60px;
}

上面代码看起来好像也可以了。不过仔细想想,貌似缺了点什么:选项对应的提示文字

对css不了解的新人可能这时候第一反应就是在label后面用p标签或者span标签来添加文字。不过这种方式都不怎么优雅。个人建议用css的::before和::after伪元素(::before和:before是一个东西。不过为了把“伪元素”和“伪类”区分出来,W3C建议的写法是伪元素用::而伪类用:)

/* 伪元素的生效很简单,定义`content`就好,其余的属性和普通div一样 */
label::after {
 content: attr(data-name);
 /*利用attr可以减少css代码量,data-name写在html部分的label属性里*/
 display: inline-block;
 position: relative;
 width: 120px;
 height: 60px;
 left: 100%;
 vertical-align: middle;
 margin: 10px;
}

当然既然可以用::after模拟label的文字,那也就可以用::before模拟label的checkbox样式,这里就不做解析了。

这里提一下伪类和伪元素的区分:

1)伪类:存在的意义是为了通过选择器找到那些不存在于DOM树中的信息以及不能被常规CSS选择器获取到的信息。 伪类由一个冒号:开头,冒号后面是伪类的名称和包含在圆括号中的可选参数。

常用的伪类:

:active 向被激活的元素添加样式。 
:focus 向拥有键盘输入焦点的元素添加样式。 
:hover 当鼠标悬浮在元素上方时,向元素添加样式。 
:link 向未被访问的链接添加样式。 
:visited 向已被访问的链接添加样式。 
:first-child 向元素的第一个子元素添加样式。 
:checked 向选中的控件元素添加样式

2)伪元素:伪元素在DOM树中创建了一些抽象元素,这些抽象元素是不存在于文档语言里的(可以理解为html源码);

注意: css3为了区分伪类和伪元素,规定伪类前面有一个冒号,伪元素前面有两个冒号

常用伪元素:

关于伪元素的讲解,可以参考CSS伪类与伪元素总是傻傻分不清,这份总结够面试用了

::before 为作用元素的第一个子节点插入dom中
::after 为作用元素的最后一个子节点插入dom中
  • 同:都是通过选择器为元素添加样式
  • 异:伪元素会创建一个元素,但不是真正的Html元素,伪类相当于为一个元素创建一个class样式

实例

自定义radio

html代码:

<input type="radio" id="radio">
<label for="radio"></label>

css代码:

input{
 display:none;
}
label {
 display: inline-block;
 width: 30px;
 height: 30px;
 border: 1px solid #333;
 border-radius: 50%;
 position: relative;
}
label::after {
 -webkit-transition: all .5s ease;
 -moz-transition: all .5s ease;
 -o-transition: all .5s ease;
 -ms-transition: all .5s ease;
 transition: all .5s ease;
 cursor: pointer;
 position: absolute;
 width: 16px;
 height: 16px;
 border-radius: 50%;
 top: 50%;
 left: 50%;
 margin-top:-8px;
 margin-left:-8px;
 z-index: 1;
 content: '';
 border:1px solid #333;
}
input:checked+label::after{
 background:red;
}

实现效果:

点击前和点击后:

自定义checkbox

漂亮的checkbox长这样的,看着就很可爱

我们可以不追求那么完美的样式,可以实现下面简单好看的样式就可以

html代码:

<input type="checkbox" id="checkbox">
<label for="checkbox"></label>

css代码:

input{
 display:none;
}
label {
 display: inline-block;
 width: 30px;
 height: 30px;
 border: 1px solid #333;
 position: relative;
}
label::after {
 -webkit-transition: opacity .5s ease;
 -moz-transition: opacity .5s ease;
 -o-transition: opacity .5s ease;
 -ms-transition: opacity .5s ease;
 transition: opacity .5s ease;
 cursor: pointer;
 position: absolute;
 content: '';
 opacity: 0;
}
input:checked+label::after{
 border: 2px solid #d73d32;
 border-top: none;
 border-right: none;
 -webkit-transform: rotate(-45deg);
 -ms-transform: rotate(-45deg);
 transform: rotate(-45deg);
 width:20px;
 height:10px;
 top:50%;
 margin-top:-8px;
 left:50%;
 margin-left:-10px;
 opacity: 1.0;
}

实现效果:

点击前和点击后:

自定义switch

继续分享一个iOS风格的switch开关按钮,样子也非常常见,如图:

主要是使用了<input ?type="checkbox">来模拟实现,具体的HTML:

html 代码:

<label><input class="mui-switch" type="checkbox"> 默认未选中</label>

<label><input class="mui-switch" type="checkbox" checked> 默认选中</label>

<label><input class="mui-switch mui-switch-animbg" type="checkbox"> 默认未选中,简单的背景过渡效果,加mui-switch-animbg类即可</label>

<label><input class="mui-switch mui-switch-animbg" type="checkbox" checked> 默认选中</label>

<label><input class="mui-switch mui-switch-anim" type="checkbox"> 默认未选中,过渡效果,加 mui-switch-anim
类即可</label>

<label><input class="mui-switch mui-switch-anim" type="checkbox" checked> 默认选中</label>

在实际的使用中后来又增加了两个过渡效果,分别加?mui-switch-animbg和mui-switch-anim?类即可,具体效果查看下面的demo页面。

CSS代码(SCSS导出的,排版有些奇怪):

css 代码:

剩下部分

这里给出具体的css,方便大家复制本地实现

<style>
 .mui-switch {
 width: 52px;
 height: 31px;
 position: relative;
 border: 1px solid #dfdfdf;
 background-color: #fdfdfd;
 box-shadow: #dfdfdf 0 0 0 0 inset;
 border-radius: 20px;
 border-top-left-radius: 20px;
 border-top-right-radius: 20px;
 border-bottom-left-radius: 20px;
 border-bottom-right-radius: 20px;
 background-clip: content-box;
 display: inline-block;
 -webkit-appearance: none;
 user-select: none;
 outline: none;
 }
 .mui-switch:before {
 content: '';
 width: 29px;
 height: 29px;
 position: absolute;
 top: 0px;
 left: 0;
 border-radius: 20px;
 border-top-left-radius: 20px;
 border-top-right-radius: 20px;
 border-bottom-left-radius: 20px;
 border-bottom-right-radius: 20px;
 background-color: #fff;
 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
 }
 .mui-switch:checked {
 border-color: #64bd63;
 box-shadow: #64bd63 0 0 0 16px inset;
 background-color: #64bd63;
 }
 .mui-switch:checked:before {
 left: 21px;
 }
 .mui-switch.mui-switch-animbg {
 transition: background-color ease 0.4s;
 }
 .mui-switch.mui-switch-animbg:before {
 transition: left 0.3s;
 }
 .mui-switch.mui-switch-animbg:checked {
 box-shadow: #dfdfdf 0 0 0 0 inset;
 background-color: #64bd63;
 transition: border-color 0.4s, background-color ease 0.4s;
 }
 .mui-switch.mui-switch-animbg:checked:before {
 transition: left 0.3s;
 }
 .mui-switch.mui-switch-anim {
 transition: border cubic-bezier(0, 0, 0, 1) 0.4s, box-shadow cubic-bezier(0, 0, 0, 1) 0.4s;
 }
 .mui-switch.mui-switch-anim:before {
 transition: left 0.3s;
 }
 .mui-switch.mui-switch-anim:checked {
 box-shadow: #64bd63 0 0 0 16px inset;
 background-color: #64bd63;
 transition: border ease 0.4s, box-shadow ease 0.4s, background-color ease 1.2s;
 }
 .mui-switch.mui-switch-anim:checked:before {
 transition: left 0.3s;
 }
 /*# sourceMappingURL=mui-switch.css.map */
</style>

如果你喜欢scss,那么代码更加简洁

@mixin borderRadius($radius:20px) {
 border-radius: $radius;
 border-top-left-radius: $radius;
 border-top-right-radius: $radius;
 border-bottom-left-radius: $radius;
 border-bottom-right-radius: $radius;
 }
 $duration: .4s;
 $checkedColor: #64bd63;
 .mui-switch {
 width: 52px;
 height: 31px;
 position: relative;
 border: 1px solid #dfdfdf;
 background-color: #fdfdfd;
 box-shadow: #dfdfdf 0 0 0 0 inset;
 @include borderRadius();
 background-clip: content-box;
 display: inline-block;
 -webkit-appearance: none;
 user-select: none;
 outline: none;
 &:before {
 content: '';
 width: 29px;
 height: 29px;
 position: absolute;
 top: 0px;
 left: 0;
 @include borderRadius();
 background-color: #fff;
 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
 }
 &:checked {
 border-color: $checkedColor;
 box-shadow: $checkedColor 0 0 0 16px inset;
 background-color: $checkedColor;
 &:before {
 left: 21px;
 }
 }
 &.mui-switch-animbg {
 transition: background-color ease $duration;
 &:before {
 transition: left 0.3s;
 }
 &:checked {
 box-shadow: #dfdfdf 0 0 0 0 inset;
 background-color: $checkedColor;
 transition: border-color $duration, background-color ease $duration;
 &:before {
 transition: left 0.3s;
 }
 }
 }
 &.mui-switch-anim {
 transition: border cubic-bezier(0, 0, 0, 1) $duration, box-shadow cubic-bezier(0, 0, 0, 1) $duration;
 &:before {
 transition: left 0.3s;
 }
 &:checked {
 box-shadow: $checkedColor 0 0 0 16px inset;
 background-color: $checkedColor;
 transition: border ease $duration, box-shadow ease $duration, background-color ease $duration*3;
 &:before {
 transition: left 0.3s;
 }
 }
 }
 }

链接文章

https://www.html.cn/archives/9274

https://segmentfault.com/a/1190000003711140