将边框分割成多个部分?

7
有没有一种方法可以在CSS中将边框分成几个部分?所以在这个链接中,我有一个边框。但是,如何让它不是单一的颜色,而像这个,但宽度由JS设置。选择三种颜色。然后JS会获取宽度,宽度将为33%,然后CSS将为每个颜色设置颜色。有什么想法吗?
所以就像这样:
top{
border-top: 4px solid blue;
}

然后改变宽度并使用多种颜色


你可以尝试使用与第二个示例链接中相同的渐变和border-image,虽然我不确定规范是否允许这样做(而且现在懒得研究)。另一种选择是完全按照该示例使用它 - 只需在要具有此顶部边框的元素顶部放置一个生成的内容伪元素,以便无需将额外元素插入到标记中。 - CBroe
我为你构建了一个演示,所有内容都在我的回答中。 - Ian
4个回答

1
你好,有三种可能的解决方案,我喜欢并在我的项目中使用的是使用彩色条纹,并使用CSS的"repeat-x"。它非常好用。 enter image description here

第二种解决方案是使用CSS3渐变,但由于跨浏览器兼容性问题,特别是IE,我不建议这种方式。
第三种解决方案是将此颜色条纹用作Border-Image,但请记住,这可能会在旧版浏览器中出现问题。
我推荐第一种解决方案,但最终选择权在你手中。 祝你好运。

使用渐变会是什么样子? - user3537990
你可以在http://www.w3schools.com/css/css3_gradients.asp上自己看到,正如我之前所说,这只是浏览器兼容性的问题。如果你想使用渐变效果,可以自己试着玩一下。 - Kashif

0

不,我不相信这是可能的——也就是说,我不知道有一种方法可以使单个元素的边框宽度在其一侧发生变化。 但为什么不使用多个元素呢?

这个想法是把一堆 div 水平堆叠起来,然后只需针对你希望拥有不同宽度的那些元素。

这个解决方案将简单地使悬停的 div 具有 10px 厚的边框。请注意,div 之间的空格(它们都在同一行上)不存在——它们之间的空格会导致颜色线上有间隙。

您会看到,我使用了每个 div 都共有的类(border)。我另外使用了一个类来指定颜色,以及另一个类来指定默认厚度。

最后,我将屏幕宽度(100%)除以我拥有的 div 数量(4)。由于您有 8 种不同的颜色,因此您需要将宽度设置为 12.5%,而不是 25%。

<!DOCTYPE html>
<html>
<head>
<style>
.border
{
    border-top: solid 5px transparent;
    width: 25%;
    display: inline-block;
    padding: 0px;
    margin: 0px;
}
.border:hover
{
    border-top-width: 10px;
}
.thick
{
    border-top-width: 7px;
}
.thin
{
    border-top-width: 3px;
}
.red
{
    border-color: red;
}
.blue
{
    border-color: blue;
}
.yellow
{
    border-color: yellow;
}
.green
{
    border-color: green;
}
</style>
</head>
<body>
    <div class='border red thick'></div><div class='border blue thin'></div><div class='border green'></div><div class='border yellow'></div>
</body>
</html>

颜色和宽度都不是这样设置的。宽度是一个变量,可能有2种颜色,也可能有5、10甚至100种。 - user3537990
2
没错,使用JavaScript生成所需的div并不困难——无论是2个、5个、10个还是100个。你的示例使用了8个明确定义的颜色值,就像我的一样——尽管只有4个而不是8个。我怀疑你的问题没有提供你所处情况的所有限制。请随时更新你的问题以提供更全面的细节。 - enhzflep

0

看看这篇文章。他们建议使用伪元素而不是边框图像来实现与您的 HR 类似的方式 http://www.sitepoint.com/rainbow-border-with-sass/

虽然可以使用边框图像,但它的支持有限 (http://caniuse.com/border-image) 如果您对此方法感兴趣,请查看此代码笔 - http://codepen.io/samarkandiy/pen/lvrBn

这里有一些我制作的东西,向您展示它如何工作 - http://jsfiddle.net/29gPg/

.border {
    background-color: black;
    background-size: 50px 50px;
    display: inline;
    float: left;
    margin: 15px;
    position: relative;
    border-width: 20px;
    width: 160px;
    height: 160px;
}

.border {
    border-image: linear-gradient(90deg,   
        #9b59b6 0%, 
        #9b59b6 25%, 
        #34495e 25%, 
        #34495e 50%, 
        #f1c40f 50%, 
        #f1c40f 75%, 
        #e67e22 75%
    ) 2%;
    border-top-width: 10px;
    border-bottom: 0px;
    border-left: 0px;
    border-right: 0px;
}

最后一点,如果你打算使用CSS来动态修改边框,那么CSS必须是内联的,否则你将需要预先制作一系列的CSS渐变边框图片,然后通过类名应用它们。 编辑 - 这里使用了border-image, 但只在WebKit中有效(可能ie11也行,但没有测试过)
这个问题引起了我的兴趣,所以我进一步使用JSFiddle演示进行了探索。http://jsfiddle.net/K2FEm/5/ 编辑 2 好吧,看起来FF根本不支持border-image,至少不能使用这里演示的渐变样式 - http://css-tricks.com/examples/GradientBorder/

然而,有一个技巧可以使用,那就是使用相同的渐变(这次使用正确的浏览器前缀)作为背景图像并将其正确定位。您可以在下面的fiddle中查看结果,如果要设置各种颜色,则必须编写JS / JQuery脚本以动态构建渐变,然后将其应用于元素内联,或者像我一样制作预先确定的类,然后可以随意应用它们(这通常是出于速度和内存原因的首选方法,但出于灵活性考虑,您可能需要选择第一种选项)。

我手动构建了我的第一个渐变,然后使用http://www.colorzilla.com/gradient-editor/获取了所有浏览器前缀(这是我经常使用的一个很棒的工具)。

演示


真的吗?看看我在页面底部构建的演示,你可以轻松地看到如何实现你想要做的事情。 - Ian
它绝对是有效的,请确保您在兼容的浏览器中查看它(即Chrome,FF,ie11,Safari)。 - Ian
好的,我已经更新了我的演示,使其与ie10及以上版本的浏览器兼容。如果您希望它在早期版本的浏览器中运行,您将不得不使用多个元素(我仍然认为这可能是目前最简单和最灵活的方法)。 - Ian

0
  1. 根据章节数量创建相应数量的“span”元素
  2. 根据章节数量设置每个“span”的宽度
  3. 为每个章节设置随机背景颜色
  4. 将它们添加到目标div中

HTML:

<div id="box"></div>

CSS:

#box {
  background-color: black;
  margin: 15px;
  position: relative;
  width: 90%;
  height: 40px;
  padding: 0;
}
.border_section{
  height: 4px;
  display: block;
  float: left;
}

JavaScript:

var sections = Math.ceil(Math.random()*20);
var target_div = document.getElementById('box');
var target_width = target_div.offsetWidth;
var sec_width = Math.ceil(target_width/sections);
for(i=0;i<sections;i++){
  if(i == sections-1){
    sec_width = target_width - ((sections-1)*sec_width)-1;
  }
  var borderSection=document.createElement("span");
  borderSection.className = "border_section";
  borderSection.style.backgroundColor = '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6);
  borderSection.style.width = sec_width+'px';
  target_div.appendChild(borderSection);
}

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接