【问题标题】:CSS- ckeck and add right arrow where li has ulCSS-检查并在 li 有 ul 的地方添加右箭头
【发布时间】:2017-12-29 17:13:56
【问题描述】:

我想在 ul 有 ul 孩子的地方添加 css 右箭头?下面是三角形右css。我想在我的菜单中添加,以便用户知道这个菜单有子菜单。

如何在纯 css 中检测 li 是否有 ul.children 的子级?

我想在我的 css 中添加下面的三角右箭头。请帮忙。

菜单的php代码:

<?php
$stmt = $pdo->query('SELECT * FROM `category` where `parent_id` = 0');
$stmt->execute();
?>

<ul class="top-level-menu">
    <?php while($menu1 = $stmt->fetch()){ ?>
        <li><a href="<?php echo $menu1['category_link'] . "\n"; ?>"><?php echo $menu1['product'] . "\n"; ?></a>

            <?php   $stmt1 = $pdo->prepare('SELECT * FROM category WHERE parent_id = ?');
                    $stmt1->execute([$menu1['id']]);
                    ?>
                    <ul class="second-level-menu">
                        <?php while($menu2 = $stmt1->fetch()){ ?>
                        <li><a href="<?php echo $menu2['category_link'] . "\n"; ?>"><?php echo $menu2['product'] . "\n"; ?></a>
                                    <?php
                                    $stmt2 = $pdo->prepare('SELECT * FROM category WHERE parent_id = ?');
                                    $stmt2->execute([$menu2['id']]);
                                    ?>
                                <ul class="third-level-menu">
                                    <?php while($menu3 = $stmt2->fetch()){ ?>
                                   <li><a href="<?php echo $menu3['category_link'] . "\n"; ?>"><?php echo $menu3['product'] . "\n"; ?></a>
                                   </li>
                                   <?php } ?>
                                </ul>

                        </li>

                        <?php } ?>
                    </ul>


        </li>
<?php } ?>
</ul>

菜单栏的css

<style>
/* Menu Styles */

.third-level-menu
{
    position: absolute;
    top: 0;
    right: -220px;
    width: 220px;
    list-style: none;
    padding: 0;
    margin: 0;
    display: none;
}

.third-level-menu > li
{
    height: 30px;
    background: #999999;
}
.third-level-menu > li:hover { background: #CCCCCC; }

.second-level-menu
{
    position: absolute;
    top: 30px;
    left: 0;
    width: 200px;
    list-style: none;
    padding: 0;
    margin: 0;
    display: none;
}

.second-level-menu > li
{
    position: relative;
    height: 30px;
    background: #999999;
}
.second-level-menu > li:hover { background: #CCCCCC; }

.top-level-menu
{
    list-style: none;
    padding: 0;
    margin: 0;
}

.top-level-menu > li
{
    position: relative;
    float: left;
    height: 30px;
    width: 100px;
    background: #999999;
}
.top-level-menu > li:hover { background: #CCCCCC; }

.top-level-menu li:hover > ul
{
    /* On hover, display the next level's menu */
    display: inline;
}


/* Menu Link Styles */

.top-level-menu a /* Apply to all links inside the multi-level menu */
{
    font: bold 14px Arial, Helvetica, sans-serif;
    color: #FFFFFF;
    text-decoration: none;
    padding: 0 0 0 10px;

    /* Make the link cover the entire list item-container */
    display: block;
    line-height: 30px;
}
.top-level-menu a:hover { color: #000000; }
</style>

检查我的菜单中没有箭头的地方 li 有 ul

【问题讨论】:

标签: php jquery html css drop-down-menu


【解决方案1】:

所以在 CSS 中实际上没有父选择器,但是正如您使用 jQuery 标记的那样,我们可以使用 :has() 选择器来执行几乎相同的行为。基本上,如果一个 LI el 包含一个 UL,我们应该假设 UL 是一个子菜单,我会将“js-has-a-submenu”类添加到我们用于菜单项的锚 el 中。我在它前面加上了 'js-' 只是为了反映它不是一个静态应用的类,而是一个我们只能通过 js 使用的类。

这里的代码实际上取自我在评论中引用的菜单示例,但后来我注意到他们将向下箭头硬编码到菜单中,这真的破坏了你想要做的事情,据我了解。所以我删除了向下箭头,并使用 jQuery 来应用该类。要了解菜单本身,请阅读 this,因为我认为它做得很好(不是粉红色的粉丝,而是它的 css)。

$("li:has(ul)").find("a:eq(0)").addClass("js-has-a-submenu");
body {
  background: #333;
}

.clearfix:after {
  display: block;
  clear: both;
}


/*----- Menu Outline -----*/

.menu-wrap {
  width: 100%;
  box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2);
  background: #3e3436;
}

.menu {
  width: 1000px;
  margin: 0px auto;
}

.menu li {
  margin: 0px;
  list-style: none;
  font-family: 'Ek Mukta';
}

.menu a {
  text-decoration:none;
  transition: all linear 0.15s;
  color: #919191;
}

.menu li:hover > a,
.menu .current-item > a {
  text-decoration: none;
  color: #be5b70;
}

.menu .arrow {
  font-size: 11px;
  line-height: 0%;
}


/*----- Top Level -----*/

.menu > ul > li {
  float: left;
  display: inline-block;
  position: relative;
  font-size: 19px;
}

.menu > ul > li > a {
  padding: 10px 40px;
  display: inline-block;
  text-shadow: 0px 1px 0px rgba(0, 0, 0, 0.4);
}

.menu > ul > li:hover > a,
.menu > ul > .current-item > a {
  background: #2e2728;
}


/*----- Bottom Level -----*/

.menu li:hover .sub-menu {
  z-index: 1;
  opacity: 1;
}

.sub-menu {
  width: 160%;
  padding: 5px 0px;
  position: absolute;
  top: 100%;
  left: 0px;
  z-index: -1;
  opacity: 0;
  transition: opacity linear 0.15s;
  box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.2);
  background: #2e2728;
}

.sub-menu li {
  display: block;
  font-size: 16px;
}

.sub-menu li a {
  padding: 10px 30px;
  display: block;
}

.sub-menu li a:hover,
.sub-menu .current-item a {
  background: #3e3436;
}

.js-has-a-submenu::after {
     content: " \2193";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="menu-wrap">
  <nav class="menu">
    <ul class="clearfix">
      <li><a href="#">Home</a></li>
      <li>
        <a href="#">Movies </a>

        <ul class="sub-menu">
          <li><a href="#">In Cinemas Now</a></li>
          <li><a href="#">Coming Soon</a></li>
          <li><a href="#">On DVD/Blu-ray</a></li>
          <li><a href="#">Showtimes &amp; Tickets</a></li>
        </ul>
      </li>
      <li><a href="#">T.V. Shows</a></li>
      <li><a href="#">Photos</a></li>
      <li><a href="#">Site Help</a></li>
    </ul>
  </nav>
</div>

【讨论】:

    【解决方案2】:

    如果你不隐藏 ul 而是隐藏 li 怎么办? 然后你可以使用 ::before 让 css 在你的 ul 之前插入一个小箭头。

    请看我的小提琴https://jsfiddle.net/dL758uba/

    /* Menu Styles */
    
    ul {display: inline;}
    
    ul.third-level-menu::before {
    content: '-';
    position: relative;
    left: -200px;
    top: 10px;
    }
    
    ul::before {
    content: '-';
    position: relative;
    left: 0px;
    top: -20px;
    }
    
    .third-level-menu
    {
        position: absolute;
        top: 0;
        right: -220px;
        width: 220px;
        list-style: none;
        padding: 0;
        margin: 0;
    
    }
    
    .third-level-menu > li
    {
        height: 30px;
        background: #999999;
        display: none;
    }
    .third-level-menu > li:hover { background: #CCCCCC; }
    
    .second-level-menu
    {
        position: absolute;
        top: 30px;
        left: 0;
        width: 200px;
        list-style: none;
        padding: 0;
        margin: 0;
    
    }
    
    .second-level-menu > li
    {
        position: relative;
        height: 30px;
        background: #999999;
        display: none;
    }
    .second-level-menu > li:hover { background: #CCCCCC; }
    
    .top-level-menu
    {
        list-style: none;
        padding: 0;
        margin: 0;
    }
    
    .top-level-menu > li
    {
        position: relative;
        float: left;
        height: 30px;
        width: 100px;
        background: #999999;
    }
    .top-level-menu > li:hover { background: #CCCCCC; }
    
    .top-level-menu li:hover > ul >li
    {
        /* On hover, display the next level's menu */
        display: block;
    }
    
    
    /* Menu Link Styles */
    
    .top-level-menu a /* Apply to all links inside the multi-level menu */
    {
        font: bold 14px Arial, Helvetica, sans-serif;
        color: #FFFFFF;
        text-decoration: none;
        padding: 0 0 0 10px;
    
        /* Make the link cover the entire list item-container */
        display: block;
        line-height: 30px;
    }
    .top-level-menu a:hover { color: #000000; }
    

    这有点粗糙,但我认为它会帮助你朝着正确的方向前进。

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多