开发者

Is it possible to have a non-rectangular div?

开发者 https://www.devze.com 2023-03-14 14:08 出处:网络
I need to shape ONE div tag in the following shape: Is it possible to make it cross browser? I don\'t necessarily need rounded corners. I need it so I can change the color of the borders of the 开发

I need to shape ONE div tag in the following shape:

Is it possible to have a non-rectangular div?

Is it possible to make it cross browser? I don't necessarily need rounded corners. I need it so I can change the color of the borders of the 开发者_高级运维whole div on hover, so I assume it can't be achieved by using two divs.


Yeah, you can do that using HTML and CSS like this: http://jsfiddle.net/broofa/364Eq/

It's essentially using three divs to aggregate the mouse events, like so:

<div id="outer">
  <div class="inner"></div>
  <div class="inner"></div>
</div>

And I use a :hover rule on the outer element to affect the border colors on the inner divs:

#outer .inner {border-color: red}
#outer:hover .inner {border-color: blue}

The only quirk with this markup is that the content area - the area you drew in your image - is that it's two divs, not one. So text won't wrap and flow the way you might expect. Also, this may not work so well on older (IE6-7) browsers. But FF, Chrome, Safari, Opera should probably be okay.


A one div solution using pseudo elements:

/* relevant styles for shape */
.tab {
  border-top-left-radius: 0px;
  margin-left: 100px;
}

.tab:before {
  content:"";
  display: block;
  position: relative;
  height: 50px;
  width: 50px;
  right: 52px; /* width + border width */
  top: -2px;
  background-color: white;
  border: inherit;
  border-right-width: 0px;
  border-top-left-radius: 5px;
  border-bottom-left-radius: 5px;
}

/* styles to look like example */
div{
  box-sizing: border-box;
  background-color: white;
  border: 2px solid red;
  height: 100px;
  width: 200px;
  border-radius: 5px;
}

div:hover {
  border-color: green;
}
<div class="tab"></div>


See this jsFiddle example:

<div id="main">    
    <div id="div1" class="border">
        &nbsp;
    </div>
    <div id="div2" class="border">
        &nbsp;
    </div>
</div>


You can either use a map or use 2 divs and alter the borders so it looks like one shape.


two options that I can think of:

1) give the div a background image and use CSS pseudo class :hover to change the background image to one that indicates a hover state

2) put three div's inside a wrapper, and position them so so you have one in the upper left hand corner, and then two stacked on top of each other, so that you can simulate the top half of a larger div missing the upper left half border. I don't think CSS alonw can target all the divs in order to change their borders, so will probably have to use JS to execute the hover behavior, by applying an event handler to all three divs.


No. Divs are ALWAYS rectangular. You could fake it in a number of ways (using a background image would be one option).

As for using two DIVs, sure you could. The hover could be done with CSS3 and child selectors of a parent div or you could JavaScript to change the class of both divs when hovering over either one of them.


Definitely requires two or three div's unless you use a background image

Here's a three-div solution

http://jsfiddle.net/pxfunc/SUuF6/

Its cross-browser compatible. The hover won't work in IE6, but it will in IE7+. The rounded corners will show based on browser support

HTML:

<div id="fancyShape">
    <div id="main">&lt;div&gt;</div>
    <div id="panHandle"></div>
</div>

CSS:

#fancyShape {position:relative;width:504px;height:304px;}

#main {
    margin-left:100px;
    width:400px;
    height:300px;
    border:solid 2px #000;
    border-radius:0 15px 15px 15px;

}
#panHandle {
    width:100px;
    height:120px;
    position:absolute;
    top:0;left:0;
    border-top:solid 2px #000;
    border-left:solid 2px #000;
    border-bottom:solid 2px #000;
    border-radius:15px 0 0 15px;
}

/* hover effect */
#fancyShape div {background-color:#fff;}
#fancyShape:hover div {background-color:#ff0;border-color:red;}


Perhaps you could use Border-radius along with 2 or 3 div's to get the look you want. The only issue then is it's not supported in all browsers.


Use multiple divs, as others have suggested.

http://jsfiddle.net/thomas4g/7B5MA/14/

Keep in mind that it'll be very hard to flow content in this.


 <!DOCTYPE HTML>
 <html>
 <head>

 <style>
 html{height: 100%; width: 100%;}
 body{height: 100%; width: 100%;}

 #wrapper{
 position: relative;
 top: 50px;
 right: 25%;
 width: 565px;
 height: 440px;
 margin: 0 auto;
 padding: 0px;
 }
 #left{
 position: absolute;
 width: 100px;
 height: 50px;
 border: 2px solid black;
 border-right: none;
 -moz-border-radius-bottomleft: 10px; 
 border-bottom-left-radius: 10px;
 -moz-border-radius-topleft: 10px;
 border-top-left-radius: 10px;
 background-color: #ffffff;
 }
 #right{
 position: absolute;
 left: 100px;
 width: 440px;
 height: 440px;
 border: 2px solid black;
 -moz-border-radius: 10px;
 -moz-border-radius-topleft: 0px;
 border-top-left-radius: 0px;
 border-radius: 10px;
 padding-left: 25px;
 }
 </style>


 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js">    </script>
 <script type="text/javascript">
  $(document).ready(function(){
  $('#wrapper').hover(
   function () {
  $(this).children('#left').css({'border':'2px solid red', 'border-right':'none'});
  $(this).children('#right').css({'border':'2px solid red'});
  }, 
  function () {
  $(this).children('#left').css({'border':'2px solid black', 'border-right':'none'});
  $(this).children('#right').css({'border':'2px solid black'});
 });
 });
 </script>

 </head>
 <body>

 <div id="wrapper">
 <div id="right">Some content here</div>
 <div id = "left"></div>
 </div>

 </body>
 </html>

You can use CSSPIE for rounded orners for IE

0

精彩评论

暂无评论...
验证码 换一张
取 消